Compare commits
134 Commits
feat/hide-
...
v1.31.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd5d2698a6 | ||
|
|
c5e59616fa | ||
|
|
76a7ceb758 | ||
|
|
9688acaa87 | ||
|
|
15e246929b | ||
|
|
07ec3efbca | ||
|
|
64aab6dd82 | ||
|
|
144bb84bdc | ||
|
|
76260f9b22 | ||
|
|
500cd1f872 | ||
|
|
fc79fdabf4 | ||
|
|
7dd683c3d8 | ||
|
|
bfe56c3470 | ||
|
|
1dfa9431a9 | ||
|
|
f5c2fc1c20 | ||
|
|
21d20fdfd6 | ||
|
|
cf96db90ad | ||
|
|
430b1ab871 | ||
|
|
7404d68143 | ||
|
|
4a5421a9ba | ||
|
|
24b9c00b2a | ||
|
|
16cb53f703 | ||
|
|
407af32d32 | ||
|
|
5c01313cc4 | ||
|
|
d8da5cbe9d | ||
|
|
3d458dd2fd | ||
|
|
e486623310 | ||
|
|
f20ba3fc2e | ||
|
|
30141f76e0 | ||
|
|
87825a0e05 | ||
|
|
99fc9a2da0 | ||
|
|
611ceeb5f4 | ||
|
|
14280c5437 | ||
|
|
867286996b | ||
|
|
03d5e56678 | ||
|
|
410ad0d4b4 | ||
|
|
23f93e311d | ||
|
|
2950cf4438 | ||
|
|
dbdecb1e0a | ||
|
|
833f52de56 | ||
|
|
5125abdbf0 | ||
|
|
724f8bb538 | ||
|
|
512f6e51e4 | ||
|
|
1b36dded3f | ||
|
|
77511bf199 | ||
|
|
26d77af3a4 | ||
|
|
2b111f1c34 | ||
|
|
a6392cb2db | ||
|
|
6d55b50e5e | ||
|
|
f7dc6256ba | ||
|
|
f1df1caea5 | ||
|
|
d23c120dc0 | ||
|
|
353efa39d0 | ||
|
|
21cdf7d113 | ||
|
|
f858f025fe | ||
|
|
c92bb134d4 | ||
|
|
7e0e2a92e3 | ||
|
|
e840489e57 | ||
|
|
800f4668ec | ||
|
|
f2c37babeb | ||
|
|
24095eac03 | ||
|
|
8c782e0c93 | ||
|
|
08ce7f24b8 | ||
|
|
67e794aca4 | ||
|
|
c9c429d027 | ||
|
|
31ac11f4eb | ||
|
|
f072a4e11d | ||
|
|
b24c23e549 | ||
|
|
e602e9f758 | ||
|
|
afd46ebee8 | ||
|
|
be47d1e56c | ||
|
|
0e612f01f1 | ||
|
|
cd9d9ae8d2 | ||
|
|
ea2765f8c7 | ||
|
|
448e7c3a7d | ||
|
|
6ab3cd77a7 | ||
|
|
3dfbb0e0a5 | ||
|
|
726f62b9b6 | ||
|
|
81c30347f6 | ||
|
|
a397893217 | ||
|
|
12c5bbd778 | ||
|
|
06261c1118 | ||
|
|
686fe6fdf8 | ||
|
|
c80a1fa261 | ||
|
|
6167011ee5 | ||
|
|
bc399d95a0 | ||
|
|
519dd17d37 | ||
|
|
0761593411 | ||
|
|
caa45415b1 | ||
|
|
ed297d9d6c | ||
|
|
c6486c3643 | ||
|
|
f9695068a8 | ||
|
|
fd90adba4d | ||
|
|
970aa612fe | ||
|
|
71169944dc | ||
|
|
d77f9eb44e | ||
|
|
22f2037ea6 | ||
|
|
2cdf755c20 | ||
|
|
f99ab47c01 | ||
|
|
7e4175ff21 | ||
|
|
4157432aa7 | ||
|
|
741b2c4e9f | ||
|
|
6dbe9ea814 | ||
|
|
96328ab5c6 | ||
|
|
c31709681a | ||
|
|
0a3d7c5915 | ||
|
|
912c63e562 | ||
|
|
077513151e | ||
|
|
191f39e8bd | ||
|
|
048b6c1d90 | ||
|
|
a6a065ac0b | ||
|
|
abb0b2d763 | ||
|
|
d2668d3f49 | ||
|
|
bee6eb288f | ||
|
|
3473aed27e | ||
|
|
a9144a2167 | ||
|
|
59822d6e42 | ||
|
|
0bd1bee1fa | ||
|
|
46326f9d16 | ||
|
|
54b96cc451 | ||
|
|
7d2a187865 | ||
|
|
17df5dd072 | ||
|
|
4b48a36ad3 | ||
|
|
16bd3e9fd5 | ||
|
|
6360c82898 | ||
|
|
f1df9eeb2f | ||
|
|
a3973791fb | ||
|
|
157ab80be1 | ||
|
|
ac0f95b773 | ||
|
|
45ebfb937e | ||
|
|
85325cda7f | ||
|
|
5fc02d0d94 | ||
|
|
16902f85fb | ||
|
|
17b5a0bf9c |
@@ -737,6 +737,24 @@
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Eclipseop",
|
||||
"name": "Mackenzie",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/5846213?v=4",
|
||||
"profile": "https://github.com/Eclipseop",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "s0up4200",
|
||||
"name": "soup",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/18177310?v=4",
|
||||
"profile": "https://github.com/s0up4200",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
}
|
||||
],
|
||||
"badgeTemplate": "<a href=\"#contributors-\"><img alt=\"All Contributors\" src=\"https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg\"/></a>",
|
||||
@@ -745,5 +763,6 @@
|
||||
"projectOwner": "sct",
|
||||
"repoType": "github",
|
||||
"repoHost": "https://github.com",
|
||||
"skipCi": false
|
||||
"skipCi": false,
|
||||
"commitConvention": "angular"
|
||||
}
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -9,6 +9,8 @@ jobs:
|
||||
semantic-release:
|
||||
name: Tag and release latest version
|
||||
runs-on: ubuntu-20.04
|
||||
env:
|
||||
HUSKY: 0
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -64,3 +64,6 @@ cypress/screenshots
|
||||
|
||||
# TS Build Info
|
||||
tsconfig.tsbuildinfo
|
||||
|
||||
# Config Cache Directory
|
||||
config/cache
|
||||
|
||||
1378
CHANGELOG.md
Normal file
1378
CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
214
README.md
214
README.md
@@ -12,7 +12,7 @@
|
||||
<a href="https://lgtm.com/projects/g/sct/overseerr/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/sct/overseerr.svg?logo=lgtm&logoWidth=18"/></a>
|
||||
<a href="https://github.com/sct/overseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/sct/overseerr"></a>
|
||||
<!-- 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-80-orange.svg"/></a>
|
||||
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-82-orange.svg"/></a>
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
</p>
|
||||
|
||||
@@ -74,110 +74,114 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center"><a href="https://sct.dev"><img src="https://avatars1.githubusercontent.com/u/234213?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sct</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=sct" title="Code">💻</a> <a href="#design-sct" title="Design">🎨</a> <a href="#ideas-sct" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||
<td align="center"><a href="https://github.com/azoitos"><img src="https://avatars2.githubusercontent.com/u/26529049?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alex Zoitos</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=azoitos" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/OwsleyJr"><img src="https://avatars3.githubusercontent.com/u/8635678?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brandon Cohen</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=OwsleyJr" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=OwsleyJr" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/Ahreluth"><img src="https://avatars2.githubusercontent.com/u/75682440?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ahreluth</b></sub></a><br /><a href="#translation-Ahreluth" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/KovalevArtem"><img src="https://avatars0.githubusercontent.com/u/36500228?v=4?s=100" width="100px;" alt=""/><br /><sub><b>KovalevArtem</b></sub></a><br /><a href="#translation-KovalevArtem" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/GiyomuWeb"><img src="https://avatars0.githubusercontent.com/u/62489209?v=4?s=100" width="100px;" alt=""/><br /><sub><b>GiyomuWeb</b></sub></a><br /><a href="#translation-GiyomuWeb" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/angrycuban13"><img src="https://avatars3.githubusercontent.com/u/39564898?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Angry Cuban</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=angrycuban13" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/jvennik"><img src="https://avatars3.githubusercontent.com/u/6672637?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jvennik</b></sub></a><br /><a href="#translation-jvennik" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/darknessgp"><img src="https://avatars0.githubusercontent.com/u/1521243?v=4?s=100" width="100px;" alt=""/><br /><sub><b>darknessgp</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=darknessgp" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/saltydk"><img src="https://avatars1.githubusercontent.com/u/6587950?v=4?s=100" width="100px;" alt=""/><br /><sub><b>salty</b></sub></a><br /><a href="#infra-saltydk" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center"><a href="https://github.com/Shutruk"><img src="https://avatars2.githubusercontent.com/u/9198633?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shutruk</b></sub></a><br /><a href="#translation-Shutruk" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/krystiancharubin"><img src="https://avatars2.githubusercontent.com/u/17775600?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Krystian Charubin</b></sub></a><br /><a href="#design-krystiancharubin" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://github.com/kieron"><img src="https://avatars2.githubusercontent.com/u/8655212?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kieron Boswell</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=kieron" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/samwiseg0"><img src="https://avatars1.githubusercontent.com/u/2241731?v=4?s=100" width="100px;" alt=""/><br /><sub><b>samwiseg0</b></sub></a><br /><a href="#question-samwiseg0" title="Answering Questions">💬</a> <a href="#infra-samwiseg0" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/ecelebi29"><img src="https://avatars2.githubusercontent.com/u/8337120?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ecelebi29</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=ecelebi29" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=ecelebi29" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/mmozeiko"><img src="https://avatars3.githubusercontent.com/u/1665010?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mārtiņš Možeiko</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=mmozeiko" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/mazzetta86"><img src="https://avatars2.githubusercontent.com/u/45591560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mazzetta86</b></sub></a><br /><a href="#translation-mazzetta86" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Panzer1119"><img src="https://avatars1.githubusercontent.com/u/23016343?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Paul Hagedorn</b></sub></a><br /><a href="#translation-Panzer1119" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Shagon94"><img src="https://avatars3.githubusercontent.com/u/9140783?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shagon94</b></sub></a><br /><a href="#translation-Shagon94" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/sebstrgg"><img src="https://avatars3.githubusercontent.com/u/27026694?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sebstrgg</b></sub></a><br /><a href="#translation-sebstrgg" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/danshilm"><img src="https://avatars2.githubusercontent.com/u/20923978?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Danshil Mungur</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=danshilm" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=danshilm" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/doob187"><img src="https://avatars1.githubusercontent.com/u/60312740?v=4?s=100" width="100px;" alt=""/><br /><sub><b>doob187</b></sub></a><br /><a href="#infra-doob187" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center"><a href="https://github.com/johnpyp"><img src="https://avatars2.githubusercontent.com/u/20625636?v=4?s=100" width="100px;" alt=""/><br /><sub><b>johnpyp</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=johnpyp" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/ankarhem"><img src="https://avatars1.githubusercontent.com/u/14110063?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jakob Ankarhem</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=ankarhem" title="Documentation">📖</a> <a href="https://github.com/sct/overseerr/commits?author=ankarhem" title="Code">💻</a> <a href="#translation-ankarhem" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/jayesh100"><img src="https://avatars1.githubusercontent.com/u/8022175?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jayesh</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=jayesh100" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/flying-sausages"><img src="https://avatars1.githubusercontent.com/u/23618693?v=4?s=100" width="100px;" alt=""/><br /><sub><b>flying-sausages</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=flying-sausages" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hirenshah"><img src="https://avatars2.githubusercontent.com/u/418112?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hirenshah</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=hirenshah" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/TheCatLady"><img src="https://avatars0.githubusercontent.com/u/52870424?v=4?s=100" width="100px;" alt=""/><br /><sub><b>TheCatLady</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=TheCatLady" title="Code">💻</a> <a href="#translation-TheCatLady" title="Translation">🌍</a> <a href="https://github.com/sct/overseerr/commits?author=TheCatLady" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/chriscpritchard"><img src="https://avatars1.githubusercontent.com/u/1839074?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Pritchard</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=chriscpritchard" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=chriscpritchard" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/Tamberlox"><img src="https://avatars3.githubusercontent.com/u/56069014?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tamberlox</b></sub></a><br /><a href="#translation-Tamberlox" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://hmnd.io"><img src="https://avatars.githubusercontent.com/u/12853597?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=hmnd" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://www.douglas-parker.com"><img src="https://avatars.githubusercontent.com/u/18235822?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Douglas Parker</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=douglasparker" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/dancarter"><img src="https://avatars.githubusercontent.com/u/4387516?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Carter</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=dancarter" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://nuro.dev"><img src="https://avatars.githubusercontent.com/u/4991309?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nuro</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=NuroDev" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/onedr0p"><img src="https://avatars.githubusercontent.com/u/213795?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ᗪєνιη ᗷυнʟ</b></sub></a><br /><a href="#infra-onedr0p" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/JonnyWong16"><img src="https://avatars.githubusercontent.com/u/9099342?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JonnyWong16</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=JonnyWong16" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/Roxedus"><img src="https://avatars.githubusercontent.com/u/7110194?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Roxedus</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Roxedus" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/WoisWoi"><img src="https://avatars.githubusercontent.com/u/75491231?v=4?s=100" width="100px;" alt=""/><br /><sub><b>WoisWoi</b></sub></a><br /><a href="#translation-WoisWoi" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/HubDuck"><img src="https://avatars.githubusercontent.com/u/77843475?v=4?s=100" width="100px;" alt=""/><br /><sub><b>HubDuck</b></sub></a><br /><a href="#translation-HubDuck" title="Translation">🌍</a> <a href="https://github.com/sct/overseerr/commits?author=HubDuck" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/costaht"><img src="https://avatars.githubusercontent.com/u/50637431?v=4?s=100" width="100px;" alt=""/><br /><sub><b>costaht</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=costaht" title="Documentation">📖</a> <a href="#translation-costaht" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Shjosan"><img src="https://avatars.githubusercontent.com/u/20847626?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shjosan</b></sub></a><br /><a href="#translation-Shjosan" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/kobaubarr"><img src="https://avatars.githubusercontent.com/u/28481522?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kobaubarr</b></sub></a><br /><a href="#translation-kobaubarr" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/notorius28"><img src="https://avatars.githubusercontent.com/u/1621513?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ricardo González</b></sub></a><br /><a href="#translation-notorius28" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://torkili.uz"><img src="https://avatars.githubusercontent.com/u/460764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Torkil</b></sub></a><br /><a href="#translation-Torkiliuz" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://www.jagandeepbrar.io"><img src="https://avatars.githubusercontent.com/u/3048295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jagandeep Brar</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=JagandeepBrar" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://dtalens.com"><img src="https://avatars.githubusercontent.com/u/6631832?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dtalens</b></sub></a><br /><a href="#translation-dtalens" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/acortelyou"><img src="https://avatars.githubusercontent.com/u/1689668?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alex Cortelyou</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=acortelyou" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://nz.linkedin.com/in/jonocairns"><img src="https://avatars.githubusercontent.com/u/182836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jono Cairns</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=jonocairns" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://scias.net/"><img src="https://avatars.githubusercontent.com/u/439655?v=4?s=100" width="100px;" alt=""/><br /><sub><b>DJScias</b></sub></a><br /><a href="#translation-DJScias" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Dabu-dot"><img src="https://avatars.githubusercontent.com/u/52525576?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dabu-dot</b></sub></a><br /><a href="#translation-Dabu-dot" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Jabster28"><img src="https://avatars.githubusercontent.com/u/29015942?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jabster28</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Jabster28" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/littlerooster"><img src="https://avatars.githubusercontent.com/u/83890654?v=4?s=100" width="100px;" alt=""/><br /><sub><b>littlerooster</b></sub></a><br /><a href="#translation-littlerooster" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/dphildebrandt"><img src="https://avatars.githubusercontent.com/u/154459?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dustin Hildebrandt</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=dphildebrandt" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Generator"><img src="https://avatars.githubusercontent.com/u/44146?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bruno Guerreiro</b></sub></a><br /><a href="#translation-Generator" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/iceHtwoO"><img src="https://avatars.githubusercontent.com/u/27020492?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Neuhäuser</b></sub></a><br /><a href="#translation-iceHtwoO" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://www.unext.co.jp"><img src="https://avatars.githubusercontent.com/u/37431541?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Livio</b></sub></a><br /><a href="#design-liviokanone" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/tangentThought"><img src="https://avatars.githubusercontent.com/u/25516090?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tangentThought</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=tangentThought" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/nicospz"><img src="https://avatars.githubusercontent.com/u/31373060?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicolás Espinoza</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=nicospz" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/sootylunatic"><img src="https://avatars.githubusercontent.com/u/36486087?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sootylunatic</b></sub></a><br /><a href="#translation-sootylunatic" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/JoKerIsCraZy"><img src="https://avatars.githubusercontent.com/u/47474211?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JoKerIsCraZy</b></sub></a><br /><a href="#translation-JoKerIsCraZy" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://daddie.dev"><img src="https://avatars.githubusercontent.com/u/33762262?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daddie0</b></sub></a><br /><a href="#translation-GoByeBye" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://ungaro.me"><img src="https://avatars.githubusercontent.com/u/43807696?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Simone</b></sub></a><br /><a href="#translation-Simoneu01" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/adan89lion"><img src="https://avatars.githubusercontent.com/u/6585644?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Seohyun Joo</b></sub></a><br /><a href="#translation-adan89lion" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/ty4ko"><img src="https://avatars.githubusercontent.com/u/21213535?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sergey</b></sub></a><br /><a href="#translation-ty4ko" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/skafte1990"><img src="https://avatars.githubusercontent.com/u/31465453?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shaaft</b></sub></a><br /><a href="#translation-skafte1990" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/sr093906"><img src="https://avatars.githubusercontent.com/u/8369201?v=4?s=100" width="100px;" alt=""/><br /><sub><b>sr093906</b></sub></a><br /><a href="#translation-sr093906" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Nackophilz"><img src="https://avatars.githubusercontent.com/u/61667226?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nackophilz</b></sub></a><br /><a href="#translation-Nackophilz" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/schambers"><img src="https://avatars.githubusercontent.com/u/31563?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sean Chambers</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=schambers" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/deniscerri"><img src="https://avatars.githubusercontent.com/u/64997243?v=4?s=100" width="100px;" alt=""/><br /><sub><b>deniscerri</b></sub></a><br /><a href="#translation-deniscerri" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/tomgacz"><img src="https://avatars.githubusercontent.com/u/14138209?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tomgacz</b></sub></a><br /><a href="#translation-tomgacz" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Andersborrits"><img src="https://avatars.githubusercontent.com/u/29452218?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andersborrits</b></sub></a><br /><a href="#translation-Andersborrits" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://maxentrouault.fr"><img src="https://avatars.githubusercontent.com/u/67283154?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maxent</b></sub></a><br /><a href="#translation-Maxentr" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/sambartik"><img src="https://avatars.githubusercontent.com/u/63553146?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Samuel Bartík</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=sambartik" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/frank-cywong"><img src="https://avatars.githubusercontent.com/u/90653148?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chun Yeung Wong</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=frank-cywong" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/TheMeanCanEHdian"><img src="https://avatars.githubusercontent.com/u/16025103?v=4?s=100" width="100px;" alt=""/><br /><sub><b>TheMeanCanEHdian</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=TheMeanCanEHdian" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Gylesie"><img src="https://avatars.githubusercontent.com/u/86306812?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gylesie</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Gylesie" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Fhd-pro"><img src="https://avatars.githubusercontent.com/u/82862079?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fhd-pro</b></sub></a><br /><a href="#translation-Fhd-pro" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/PovilasID"><img src="https://avatars.githubusercontent.com/u/396243?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PovilasID</b></sub></a><br /><a href="#translation-PovilasID" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/byakurau"><img src="https://avatars.githubusercontent.com/u/1811683?v=4?s=100" width="100px;" alt=""/><br /><sub><b>byakurau</b></sub></a><br /><a href="#translation-byakurau" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/miknii"><img src="https://avatars.githubusercontent.com/u/109232569?v=4?s=100" width="100px;" alt=""/><br /><sub><b>miknii</b></sub></a><br /><a href="#translation-miknii" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center"><a href="https://sct.dev"><img src="https://avatars1.githubusercontent.com/u/234213?v=4?s=100" width="100px;" alt="sct"/><br /><sub><b>sct</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=sct" title="Code">💻</a> <a href="#design-sct" title="Design">🎨</a> <a href="#ideas-sct" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||
<td align="center"><a href="https://github.com/azoitos"><img src="https://avatars2.githubusercontent.com/u/26529049?v=4?s=100" width="100px;" alt="Alex Zoitos"/><br /><sub><b>Alex Zoitos</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=azoitos" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/OwsleyJr"><img src="https://avatars3.githubusercontent.com/u/8635678?v=4?s=100" width="100px;" alt="Brandon Cohen"/><br /><sub><b>Brandon Cohen</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=OwsleyJr" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=OwsleyJr" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/Ahreluth"><img src="https://avatars2.githubusercontent.com/u/75682440?v=4?s=100" width="100px;" alt="Ahreluth"/><br /><sub><b>Ahreluth</b></sub></a><br /><a href="#translation-Ahreluth" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/KovalevArtem"><img src="https://avatars0.githubusercontent.com/u/36500228?v=4?s=100" width="100px;" alt="KovalevArtem"/><br /><sub><b>KovalevArtem</b></sub></a><br /><a href="#translation-KovalevArtem" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/GiyomuWeb"><img src="https://avatars0.githubusercontent.com/u/62489209?v=4?s=100" width="100px;" alt="GiyomuWeb"/><br /><sub><b>GiyomuWeb</b></sub></a><br /><a href="#translation-GiyomuWeb" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/angrycuban13"><img src="https://avatars3.githubusercontent.com/u/39564898?v=4?s=100" width="100px;" alt="Angry Cuban"/><br /><sub><b>Angry Cuban</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=angrycuban13" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/jvennik"><img src="https://avatars3.githubusercontent.com/u/6672637?v=4?s=100" width="100px;" alt="jvennik"/><br /><sub><b>jvennik</b></sub></a><br /><a href="#translation-jvennik" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/darknessgp"><img src="https://avatars0.githubusercontent.com/u/1521243?v=4?s=100" width="100px;" alt="darknessgp"/><br /><sub><b>darknessgp</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=darknessgp" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/saltydk"><img src="https://avatars1.githubusercontent.com/u/6587950?v=4?s=100" width="100px;" alt="salty"/><br /><sub><b>salty</b></sub></a><br /><a href="#infra-saltydk" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center"><a href="https://github.com/Shutruk"><img src="https://avatars2.githubusercontent.com/u/9198633?v=4?s=100" width="100px;" alt="Shutruk"/><br /><sub><b>Shutruk</b></sub></a><br /><a href="#translation-Shutruk" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/krystiancharubin"><img src="https://avatars2.githubusercontent.com/u/17775600?v=4?s=100" width="100px;" alt="Krystian Charubin"/><br /><sub><b>Krystian Charubin</b></sub></a><br /><a href="#design-krystiancharubin" title="Design">🎨</a></td>
|
||||
<td align="center"><a href="https://github.com/kieron"><img src="https://avatars2.githubusercontent.com/u/8655212?v=4?s=100" width="100px;" alt="Kieron Boswell"/><br /><sub><b>Kieron Boswell</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=kieron" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/samwiseg0"><img src="https://avatars1.githubusercontent.com/u/2241731?v=4?s=100" width="100px;" alt="samwiseg0"/><br /><sub><b>samwiseg0</b></sub></a><br /><a href="#question-samwiseg0" title="Answering Questions">💬</a> <a href="#infra-samwiseg0" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/ecelebi29"><img src="https://avatars2.githubusercontent.com/u/8337120?v=4?s=100" width="100px;" alt="ecelebi29"/><br /><sub><b>ecelebi29</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=ecelebi29" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=ecelebi29" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/mmozeiko"><img src="https://avatars3.githubusercontent.com/u/1665010?v=4?s=100" width="100px;" alt="Mārtiņš Možeiko"/><br /><sub><b>Mārtiņš Možeiko</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=mmozeiko" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/mazzetta86"><img src="https://avatars2.githubusercontent.com/u/45591560?v=4?s=100" width="100px;" alt="mazzetta86"/><br /><sub><b>mazzetta86</b></sub></a><br /><a href="#translation-mazzetta86" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Panzer1119"><img src="https://avatars1.githubusercontent.com/u/23016343?v=4?s=100" width="100px;" alt="Paul Hagedorn"/><br /><sub><b>Paul Hagedorn</b></sub></a><br /><a href="#translation-Panzer1119" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Shagon94"><img src="https://avatars3.githubusercontent.com/u/9140783?v=4?s=100" width="100px;" alt="Shagon94"/><br /><sub><b>Shagon94</b></sub></a><br /><a href="#translation-Shagon94" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/sebstrgg"><img src="https://avatars3.githubusercontent.com/u/27026694?v=4?s=100" width="100px;" alt="sebstrgg"/><br /><sub><b>sebstrgg</b></sub></a><br /><a href="#translation-sebstrgg" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/danshilm"><img src="https://avatars2.githubusercontent.com/u/20923978?v=4?s=100" width="100px;" alt="Danshil Mungur"/><br /><sub><b>Danshil Mungur</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=danshilm" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=danshilm" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/doob187"><img src="https://avatars1.githubusercontent.com/u/60312740?v=4?s=100" width="100px;" alt="doob187"/><br /><sub><b>doob187</b></sub></a><br /><a href="#infra-doob187" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
<td align="center"><a href="https://github.com/johnpyp"><img src="https://avatars2.githubusercontent.com/u/20625636?v=4?s=100" width="100px;" alt="johnpyp"/><br /><sub><b>johnpyp</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=johnpyp" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/ankarhem"><img src="https://avatars1.githubusercontent.com/u/14110063?v=4?s=100" width="100px;" alt="Jakob Ankarhem"/><br /><sub><b>Jakob Ankarhem</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=ankarhem" title="Documentation">📖</a> <a href="https://github.com/sct/overseerr/commits?author=ankarhem" title="Code">💻</a> <a href="#translation-ankarhem" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/jayesh100"><img src="https://avatars1.githubusercontent.com/u/8022175?v=4?s=100" width="100px;" alt="Jayesh"/><br /><sub><b>Jayesh</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=jayesh100" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/flying-sausages"><img src="https://avatars1.githubusercontent.com/u/23618693?v=4?s=100" width="100px;" alt="flying-sausages"/><br /><sub><b>flying-sausages</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=flying-sausages" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/hirenshah"><img src="https://avatars2.githubusercontent.com/u/418112?v=4?s=100" width="100px;" alt="hirenshah"/><br /><sub><b>hirenshah</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=hirenshah" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/TheCatLady"><img src="https://avatars0.githubusercontent.com/u/52870424?v=4?s=100" width="100px;" alt="TheCatLady"/><br /><sub><b>TheCatLady</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=TheCatLady" title="Code">💻</a> <a href="#translation-TheCatLady" title="Translation">🌍</a> <a href="https://github.com/sct/overseerr/commits?author=TheCatLady" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/chriscpritchard"><img src="https://avatars1.githubusercontent.com/u/1839074?v=4?s=100" width="100px;" alt="Chris Pritchard"/><br /><sub><b>Chris Pritchard</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=chriscpritchard" title="Code">💻</a> <a href="https://github.com/sct/overseerr/commits?author=chriscpritchard" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/Tamberlox"><img src="https://avatars3.githubusercontent.com/u/56069014?v=4?s=100" width="100px;" alt="Tamberlox"/><br /><sub><b>Tamberlox</b></sub></a><br /><a href="#translation-Tamberlox" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://hmnd.io"><img src="https://avatars.githubusercontent.com/u/12853597?v=4?s=100" width="100px;" alt="David"/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=hmnd" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://www.douglas-parker.com"><img src="https://avatars.githubusercontent.com/u/18235822?v=4?s=100" width="100px;" alt="Douglas Parker"/><br /><sub><b>Douglas Parker</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=douglasparker" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/dancarter"><img src="https://avatars.githubusercontent.com/u/4387516?v=4?s=100" width="100px;" alt="Daniel Carter"/><br /><sub><b>Daniel Carter</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=dancarter" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://nuro.dev"><img src="https://avatars.githubusercontent.com/u/4991309?v=4?s=100" width="100px;" alt="nuro"/><br /><sub><b>nuro</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=NuroDev" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/onedr0p"><img src="https://avatars.githubusercontent.com/u/213795?v=4?s=100" width="100px;" alt="ᗪєνιη ᗷυнʟ"/><br /><sub><b>ᗪєνιη ᗷυнʟ</b></sub></a><br /><a href="#infra-onedr0p" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/JonnyWong16"><img src="https://avatars.githubusercontent.com/u/9099342?v=4?s=100" width="100px;" alt="JonnyWong16"/><br /><sub><b>JonnyWong16</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=JonnyWong16" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/Roxedus"><img src="https://avatars.githubusercontent.com/u/7110194?v=4?s=100" width="100px;" alt="Roxedus"/><br /><sub><b>Roxedus</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Roxedus" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/WoisWoi"><img src="https://avatars.githubusercontent.com/u/75491231?v=4?s=100" width="100px;" alt="WoisWoi"/><br /><sub><b>WoisWoi</b></sub></a><br /><a href="#translation-WoisWoi" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/HubDuck"><img src="https://avatars.githubusercontent.com/u/77843475?v=4?s=100" width="100px;" alt="HubDuck"/><br /><sub><b>HubDuck</b></sub></a><br /><a href="#translation-HubDuck" title="Translation">🌍</a> <a href="https://github.com/sct/overseerr/commits?author=HubDuck" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/costaht"><img src="https://avatars.githubusercontent.com/u/50637431?v=4?s=100" width="100px;" alt="costaht"/><br /><sub><b>costaht</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=costaht" title="Documentation">📖</a> <a href="#translation-costaht" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Shjosan"><img src="https://avatars.githubusercontent.com/u/20847626?v=4?s=100" width="100px;" alt="Shjosan"/><br /><sub><b>Shjosan</b></sub></a><br /><a href="#translation-Shjosan" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/kobaubarr"><img src="https://avatars.githubusercontent.com/u/28481522?v=4?s=100" width="100px;" alt="kobaubarr"/><br /><sub><b>kobaubarr</b></sub></a><br /><a href="#translation-kobaubarr" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/notorius28"><img src="https://avatars.githubusercontent.com/u/1621513?v=4?s=100" width="100px;" alt="Ricardo González"/><br /><sub><b>Ricardo González</b></sub></a><br /><a href="#translation-notorius28" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://torkili.uz"><img src="https://avatars.githubusercontent.com/u/460764?v=4?s=100" width="100px;" alt="Torkil"/><br /><sub><b>Torkil</b></sub></a><br /><a href="#translation-Torkiliuz" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://www.jagandeepbrar.io"><img src="https://avatars.githubusercontent.com/u/3048295?v=4?s=100" width="100px;" alt="Jagandeep Brar"/><br /><sub><b>Jagandeep Brar</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=JagandeepBrar" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://dtalens.com"><img src="https://avatars.githubusercontent.com/u/6631832?v=4?s=100" width="100px;" alt="dtalens"/><br /><sub><b>dtalens</b></sub></a><br /><a href="#translation-dtalens" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/acortelyou"><img src="https://avatars.githubusercontent.com/u/1689668?v=4?s=100" width="100px;" alt="Alex Cortelyou"/><br /><sub><b>Alex Cortelyou</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=acortelyou" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://nz.linkedin.com/in/jonocairns"><img src="https://avatars.githubusercontent.com/u/182836?v=4?s=100" width="100px;" alt="Jono Cairns"/><br /><sub><b>Jono Cairns</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=jonocairns" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://scias.net/"><img src="https://avatars.githubusercontent.com/u/439655?v=4?s=100" width="100px;" alt="DJScias"/><br /><sub><b>DJScias</b></sub></a><br /><a href="#translation-DJScias" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Dabu-dot"><img src="https://avatars.githubusercontent.com/u/52525576?v=4?s=100" width="100px;" alt="Dabu-dot"/><br /><sub><b>Dabu-dot</b></sub></a><br /><a href="#translation-Dabu-dot" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Jabster28"><img src="https://avatars.githubusercontent.com/u/29015942?v=4?s=100" width="100px;" alt="Jabster28"/><br /><sub><b>Jabster28</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Jabster28" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/littlerooster"><img src="https://avatars.githubusercontent.com/u/83890654?v=4?s=100" width="100px;" alt="littlerooster"/><br /><sub><b>littlerooster</b></sub></a><br /><a href="#translation-littlerooster" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/dphildebrandt"><img src="https://avatars.githubusercontent.com/u/154459?v=4?s=100" width="100px;" alt="Dustin Hildebrandt"/><br /><sub><b>Dustin Hildebrandt</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=dphildebrandt" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Generator"><img src="https://avatars.githubusercontent.com/u/44146?v=4?s=100" width="100px;" alt="Bruno Guerreiro"/><br /><sub><b>Bruno Guerreiro</b></sub></a><br /><a href="#translation-Generator" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/iceHtwoO"><img src="https://avatars.githubusercontent.com/u/27020492?v=4?s=100" width="100px;" alt="Alexander Neuhäuser"/><br /><sub><b>Alexander Neuhäuser</b></sub></a><br /><a href="#translation-iceHtwoO" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://www.unext.co.jp"><img src="https://avatars.githubusercontent.com/u/37431541?v=4?s=100" width="100px;" alt="Livio"/><br /><sub><b>Livio</b></sub></a><br /><a href="#design-liviokanone" title="Design">🎨</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/tangentThought"><img src="https://avatars.githubusercontent.com/u/25516090?v=4?s=100" width="100px;" alt="tangentThought"/><br /><sub><b>tangentThought</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=tangentThought" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/nicospz"><img src="https://avatars.githubusercontent.com/u/31373060?v=4?s=100" width="100px;" alt="Nicolás Espinoza"/><br /><sub><b>Nicolás Espinoza</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=nicospz" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/sootylunatic"><img src="https://avatars.githubusercontent.com/u/36486087?v=4?s=100" width="100px;" alt="sootylunatic"/><br /><sub><b>sootylunatic</b></sub></a><br /><a href="#translation-sootylunatic" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/JoKerIsCraZy"><img src="https://avatars.githubusercontent.com/u/47474211?v=4?s=100" width="100px;" alt="JoKerIsCraZy"/><br /><sub><b>JoKerIsCraZy</b></sub></a><br /><a href="#translation-JoKerIsCraZy" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://daddie.dev"><img src="https://avatars.githubusercontent.com/u/33762262?v=4?s=100" width="100px;" alt="Daddie0"/><br /><sub><b>Daddie0</b></sub></a><br /><a href="#translation-GoByeBye" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://ungaro.me"><img src="https://avatars.githubusercontent.com/u/43807696?v=4?s=100" width="100px;" alt="Simone"/><br /><sub><b>Simone</b></sub></a><br /><a href="#translation-Simoneu01" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/adan89lion"><img src="https://avatars.githubusercontent.com/u/6585644?v=4?s=100" width="100px;" alt="Seohyun Joo"/><br /><sub><b>Seohyun Joo</b></sub></a><br /><a href="#translation-adan89lion" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/ty4ko"><img src="https://avatars.githubusercontent.com/u/21213535?v=4?s=100" width="100px;" alt="Sergey"/><br /><sub><b>Sergey</b></sub></a><br /><a href="#translation-ty4ko" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/skafte1990"><img src="https://avatars.githubusercontent.com/u/31465453?v=4?s=100" width="100px;" alt="Shaaft"/><br /><sub><b>Shaaft</b></sub></a><br /><a href="#translation-skafte1990" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/sr093906"><img src="https://avatars.githubusercontent.com/u/8369201?v=4?s=100" width="100px;" alt="sr093906"/><br /><sub><b>sr093906</b></sub></a><br /><a href="#translation-sr093906" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Nackophilz"><img src="https://avatars.githubusercontent.com/u/61667226?v=4?s=100" width="100px;" alt="Nackophilz"/><br /><sub><b>Nackophilz</b></sub></a><br /><a href="#translation-Nackophilz" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/schambers"><img src="https://avatars.githubusercontent.com/u/31563?v=4?s=100" width="100px;" alt="Sean Chambers"/><br /><sub><b>Sean Chambers</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=schambers" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/deniscerri"><img src="https://avatars.githubusercontent.com/u/64997243?v=4?s=100" width="100px;" alt="deniscerri"/><br /><sub><b>deniscerri</b></sub></a><br /><a href="#translation-deniscerri" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/tomgacz"><img src="https://avatars.githubusercontent.com/u/14138209?v=4?s=100" width="100px;" alt="tomgacz"/><br /><sub><b>tomgacz</b></sub></a><br /><a href="#translation-tomgacz" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Andersborrits"><img src="https://avatars.githubusercontent.com/u/29452218?v=4?s=100" width="100px;" alt="Andersborrits"/><br /><sub><b>Andersborrits</b></sub></a><br /><a href="#translation-Andersborrits" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="http://maxentrouault.fr"><img src="https://avatars.githubusercontent.com/u/67283154?v=4?s=100" width="100px;" alt="Maxent"/><br /><sub><b>Maxent</b></sub></a><br /><a href="#translation-Maxentr" title="Translation">🌍</a></td>
|
||||
<td align="center"><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/sct/overseerr/commits?author=sambartik" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/frank-cywong"><img src="https://avatars.githubusercontent.com/u/90653148?v=4?s=100" width="100px;" alt="Chun Yeung Wong"/><br /><sub><b>Chun Yeung Wong</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=frank-cywong" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/TheMeanCanEHdian"><img src="https://avatars.githubusercontent.com/u/16025103?v=4?s=100" width="100px;" alt="TheMeanCanEHdian"/><br /><sub><b>TheMeanCanEHdian</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=TheMeanCanEHdian" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Gylesie"><img src="https://avatars.githubusercontent.com/u/86306812?v=4?s=100" width="100px;" alt="Gylesie"/><br /><sub><b>Gylesie</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Gylesie" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Fhd-pro"><img src="https://avatars.githubusercontent.com/u/82862079?v=4?s=100" width="100px;" alt="Fhd-pro"/><br /><sub><b>Fhd-pro</b></sub></a><br /><a href="#translation-Fhd-pro" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/PovilasID"><img src="https://avatars.githubusercontent.com/u/396243?v=4?s=100" width="100px;" alt="PovilasID"/><br /><sub><b>PovilasID</b></sub></a><br /><a href="#translation-PovilasID" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/byakurau"><img src="https://avatars.githubusercontent.com/u/1811683?v=4?s=100" width="100px;" alt="byakurau"/><br /><sub><b>byakurau</b></sub></a><br /><a href="#translation-byakurau" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/miknii"><img src="https://avatars.githubusercontent.com/u/109232569?v=4?s=100" width="100px;" alt="miknii"/><br /><sub><b>miknii</b></sub></a><br /><a href="#translation-miknii" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Eclipseop"><img src="https://avatars.githubusercontent.com/u/5846213?v=4?s=100" width="100px;" alt="Mackenzie"/><br /><sub><b>Mackenzie</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Eclipseop" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/s0up4200"><img src="https://avatars.githubusercontent.com/u/18177310?v=4?s=100" width="100px;" alt="soup"/><br /><sub><b>soup</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=s0up4200" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
|
||||
25
cypress/e2e/pull-to-refresh.cy.ts
Normal file
25
cypress/e2e/pull-to-refresh.cy.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
describe('Pull To Refresh', () => {
|
||||
beforeEach(() => {
|
||||
cy.login(Cypress.env('ADMIN_EMAIL'), Cypress.env('ADMIN_PASSWORD'));
|
||||
cy.viewport(390, 844);
|
||||
cy.visitMobile('/');
|
||||
});
|
||||
|
||||
it('reloads the current page', () => {
|
||||
cy.wait(500);
|
||||
|
||||
cy.intercept({
|
||||
method: 'GET',
|
||||
url: '/api/v1/*',
|
||||
}).as('apiCall');
|
||||
|
||||
cy.get('.searchbar').swipe('bottom', [190, 400]);
|
||||
|
||||
cy.wait('@apiCall').then((interception) => {
|
||||
assert.isNotNull(
|
||||
interception.response.body,
|
||||
'API was called and received data'
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,5 @@
|
||||
/// <reference types="cypress" />
|
||||
import 'cy-mobile-commands';
|
||||
|
||||
Cypress.Commands.add('login', (email, password) => {
|
||||
cy.session(
|
||||
|
||||
@@ -11,4 +11,4 @@ To use Fail2ban with Overseerr, create a new file named `overseerr.local` in you
|
||||
failregex = .*\[warn\]\[API\]\: Failed sign-in attempt.*"ip":"<HOST>"
|
||||
```
|
||||
|
||||
You can then add a jail using this filter in `jail.local`. Please see the [Fail2ban documetation](https://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Jails) for details on how to configure the jail.
|
||||
You can then add a jail using this filter in `jail.local`. Please see the [Fail2ban documentation](https://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Jails) for details on how to configure the jail.
|
||||
|
||||
@@ -138,6 +138,7 @@ location ^~ /overseerr {
|
||||
sub_filter 'href="/"' 'href="/$app"';
|
||||
sub_filter 'href="/login"' 'href="/$app/login"';
|
||||
sub_filter 'href:"/"' 'href:"/$app"';
|
||||
sub_filter '\/_next' '\/$app\/_next';
|
||||
sub_filter '/_next' '/$app/_next';
|
||||
sub_filter '/api/v1' '/$app/api/v1';
|
||||
sub_filter '/login/plex/loading' '/$app/login/plex/loading';
|
||||
|
||||
@@ -40,6 +40,14 @@ If you enable this setting and find yourself unable to access Overseerr, you can
|
||||
|
||||
This setting is **disabled** by default.
|
||||
|
||||
### Enable Image Caching
|
||||
|
||||
When enabled, Overseerr will proxy and cache images from pre-configured sources (such as TMDB). This can use a significant amount of disk space.
|
||||
|
||||
Images are saved in the `config/cache/images` and stale images are cleared out every 24 hours.
|
||||
|
||||
You should enable this if you are having issues with loading images directly from TMDB in your browser.
|
||||
|
||||
### Display Language
|
||||
|
||||
Set the default display language for Overseerr. Users can override this setting in their user settings.
|
||||
|
||||
@@ -17,4 +17,7 @@ module.exports = {
|
||||
|
||||
return config;
|
||||
},
|
||||
experimental: {
|
||||
scrollRestoration: true,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2475,29 +2475,44 @@ paths:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
id:
|
||||
type: string
|
||||
example: cache-id
|
||||
name:
|
||||
type: string
|
||||
example: cache name
|
||||
stats:
|
||||
type: object
|
||||
properties:
|
||||
imageCache:
|
||||
type: object
|
||||
properties:
|
||||
tmdb:
|
||||
type: object
|
||||
properties:
|
||||
size:
|
||||
type: number
|
||||
example: 123456
|
||||
imageCount:
|
||||
type: number
|
||||
example: 123
|
||||
apiCaches:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
properties:
|
||||
hits:
|
||||
type: number
|
||||
misses:
|
||||
type: number
|
||||
keys:
|
||||
type: number
|
||||
ksize:
|
||||
type: number
|
||||
vsize:
|
||||
type: number
|
||||
id:
|
||||
type: string
|
||||
example: cache-id
|
||||
name:
|
||||
type: string
|
||||
example: cache name
|
||||
stats:
|
||||
type: object
|
||||
properties:
|
||||
hits:
|
||||
type: number
|
||||
misses:
|
||||
type: number
|
||||
keys:
|
||||
type: number
|
||||
ksize:
|
||||
type: number
|
||||
vsize:
|
||||
type: number
|
||||
/settings/cache/{cacheId}/flush:
|
||||
post:
|
||||
summary: Flush a specific cache
|
||||
@@ -2539,6 +2554,12 @@ paths:
|
||||
nullable: true
|
||||
enum: [debug, info, warn, error]
|
||||
default: debug
|
||||
- in: query
|
||||
name: search
|
||||
schema:
|
||||
type: string
|
||||
nullable: true
|
||||
example: plex
|
||||
responses:
|
||||
'200':
|
||||
description: Server log returned
|
||||
@@ -4579,9 +4600,13 @@ paths:
|
||||
type: number
|
||||
example: 123
|
||||
seasons:
|
||||
type: array
|
||||
items:
|
||||
type: number
|
||||
oneOf:
|
||||
- type: array
|
||||
items:
|
||||
type: number
|
||||
minimum: 1
|
||||
- type: string
|
||||
enum: [all]
|
||||
is4k:
|
||||
type: boolean
|
||||
example: false
|
||||
@@ -4660,7 +4685,7 @@ paths:
|
||||
$ref: '#/components/schemas/MediaRequest'
|
||||
put:
|
||||
summary: Update MediaRequest
|
||||
description: Updates a specific media request and returns the request in a JSON object.. Requires the `MANAGE_REQUESTS` permission.
|
||||
description: Updates a specific media request and returns the request in a JSON object. Requires the `MANAGE_REQUESTS` permission.
|
||||
tags:
|
||||
- request
|
||||
parameters:
|
||||
@@ -4671,6 +4696,37 @@ paths:
|
||||
example: '1'
|
||||
schema:
|
||||
type: string
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
mediaType:
|
||||
type: string
|
||||
enum: [movie, tv]
|
||||
seasons:
|
||||
type: array
|
||||
items:
|
||||
type: number
|
||||
minimum: 1
|
||||
is4k:
|
||||
type: boolean
|
||||
example: false
|
||||
serverId:
|
||||
type: number
|
||||
profileId:
|
||||
type: number
|
||||
rootFolder:
|
||||
type: string
|
||||
languageProfileId:
|
||||
type: number
|
||||
userId:
|
||||
type: number
|
||||
nullable: true
|
||||
required:
|
||||
- mediaType
|
||||
responses:
|
||||
'200':
|
||||
description: Succesfully updated request
|
||||
|
||||
10
package.json
10
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "overseerr",
|
||||
"version": "0.1.0",
|
||||
"version": "1.31.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "nodemon -e ts --watch server --watch overseerr-api.yml -e .json,.ts,.yml -x ts-node -r tsconfig-paths/register --files --project server/tsconfig.json server/index.ts",
|
||||
@@ -33,7 +33,7 @@
|
||||
"@formatjs/intl-locale": "3.0.3",
|
||||
"@formatjs/intl-pluralrules": "5.0.3",
|
||||
"@formatjs/intl-utils": "3.8.4",
|
||||
"@headlessui/react": "^0.0.0-insiders.b301f04",
|
||||
"@headlessui/react": "0.0.0-insiders.b301f04",
|
||||
"@heroicons/react": "1.0.6",
|
||||
"@supercharge/request-ip": "1.2.0",
|
||||
"@svgr/webpack": "6.3.1",
|
||||
@@ -47,6 +47,7 @@
|
||||
"cookie-parser": "1.4.6",
|
||||
"copy-to-clipboard": "3.3.2",
|
||||
"country-flag-icons": "1.5.5",
|
||||
"cronstrue": "2.11.0",
|
||||
"csurf": "1.11.0",
|
||||
"date-fns": "2.29.1",
|
||||
"email-templates": "9.0.0",
|
||||
@@ -66,6 +67,7 @@
|
||||
"openpgp": "5.4.0",
|
||||
"plex-api": "5.3.2",
|
||||
"pug": "3.0.2",
|
||||
"pulltorefreshjs": "0.1.22",
|
||||
"react": "18.2.0",
|
||||
"react-ace": "10.1.0",
|
||||
"react-animate-height": "2.1.2",
|
||||
@@ -115,6 +117,7 @@
|
||||
"@types/node": "17.0.36",
|
||||
"@types/node-schedule": "2.1.0",
|
||||
"@types/nodemailer": "6.4.5",
|
||||
"@types/pulltorefreshjs": "0.1.5",
|
||||
"@types/react": "18.0.17",
|
||||
"@types/react-dom": "18.0.6",
|
||||
"@types/react-transition-group": "4.4.5",
|
||||
@@ -132,6 +135,7 @@
|
||||
"babel-plugin-react-intl-auto": "3.3.0",
|
||||
"commitizen": "4.2.5",
|
||||
"copyfiles": "2.4.1",
|
||||
"cy-mobile-commands": "0.3.0",
|
||||
"cypress": "10.6.0",
|
||||
"cz-conventional-changelog": "3.3.0",
|
||||
"eslint": "8.22.0",
|
||||
@@ -220,7 +224,7 @@
|
||||
{
|
||||
"path": "semantic-release-docker-buildx",
|
||||
"buildArgs": {
|
||||
"COMMIT_TAG": "$GITHUB_SHA"
|
||||
"COMMIT_TAG": "$GIT_SHA"
|
||||
},
|
||||
"imageNames": [
|
||||
"sctx/overseerr",
|
||||
|
||||
@@ -232,6 +232,10 @@ class PlexAPI {
|
||||
uri: `/library/sections/${id}/all?sort=addedAt%3Adesc&addedAt>>=${Math.floor(
|
||||
options.addedAt / 1000
|
||||
)}`,
|
||||
extraHeaders: {
|
||||
'X-Plex-Container-Start': `0`,
|
||||
'X-Plex-Container-Size': `500`,
|
||||
},
|
||||
});
|
||||
|
||||
return response.MediaContainer.Metadata;
|
||||
|
||||
@@ -191,7 +191,7 @@ export interface TmdbVideo {
|
||||
|
||||
export interface TmdbTvEpisodeResult {
|
||||
id: number;
|
||||
air_date: string;
|
||||
air_date: string | null;
|
||||
episode_number: number;
|
||||
name: string;
|
||||
overview: string;
|
||||
@@ -372,7 +372,8 @@ export interface TmdbPersonCombinedCredits {
|
||||
crew: TmdbPersonCreditCrew[];
|
||||
}
|
||||
|
||||
export interface TmdbSeasonWithEpisodes extends TmdbTvSeasonResult {
|
||||
export interface TmdbSeasonWithEpisodes
|
||||
extends Omit<TmdbTvSeasonResult, 'episode_count'> {
|
||||
episodes: TmdbTvEpisodeResult[];
|
||||
external_ids: TmdbExternalIds;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ export class User {
|
||||
return users.map((u) => u.filter(showFiltered));
|
||||
}
|
||||
|
||||
static readonly filteredFields: string[] = ['email'];
|
||||
static readonly filteredFields: string[] = ['email', 'plexId'];
|
||||
|
||||
public displayName: string;
|
||||
|
||||
@@ -73,7 +73,7 @@ export class User {
|
||||
@Column({ type: 'integer', default: UserType.PLEX })
|
||||
public userType: UserType;
|
||||
|
||||
@Column({ nullable: true, select: false })
|
||||
@Column({ nullable: true, select: true })
|
||||
public plexId?: number;
|
||||
|
||||
@Column({ nullable: true, select: false })
|
||||
|
||||
@@ -17,6 +17,7 @@ import WebPushAgent from '@server/lib/notifications/agents/webpush';
|
||||
import { getSettings } from '@server/lib/settings';
|
||||
import logger from '@server/logger';
|
||||
import routes from '@server/routes';
|
||||
import imageproxy from '@server/routes/imageproxy';
|
||||
import { getAppVersion } from '@server/utils/appVersion';
|
||||
import restartFlag from '@server/utils/restartFlag';
|
||||
import { getClientIp } from '@supercharge/request-ip';
|
||||
@@ -176,6 +177,9 @@ app
|
||||
next();
|
||||
});
|
||||
server.use('/api/v1', routes);
|
||||
|
||||
server.use('/imageproxy', imageproxy);
|
||||
|
||||
server.get('*', (req, res) => handle(req, res));
|
||||
server.use(
|
||||
(
|
||||
|
||||
@@ -51,6 +51,11 @@ export interface CacheItem {
|
||||
};
|
||||
}
|
||||
|
||||
export interface CacheResponse {
|
||||
apiCaches: CacheItem[];
|
||||
imageCache: Record<'tmdb', { size: number; imageCount: number }>;
|
||||
}
|
||||
|
||||
export interface StatusResponse {
|
||||
version: string;
|
||||
commitTag: string;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import downloadTracker from '@server/lib/downloadtracker';
|
||||
import ImageProxy from '@server/lib/imageproxy';
|
||||
import { plexFullScanner, plexRecentScanner } from '@server/lib/scanners/plex';
|
||||
import { radarrScanner } from '@server/lib/scanners/radarr';
|
||||
import { sonarrScanner } from '@server/lib/scanners/sonarr';
|
||||
@@ -14,6 +15,7 @@ interface ScheduledJob {
|
||||
name: string;
|
||||
type: 'process' | 'command';
|
||||
interval: 'short' | 'long' | 'fixed';
|
||||
cronSchedule: string;
|
||||
running?: () => boolean;
|
||||
cancelFn?: () => void;
|
||||
}
|
||||
@@ -29,6 +31,7 @@ export const startJobs = (): void => {
|
||||
name: 'Plex Recently Added Scan',
|
||||
type: 'process',
|
||||
interval: 'short',
|
||||
cronSchedule: jobs['plex-recently-added-scan'].schedule,
|
||||
job: schedule.scheduleJob(jobs['plex-recently-added-scan'].schedule, () => {
|
||||
logger.info('Starting scheduled job: Plex Recently Added Scan', {
|
||||
label: 'Jobs',
|
||||
@@ -45,6 +48,7 @@ export const startJobs = (): void => {
|
||||
name: 'Plex Full Library Scan',
|
||||
type: 'process',
|
||||
interval: 'long',
|
||||
cronSchedule: jobs['plex-full-scan'].schedule,
|
||||
job: schedule.scheduleJob(jobs['plex-full-scan'].schedule, () => {
|
||||
logger.info('Starting scheduled job: Plex Full Library Scan', {
|
||||
label: 'Jobs',
|
||||
@@ -60,7 +64,8 @@ export const startJobs = (): void => {
|
||||
id: 'plex-watchlist-sync',
|
||||
name: 'Plex Watchlist Sync',
|
||||
type: 'process',
|
||||
interval: 'long',
|
||||
interval: 'short',
|
||||
cronSchedule: jobs['plex-watchlist-sync'].schedule,
|
||||
job: schedule.scheduleJob(jobs['plex-watchlist-sync'].schedule, () => {
|
||||
logger.info('Starting scheduled job: Plex Watchlist Sync', {
|
||||
label: 'Jobs',
|
||||
@@ -75,6 +80,7 @@ export const startJobs = (): void => {
|
||||
name: 'Radarr Scan',
|
||||
type: 'process',
|
||||
interval: 'long',
|
||||
cronSchedule: jobs['radarr-scan'].schedule,
|
||||
job: schedule.scheduleJob(jobs['radarr-scan'].schedule, () => {
|
||||
logger.info('Starting scheduled job: Radarr Scan', { label: 'Jobs' });
|
||||
radarrScanner.run();
|
||||
@@ -89,6 +95,7 @@ export const startJobs = (): void => {
|
||||
name: 'Sonarr Scan',
|
||||
type: 'process',
|
||||
interval: 'long',
|
||||
cronSchedule: jobs['sonarr-scan'].schedule,
|
||||
job: schedule.scheduleJob(jobs['sonarr-scan'].schedule, () => {
|
||||
logger.info('Starting scheduled job: Sonarr Scan', { label: 'Jobs' });
|
||||
sonarrScanner.run();
|
||||
@@ -103,6 +110,7 @@ export const startJobs = (): void => {
|
||||
name: 'Download Sync',
|
||||
type: 'command',
|
||||
interval: 'fixed',
|
||||
cronSchedule: jobs['download-sync'].schedule,
|
||||
job: schedule.scheduleJob(jobs['download-sync'].schedule, () => {
|
||||
logger.debug('Starting scheduled job: Download Sync', {
|
||||
label: 'Jobs',
|
||||
@@ -117,6 +125,7 @@ export const startJobs = (): void => {
|
||||
name: 'Download Sync Reset',
|
||||
type: 'command',
|
||||
interval: 'long',
|
||||
cronSchedule: jobs['download-sync-reset'].schedule,
|
||||
job: schedule.scheduleJob(jobs['download-sync-reset'].schedule, () => {
|
||||
logger.info('Starting scheduled job: Download Sync Reset', {
|
||||
label: 'Jobs',
|
||||
@@ -125,5 +134,21 @@ export const startJobs = (): void => {
|
||||
}),
|
||||
});
|
||||
|
||||
// Run image cache cleanup every 5 minutes
|
||||
scheduledJobs.push({
|
||||
id: 'image-cache-cleanup',
|
||||
name: 'Image Cache Cleanup',
|
||||
type: 'process',
|
||||
interval: 'long',
|
||||
cronSchedule: jobs['image-cache-cleanup'].schedule,
|
||||
job: schedule.scheduleJob(jobs['image-cache-cleanup'].schedule, () => {
|
||||
logger.info('Starting scheduled job: Image Cache Cleanup', {
|
||||
label: 'Jobs',
|
||||
});
|
||||
// Clean TMDB image cache
|
||||
ImageProxy.clearCache('tmdb');
|
||||
}),
|
||||
});
|
||||
|
||||
logger.info('Scheduled jobs loaded', { label: 'Jobs' });
|
||||
};
|
||||
|
||||
268
server/lib/imageproxy.ts
Normal file
268
server/lib/imageproxy.ts
Normal file
@@ -0,0 +1,268 @@
|
||||
import logger from '@server/logger';
|
||||
import axios from 'axios';
|
||||
import rateLimit, { type rateLimitOptions } from 'axios-rate-limit';
|
||||
import { createHash } from 'crypto';
|
||||
import { promises } from 'fs';
|
||||
import path, { join } from 'path';
|
||||
|
||||
type ImageResponse = {
|
||||
meta: {
|
||||
revalidateAfter: number;
|
||||
curRevalidate: number;
|
||||
isStale: boolean;
|
||||
etag: string;
|
||||
extension: string;
|
||||
cacheKey: string;
|
||||
cacheMiss: boolean;
|
||||
};
|
||||
imageBuffer: Buffer;
|
||||
};
|
||||
|
||||
class ImageProxy {
|
||||
public static async clearCache(key: string) {
|
||||
let deletedImages = 0;
|
||||
const cacheDirectory = path.join(
|
||||
__dirname,
|
||||
'../../config/cache/images/',
|
||||
key
|
||||
);
|
||||
|
||||
const files = await promises.readdir(cacheDirectory);
|
||||
|
||||
for (const file of files) {
|
||||
const filePath = path.join(cacheDirectory, file);
|
||||
const stat = await promises.lstat(filePath);
|
||||
|
||||
if (stat.isDirectory()) {
|
||||
const imageFiles = await promises.readdir(filePath);
|
||||
|
||||
for (const imageFile of imageFiles) {
|
||||
const [, expireAtSt] = imageFile.split('.');
|
||||
const expireAt = Number(expireAtSt);
|
||||
const now = Date.now();
|
||||
|
||||
if (now > expireAt) {
|
||||
await promises.rm(path.join(filePath, imageFile));
|
||||
deletedImages += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logger.info(`Cleared ${deletedImages} stale image(s) from cache`, {
|
||||
label: 'Image Cache',
|
||||
});
|
||||
}
|
||||
|
||||
public static async getImageStats(
|
||||
key: string
|
||||
): Promise<{ size: number; imageCount: number }> {
|
||||
const cacheDirectory = path.join(
|
||||
__dirname,
|
||||
'../../config/cache/images/',
|
||||
key
|
||||
);
|
||||
|
||||
const imageTotalSize = await ImageProxy.getDirectorySize(cacheDirectory);
|
||||
const imageCount = await ImageProxy.getImageCount(cacheDirectory);
|
||||
|
||||
return {
|
||||
size: imageTotalSize,
|
||||
imageCount,
|
||||
};
|
||||
}
|
||||
|
||||
private static async getDirectorySize(dir: string): Promise<number> {
|
||||
const files = await promises.readdir(dir, {
|
||||
withFileTypes: true,
|
||||
});
|
||||
|
||||
const paths = files.map(async (file) => {
|
||||
const path = join(dir, file.name);
|
||||
|
||||
if (file.isDirectory()) return await ImageProxy.getDirectorySize(path);
|
||||
|
||||
if (file.isFile()) {
|
||||
const { size } = await promises.stat(path);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
|
||||
return (await Promise.all(paths))
|
||||
.flat(Infinity)
|
||||
.reduce((i, size) => i + size, 0);
|
||||
}
|
||||
|
||||
private static async getImageCount(dir: string) {
|
||||
const files = await promises.readdir(dir);
|
||||
|
||||
return files.length;
|
||||
}
|
||||
|
||||
private axios;
|
||||
private cacheVersion;
|
||||
private key;
|
||||
|
||||
constructor(
|
||||
key: string,
|
||||
baseUrl: string,
|
||||
options: {
|
||||
cacheVersion?: number;
|
||||
rateLimitOptions?: rateLimitOptions;
|
||||
} = {}
|
||||
) {
|
||||
this.cacheVersion = options.cacheVersion ?? 1;
|
||||
this.key = key;
|
||||
this.axios = axios.create({
|
||||
baseURL: baseUrl,
|
||||
});
|
||||
|
||||
if (options.rateLimitOptions) {
|
||||
this.axios = rateLimit(this.axios, options.rateLimitOptions);
|
||||
}
|
||||
}
|
||||
|
||||
public async getImage(path: string): Promise<ImageResponse> {
|
||||
const cacheKey = this.getCacheKey(path);
|
||||
|
||||
const imageResponse = await this.get(cacheKey);
|
||||
|
||||
if (!imageResponse) {
|
||||
const newImage = await this.set(path, cacheKey);
|
||||
|
||||
if (!newImage) {
|
||||
throw new Error('Failed to load image');
|
||||
}
|
||||
|
||||
return newImage;
|
||||
}
|
||||
|
||||
// If the image is stale, we will revalidate it in the background.
|
||||
if (imageResponse.meta.isStale) {
|
||||
this.set(path, cacheKey);
|
||||
}
|
||||
|
||||
return imageResponse;
|
||||
}
|
||||
|
||||
private async get(cacheKey: string): Promise<ImageResponse | null> {
|
||||
try {
|
||||
const directory = join(this.getCacheDirectory(), cacheKey);
|
||||
const files = await promises.readdir(directory);
|
||||
const now = Date.now();
|
||||
|
||||
for (const file of files) {
|
||||
const [maxAgeSt, expireAtSt, etag, extension] = file.split('.');
|
||||
const buffer = await promises.readFile(join(directory, file));
|
||||
const expireAt = Number(expireAtSt);
|
||||
const maxAge = Number(maxAgeSt);
|
||||
|
||||
return {
|
||||
meta: {
|
||||
curRevalidate: maxAge,
|
||||
revalidateAfter: maxAge * 1000 + now,
|
||||
isStale: now > expireAt,
|
||||
etag,
|
||||
extension,
|
||||
cacheKey,
|
||||
cacheMiss: false,
|
||||
},
|
||||
imageBuffer: buffer,
|
||||
};
|
||||
}
|
||||
} catch (e) {
|
||||
// No files. Treat as empty cache.
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private async set(
|
||||
path: string,
|
||||
cacheKey: string
|
||||
): Promise<ImageResponse | null> {
|
||||
try {
|
||||
const directory = join(this.getCacheDirectory(), cacheKey);
|
||||
const response = await this.axios.get(path, {
|
||||
responseType: 'arraybuffer',
|
||||
});
|
||||
|
||||
const buffer = Buffer.from(response.data, 'binary');
|
||||
const extension = path.split('.').pop() ?? '';
|
||||
const maxAge = Number(response.headers['cache-control'].split('=')[1]);
|
||||
const expireAt = Date.now() + maxAge * 1000;
|
||||
const etag = response.headers.etag.replace(/"/g, '');
|
||||
|
||||
await this.writeToCacheDir(
|
||||
directory,
|
||||
extension,
|
||||
maxAge,
|
||||
expireAt,
|
||||
buffer,
|
||||
etag
|
||||
);
|
||||
|
||||
return {
|
||||
meta: {
|
||||
curRevalidate: maxAge,
|
||||
revalidateAfter: expireAt,
|
||||
isStale: false,
|
||||
etag,
|
||||
extension,
|
||||
cacheKey,
|
||||
cacheMiss: true,
|
||||
},
|
||||
imageBuffer: buffer,
|
||||
};
|
||||
} catch (e) {
|
||||
logger.debug('Something went wrong caching image.', {
|
||||
label: 'Image Cache',
|
||||
errorMessage: e.message,
|
||||
});
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private async writeToCacheDir(
|
||||
dir: string,
|
||||
extension: string,
|
||||
maxAge: number,
|
||||
expireAt: number,
|
||||
buffer: Buffer,
|
||||
etag: string
|
||||
) {
|
||||
const filename = join(dir, `${maxAge}.${expireAt}.${etag}.${extension}`);
|
||||
|
||||
await promises.rm(dir, { force: true, recursive: true }).catch(() => {
|
||||
// do nothing
|
||||
});
|
||||
|
||||
await promises.mkdir(dir, { recursive: true });
|
||||
await promises.writeFile(filename, buffer);
|
||||
}
|
||||
|
||||
private getCacheKey(path: string) {
|
||||
return this.getHash([this.key, this.cacheVersion, path]);
|
||||
}
|
||||
|
||||
private getHash(items: (string | number | Buffer)[]) {
|
||||
const hash = createHash('sha256');
|
||||
for (const item of items) {
|
||||
if (typeof item === 'number') hash.update(String(item));
|
||||
else {
|
||||
hash.update(item);
|
||||
}
|
||||
}
|
||||
// See https://en.wikipedia.org/wiki/Base64#Filenames
|
||||
return hash.digest('base64').replace(/\//g, '-');
|
||||
}
|
||||
|
||||
private getCacheDirectory() {
|
||||
return path.join(__dirname, '../../config/cache/images/', this.key);
|
||||
}
|
||||
}
|
||||
|
||||
export default ImageProxy;
|
||||
@@ -247,7 +247,8 @@ export type JobId =
|
||||
| 'radarr-scan'
|
||||
| 'sonarr-scan'
|
||||
| 'download-sync'
|
||||
| 'download-sync-reset';
|
||||
| 'download-sync-reset'
|
||||
| 'image-cache-cleanup';
|
||||
|
||||
interface AllSettings {
|
||||
clientId: string;
|
||||
@@ -414,6 +415,9 @@ class Settings {
|
||||
'download-sync-reset': {
|
||||
schedule: '0 0 1 * * *',
|
||||
},
|
||||
'image-cache-cleanup': {
|
||||
schedule: '0 0 5 * * *',
|
||||
},
|
||||
},
|
||||
};
|
||||
if (initialSettings) {
|
||||
|
||||
@@ -29,7 +29,7 @@ import type { Video } from './Movie';
|
||||
interface Episode {
|
||||
id: number;
|
||||
name: string;
|
||||
airDate: string;
|
||||
airDate: string | null;
|
||||
episodeNumber: number;
|
||||
overview: string;
|
||||
productionCode: string;
|
||||
@@ -50,7 +50,7 @@ interface Season {
|
||||
seasonNumber: number;
|
||||
}
|
||||
|
||||
export interface SeasonWithEpisodes extends Season {
|
||||
export interface SeasonWithEpisodes extends Omit<Season, 'episodeCount'> {
|
||||
episodes: Episode[];
|
||||
externalIds: ExternalIds;
|
||||
}
|
||||
@@ -141,7 +141,6 @@ export const mapSeasonWithEpisodes = (
|
||||
season: TmdbSeasonWithEpisodes
|
||||
): SeasonWithEpisodes => ({
|
||||
airDate: season.air_date,
|
||||
episodeCount: season.episode_count,
|
||||
episodes: season.episodes.map(mapEpisodeResult),
|
||||
externalIds: mapExternalIds(season.external_ids),
|
||||
id: season.id,
|
||||
|
||||
@@ -64,13 +64,28 @@ authRoutes.post('/plex', async (req, res, next) => {
|
||||
await userRepository.save(user);
|
||||
} else {
|
||||
const mainUser = await userRepository.findOneOrFail({
|
||||
select: { id: true, plexToken: true, plexId: true },
|
||||
select: { id: true, plexToken: true, plexId: true, email: true },
|
||||
where: { id: 1 },
|
||||
});
|
||||
const mainPlexTv = new PlexTvAPI(mainUser.plexToken ?? '');
|
||||
|
||||
if (!account.id) {
|
||||
logger.error('Plex ID was missing from Plex.tv response', {
|
||||
label: 'API',
|
||||
ip: req.ip,
|
||||
email: account.email,
|
||||
plexUsername: account.username,
|
||||
});
|
||||
|
||||
return next({
|
||||
status: 500,
|
||||
message: 'Something went wrong. Try again.',
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
account.id === mainUser.plexId ||
|
||||
(account.email === mainUser.email && !mainUser.plexId) ||
|
||||
(await mainPlexTv.checkUserAccess(account.id))
|
||||
) {
|
||||
if (user) {
|
||||
|
||||
39
server/routes/imageproxy.ts
Normal file
39
server/routes/imageproxy.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import ImageProxy from '@server/lib/imageproxy';
|
||||
import logger from '@server/logger';
|
||||
import { Router } from 'express';
|
||||
|
||||
const router = Router();
|
||||
const tmdbImageProxy = new ImageProxy('tmdb', 'https://image.tmdb.org', {
|
||||
rateLimitOptions: {
|
||||
maxRequests: 20,
|
||||
maxRPS: 50,
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Image Proxy
|
||||
*/
|
||||
router.get('/*', async (req, res) => {
|
||||
const imagePath = req.path.replace('/image', '');
|
||||
try {
|
||||
const imageData = await tmdbImageProxy.getImage(imagePath);
|
||||
|
||||
res.writeHead(200, {
|
||||
'Content-Type': `image/${imageData.meta.extension}`,
|
||||
'Content-Length': imageData.imageBuffer.length,
|
||||
'Cache-Control': `public, max-age=${imageData.meta.curRevalidate}`,
|
||||
'OS-Cache-Key': imageData.meta.cacheKey,
|
||||
'OS-Cache-Status': imageData.meta.cacheMiss ? 'MISS' : 'HIT',
|
||||
});
|
||||
|
||||
res.end(imageData.imageBuffer);
|
||||
} catch (e) {
|
||||
logger.error('Failed to proxy image', {
|
||||
imagePath,
|
||||
errorMessage: e.message,
|
||||
});
|
||||
res.status(500).send();
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
@@ -1,5 +1,7 @@
|
||||
import TheMovieDb from '@server/api/themoviedb';
|
||||
import { MediaStatus } from '@server/constants/media';
|
||||
import Media from '@server/entity/Media';
|
||||
import { getSettings } from '@server/lib/settings';
|
||||
import logger from '@server/logger';
|
||||
import {
|
||||
mapCastCredits,
|
||||
@@ -34,6 +36,7 @@ personRoutes.get('/:id', async (req, res, next) => {
|
||||
|
||||
personRoutes.get('/:id/combined_credits', async (req, res, next) => {
|
||||
const tmdb = new TheMovieDb();
|
||||
const settings = getSettings();
|
||||
|
||||
try {
|
||||
const combinedCredits = await tmdb.getPersonCombinedCredits({
|
||||
@@ -41,14 +44,30 @@ personRoutes.get('/:id/combined_credits', async (req, res, next) => {
|
||||
language: req.locale ?? (req.query.language as string),
|
||||
});
|
||||
|
||||
const castMedia = await Media.getRelatedMedia(
|
||||
let castMedia = await Media.getRelatedMedia(
|
||||
combinedCredits.cast.map((result) => result.id)
|
||||
);
|
||||
|
||||
const crewMedia = await Media.getRelatedMedia(
|
||||
let crewMedia = await Media.getRelatedMedia(
|
||||
combinedCredits.crew.map((result) => result.id)
|
||||
);
|
||||
|
||||
if (settings.main.hideAvailable) {
|
||||
castMedia = castMedia.filter(
|
||||
(media) =>
|
||||
(media.mediaType === 'movie' || media.mediaType === 'tv') &&
|
||||
media.status !== MediaStatus.AVAILABLE &&
|
||||
media.status !== MediaStatus.PARTIALLY_AVAILABLE
|
||||
);
|
||||
|
||||
crewMedia = crewMedia.filter(
|
||||
(media) =>
|
||||
(media.mediaType === 'movie' || media.mediaType === 'tv') &&
|
||||
media.status !== MediaStatus.AVAILABLE &&
|
||||
media.status !== MediaStatus.PARTIALLY_AVAILABLE
|
||||
);
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
cast: combinedCredits.cast
|
||||
.map((result) =>
|
||||
|
||||
@@ -14,9 +14,10 @@ import type {
|
||||
import { scheduledJobs } from '@server/job/schedule';
|
||||
import type { AvailableCacheIds } from '@server/lib/cache';
|
||||
import cacheManager from '@server/lib/cache';
|
||||
import ImageProxy from '@server/lib/imageproxy';
|
||||
import { Permission } from '@server/lib/permissions';
|
||||
import { plexFullScanner } from '@server/lib/scanners/plex';
|
||||
import type { MainSettings } from '@server/lib/settings';
|
||||
import type { JobId, MainSettings } from '@server/lib/settings';
|
||||
import { getSettings } from '@server/lib/settings';
|
||||
import logger from '@server/logger';
|
||||
import { isAuthenticated } from '@server/middleware/auth';
|
||||
@@ -25,7 +26,7 @@ import { getAppVersion } from '@server/utils/appVersion';
|
||||
import { Router } from 'express';
|
||||
import rateLimit from 'express-rate-limit';
|
||||
import fs from 'fs';
|
||||
import { merge, omit, set, sortBy } from 'lodash';
|
||||
import { escapeRegExp, merge, omit, set, sortBy } from 'lodash';
|
||||
import { rescheduleJob } from 'node-schedule';
|
||||
import path from 'path';
|
||||
import semver from 'semver';
|
||||
@@ -344,6 +345,8 @@ settingsRoutes.get(
|
||||
(req, res, next) => {
|
||||
const pageSize = req.query.take ? Number(req.query.take) : 25;
|
||||
const skip = req.query.skip ? Number(req.query.skip) : 0;
|
||||
const search = (req.query.search as string) ?? '';
|
||||
const searchRegexp = new RegExp(escapeRegExp(search), 'i');
|
||||
|
||||
let filter: string[] = [];
|
||||
switch (req.query.filter) {
|
||||
@@ -375,6 +378,22 @@ settingsRoutes.get(
|
||||
'data',
|
||||
];
|
||||
|
||||
const deepValueStrings = (obj: Record<string, unknown>): string[] => {
|
||||
const values = [];
|
||||
|
||||
for (const val of Object.values(obj)) {
|
||||
if (typeof val === 'string') {
|
||||
values.push(val);
|
||||
} else if (typeof val === 'number') {
|
||||
values.push(val.toString());
|
||||
} else if (val !== null && typeof val === 'object') {
|
||||
values.push(...deepValueStrings(val as Record<string, unknown>));
|
||||
}
|
||||
}
|
||||
|
||||
return values;
|
||||
};
|
||||
|
||||
try {
|
||||
fs.readFileSync(logFile, 'utf-8')
|
||||
.split('\n')
|
||||
@@ -399,6 +418,19 @@ settingsRoutes.get(
|
||||
});
|
||||
}
|
||||
|
||||
if (req.query.search) {
|
||||
if (
|
||||
// label and data are sometimes undefined
|
||||
!searchRegexp.test(logMessage.label ?? '') &&
|
||||
!searchRegexp.test(logMessage.message) &&
|
||||
!deepValueStrings(logMessage.data ?? {}).some((val) =>
|
||||
searchRegexp.test(val)
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
logs.push(logMessage);
|
||||
});
|
||||
|
||||
@@ -433,6 +465,7 @@ settingsRoutes.get('/jobs', (_req, res) => {
|
||||
name: job.name,
|
||||
type: job.type,
|
||||
interval: job.interval,
|
||||
cronSchedule: job.cronSchedule,
|
||||
nextExecutionTime: job.job.nextInvocation(),
|
||||
running: job.running ? job.running() : false,
|
||||
}))
|
||||
@@ -453,12 +486,13 @@ settingsRoutes.post<{ jobId: string }>('/jobs/:jobId/run', (req, res, next) => {
|
||||
name: scheduledJob.name,
|
||||
type: scheduledJob.type,
|
||||
interval: scheduledJob.interval,
|
||||
cronSchedule: scheduledJob.cronSchedule,
|
||||
nextExecutionTime: scheduledJob.job.nextInvocation(),
|
||||
running: scheduledJob.running ? scheduledJob.running() : false,
|
||||
});
|
||||
});
|
||||
|
||||
settingsRoutes.post<{ jobId: string }>(
|
||||
settingsRoutes.post<{ jobId: JobId }>(
|
||||
'/jobs/:jobId/cancel',
|
||||
(req, res, next) => {
|
||||
const scheduledJob = scheduledJobs.find(
|
||||
@@ -478,13 +512,14 @@ settingsRoutes.post<{ jobId: string }>(
|
||||
name: scheduledJob.name,
|
||||
type: scheduledJob.type,
|
||||
interval: scheduledJob.interval,
|
||||
cronSchedule: scheduledJob.cronSchedule,
|
||||
nextExecutionTime: scheduledJob.job.nextInvocation(),
|
||||
running: scheduledJob.running ? scheduledJob.running() : false,
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
settingsRoutes.post<{ jobId: string }>(
|
||||
settingsRoutes.post<{ jobId: JobId }>(
|
||||
'/jobs/:jobId/schedule',
|
||||
(req, res, next) => {
|
||||
const scheduledJob = scheduledJobs.find(
|
||||
@@ -502,11 +537,14 @@ settingsRoutes.post<{ jobId: string }>(
|
||||
settings.jobs[scheduledJob.id].schedule = req.body.schedule;
|
||||
settings.save();
|
||||
|
||||
scheduledJob.cronSchedule = req.body.schedule;
|
||||
|
||||
return res.status(200).json({
|
||||
id: scheduledJob.id,
|
||||
name: scheduledJob.name,
|
||||
type: scheduledJob.type,
|
||||
interval: scheduledJob.interval,
|
||||
cronSchedule: scheduledJob.cronSchedule,
|
||||
nextExecutionTime: scheduledJob.job.nextInvocation(),
|
||||
running: scheduledJob.running ? scheduledJob.running() : false,
|
||||
});
|
||||
@@ -516,16 +554,23 @@ settingsRoutes.post<{ jobId: string }>(
|
||||
}
|
||||
);
|
||||
|
||||
settingsRoutes.get('/cache', (req, res) => {
|
||||
const caches = cacheManager.getAllCaches();
|
||||
settingsRoutes.get('/cache', async (_req, res) => {
|
||||
const cacheManagerCaches = cacheManager.getAllCaches();
|
||||
|
||||
return res.status(200).json(
|
||||
Object.values(caches).map((cache) => ({
|
||||
id: cache.id,
|
||||
name: cache.name,
|
||||
stats: cache.getStats(),
|
||||
}))
|
||||
);
|
||||
const apiCaches = Object.values(cacheManagerCaches).map((cache) => ({
|
||||
id: cache.id,
|
||||
name: cache.name,
|
||||
stats: cache.getStats(),
|
||||
}));
|
||||
|
||||
const tmdbImageCache = await ImageProxy.getImageStats('tmdb');
|
||||
|
||||
return res.status(200).json({
|
||||
apiCaches,
|
||||
imageCache: {
|
||||
tmdb: tmdbImageCache,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
settingsRoutes.post<{ cacheId: AvailableCacheIds }>(
|
||||
|
||||
@@ -61,7 +61,7 @@ function Button<P extends ElementTypes = 'button'>(
|
||||
break;
|
||||
case 'warning':
|
||||
buttonStyle.push(
|
||||
'text-white border border-yellow-500 backdrop-blur bg-yellow-500 bg-opacity-80 hover:bg-opacity-100 hover:border-yellow-400 focus:border-yellow-700 focus:ring-yellow active:bg-opacity-100 active:border-yellow-700'
|
||||
'text-white border border-yellow-500 bg-yellow-500 bg-opacity-80 hover:bg-opacity-100 hover:border-yellow-400 focus:border-yellow-700 focus:ring-yellow active:bg-opacity-100 active:border-yellow-700'
|
||||
);
|
||||
break;
|
||||
case 'success':
|
||||
|
||||
@@ -1,18 +1,27 @@
|
||||
import useSettings from '@app/hooks/useSettings';
|
||||
import type { ImageProps } from 'next/image';
|
||||
import type { ImageLoader, ImageProps } from 'next/image';
|
||||
import Image from 'next/image';
|
||||
|
||||
const imageLoader: ImageLoader = ({ src }) => src;
|
||||
|
||||
/**
|
||||
* The CachedImage component should be used wherever
|
||||
* we want to offer the option to locally cache images.
|
||||
*
|
||||
* It uses the `next/image` Image component but overrides
|
||||
* the `unoptimized` prop based on the application setting `cacheImages`.
|
||||
**/
|
||||
const CachedImage = (props: ImageProps) => {
|
||||
const CachedImage = ({ src, ...props }: ImageProps) => {
|
||||
const { currentSettings } = useSettings();
|
||||
|
||||
return <Image unoptimized={!currentSettings.cacheImages} {...props} />;
|
||||
let imageUrl = src;
|
||||
|
||||
if (typeof imageUrl === 'string' && imageUrl.startsWith('http')) {
|
||||
const parsedUrl = new URL(imageUrl);
|
||||
|
||||
if (parsedUrl.host === 'image.tmdb.org' && currentSettings.cacheImages) {
|
||||
imageUrl = imageUrl.replace('https://image.tmdb.org', '/imageproxy');
|
||||
}
|
||||
}
|
||||
|
||||
return <Image unoptimized loader={imageLoader} src={imageUrl} {...props} />;
|
||||
};
|
||||
|
||||
export default CachedImage;
|
||||
|
||||
45
src/components/Common/StatusBadgeMini/index.tsx
Normal file
45
src/components/Common/StatusBadgeMini/index.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
import {
|
||||
BellIcon,
|
||||
CheckIcon,
|
||||
ClockIcon,
|
||||
MinusSmIcon,
|
||||
} from '@heroicons/react/solid';
|
||||
import { MediaStatus } from '@server/constants/media';
|
||||
|
||||
interface StatusBadgeMiniProps {
|
||||
status: MediaStatus;
|
||||
is4k?: boolean;
|
||||
}
|
||||
|
||||
const StatusBadgeMini = ({ status, is4k = false }: StatusBadgeMiniProps) => {
|
||||
const badgeStyle = ['w-5 rounded-full p-0.5 text-white ring-1'];
|
||||
let indicatorIcon: React.ReactNode;
|
||||
|
||||
switch (status) {
|
||||
case MediaStatus.PROCESSING:
|
||||
badgeStyle.push('bg-indigo-500 ring-indigo-400');
|
||||
indicatorIcon = <ClockIcon />;
|
||||
break;
|
||||
case MediaStatus.AVAILABLE:
|
||||
badgeStyle.push('bg-green-500 ring-green-400');
|
||||
indicatorIcon = <CheckIcon />;
|
||||
break;
|
||||
case MediaStatus.PENDING:
|
||||
badgeStyle.push('bg-yellow-500 ring-yellow-400');
|
||||
indicatorIcon = <BellIcon />;
|
||||
break;
|
||||
case MediaStatus.PARTIALLY_AVAILABLE:
|
||||
badgeStyle.push('bg-green-500 ring-green-400');
|
||||
indicatorIcon = <MinusSmIcon />;
|
||||
break;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="inline-flex whitespace-nowrap rounded-full text-xs font-semibold leading-5 ring-1 ring-gray-700">
|
||||
<div className={badgeStyle.join(' ')}>{indicatorIcon}</div>
|
||||
{is4k && <span className="pl-1 pr-2 text-gray-200">4K</span>}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default StatusBadgeMini;
|
||||
@@ -20,7 +20,7 @@ const Tooltip = ({ children, content, tooltipConfig }: TooltipProps) => {
|
||||
return (
|
||||
<>
|
||||
{React.cloneElement(children, { ref: setTriggerRef })}
|
||||
{visible && (
|
||||
{visible && content && (
|
||||
<div
|
||||
ref={setTooltipRef}
|
||||
{...getTooltipProps({
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import CachedImage from '@app/components/Common/CachedImage';
|
||||
import Link from 'next/link';
|
||||
import { useState } from 'react';
|
||||
|
||||
@@ -30,11 +31,15 @@ const CompanyCard = ({ image, url, name }: CompanyCardProps) => {
|
||||
role="link"
|
||||
tabIndex={0}
|
||||
>
|
||||
<img
|
||||
src={image}
|
||||
alt={name}
|
||||
className="relative z-40 max-h-full max-w-full"
|
||||
/>
|
||||
<div className="relative h-full w-full">
|
||||
<CachedImage
|
||||
src={image}
|
||||
alt={name}
|
||||
className="relative z-40 h-full w-full"
|
||||
layout="fill"
|
||||
objectFit="contain"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
className={`absolute bottom-0 left-0 right-0 z-0 h-12 rounded-b-xl bg-gradient-to-t ${
|
||||
isHovered ? 'from-gray-800' : 'from-gray-900'
|
||||
|
||||
@@ -23,10 +23,11 @@ const messages = defineMessages({
|
||||
populartv: 'Popular Series',
|
||||
upcomingtv: 'Upcoming Series',
|
||||
recentlyAdded: 'Recently Added',
|
||||
noRequests: 'No requests.',
|
||||
upcoming: 'Upcoming Movies',
|
||||
trending: 'Trending',
|
||||
plexwatchlist: 'Your Plex Watchlist',
|
||||
emptywatchlist:
|
||||
'Media added to your <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> will appear here.',
|
||||
});
|
||||
|
||||
const Discover = () => {
|
||||
@@ -58,76 +59,97 @@ const Discover = () => {
|
||||
return (
|
||||
<>
|
||||
<PageTitle title={intl.formatMessage(messages.discover)} />
|
||||
{hasPermission([Permission.MANAGE_REQUESTS, Permission.RECENT_VIEW], {
|
||||
type: 'or',
|
||||
}) && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
<div className="slider-title">
|
||||
<span>{intl.formatMessage(messages.recentlyAdded)}</span>
|
||||
{(!media || !!media.results.length) &&
|
||||
!mediaError &&
|
||||
hasPermission([Permission.MANAGE_REQUESTS, Permission.RECENT_VIEW], {
|
||||
type: 'or',
|
||||
}) && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
<div className="slider-title">
|
||||
<span>{intl.formatMessage(messages.recentlyAdded)}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Slider
|
||||
sliderKey="media"
|
||||
isLoading={!media && !mediaError}
|
||||
isEmpty={!!media && !mediaError && media.results.length === 0}
|
||||
items={media?.results?.map((item) => (
|
||||
<TmdbTitleCard
|
||||
key={`media-slider-item-${item.id}`}
|
||||
id={item.id}
|
||||
tmdbId={item.tmdbId}
|
||||
tvdbId={item.tvdbId}
|
||||
type={item.mediaType}
|
||||
/>
|
||||
))}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
<div className="slider-header">
|
||||
<Link href="/requests?filter=all">
|
||||
<a className="slider-title">
|
||||
<span>{intl.formatMessage(messages.recentrequests)}</span>
|
||||
<ArrowCircleRightIcon />
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
<Slider
|
||||
sliderKey="requests"
|
||||
isLoading={!requests && !requestError}
|
||||
isEmpty={!!requests && !requestError && requests.results.length === 0}
|
||||
items={(requests?.results ?? []).map((request) => (
|
||||
<RequestCard
|
||||
key={`request-slider-item-${request.id}`}
|
||||
request={request}
|
||||
/>
|
||||
))}
|
||||
placeholder={<RequestCard.Placeholder />}
|
||||
emptyMessage={intl.formatMessage(messages.noRequests)}
|
||||
/>
|
||||
{(!watchlistItems || !!watchlistItems.results.length) && !watchlistError && (
|
||||
<Slider
|
||||
sliderKey="media"
|
||||
isLoading={!media}
|
||||
items={(media?.results ?? []).map((item) => (
|
||||
<TmdbTitleCard
|
||||
key={`media-slider-item-${item.id}`}
|
||||
id={item.id}
|
||||
tmdbId={item.tmdbId}
|
||||
tvdbId={item.tvdbId}
|
||||
type={item.mediaType}
|
||||
/>
|
||||
))}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
{(!requests || !!requests.results.length) && !requestError && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
<Link href="/discover/watchlist">
|
||||
<Link href="/requests?filter=all">
|
||||
<a className="slider-title">
|
||||
<span>{intl.formatMessage(messages.plexwatchlist)}</span>
|
||||
<span>{intl.formatMessage(messages.recentrequests)}</span>
|
||||
<ArrowCircleRightIcon />
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
<Slider
|
||||
sliderKey="watchlist"
|
||||
isLoading={!watchlistItems && !watchlistError}
|
||||
items={watchlistItems?.results.map((item) => (
|
||||
<TmdbTitleCard
|
||||
id={item.tmdbId}
|
||||
key={`watchlist-slider-item-${item.ratingKey}`}
|
||||
tmdbId={item.tmdbId}
|
||||
type={item.mediaType}
|
||||
sliderKey="requests"
|
||||
isLoading={!requests}
|
||||
items={(requests?.results ?? []).map((request) => (
|
||||
<RequestCard
|
||||
key={`request-slider-item-${request.id}`}
|
||||
request={request}
|
||||
/>
|
||||
))}
|
||||
placeholder={<RequestCard.Placeholder />}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
{user?.userType === UserType.PLEX &&
|
||||
(!watchlistItems ||
|
||||
!!watchlistItems.results.length ||
|
||||
user.settings?.watchlistSyncMovies ||
|
||||
user.settings?.watchlistSyncTv) &&
|
||||
!watchlistError && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
<Link href="/discover/watchlist">
|
||||
<a className="slider-title">
|
||||
<span>{intl.formatMessage(messages.plexwatchlist)}</span>
|
||||
<ArrowCircleRightIcon />
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
<Slider
|
||||
sliderKey="watchlist"
|
||||
isLoading={!watchlistItems}
|
||||
isEmpty={!!watchlistItems && watchlistItems.results.length === 0}
|
||||
emptyMessage={intl.formatMessage(messages.emptywatchlist, {
|
||||
PlexWatchlistSupportLink: (msg: React.ReactNode) => (
|
||||
<a
|
||||
href="https://support.plex.tv/articles/universal-watchlist/"
|
||||
className="text-white transition duration-300 hover:underline"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{msg}
|
||||
</a>
|
||||
),
|
||||
})}
|
||||
items={watchlistItems?.results.map((item) => (
|
||||
<TmdbTitleCard
|
||||
id={item.tmdbId}
|
||||
key={`watchlist-slider-item-${item.ratingKey}`}
|
||||
tmdbId={item.tmdbId}
|
||||
type={item.mediaType}
|
||||
/>
|
||||
))}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
<MediaSlider
|
||||
sliderKey="trending"
|
||||
title={intl.formatMessage(messages.trending)}
|
||||
|
||||
@@ -7,6 +7,7 @@ import PageTitle from '@app/components/Common/PageTitle';
|
||||
import IssueComment from '@app/components/IssueDetails/IssueComment';
|
||||
import IssueDescription from '@app/components/IssueDetails/IssueDescription';
|
||||
import { issueOptions } from '@app/components/IssueModal/constants';
|
||||
import useDeepLinks from '@app/hooks/useDeepLinks';
|
||||
import { Permission, useUser } from '@app/hooks/useUser';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
import Error from '@app/pages/_error';
|
||||
@@ -88,6 +89,13 @@ const IssueDetails = () => {
|
||||
: null
|
||||
);
|
||||
|
||||
const { plexUrl, plexUrl4k } = useDeepLinks({
|
||||
plexUrl: data?.mediaInfo?.plexUrl,
|
||||
plexUrl4k: data?.mediaInfo?.plexUrl4k,
|
||||
iOSPlexUrl: data?.mediaInfo?.iOSPlexUrl,
|
||||
iOSPlexUrl4k: data?.mediaInfo?.iOSPlexUrl4k,
|
||||
});
|
||||
|
||||
const CommentSchema = Yup.object().shape({
|
||||
message: Yup.string().required(),
|
||||
});
|
||||
@@ -354,7 +362,7 @@ const IssueDetails = () => {
|
||||
{issueData?.media.plexUrl && (
|
||||
<Button
|
||||
as="a"
|
||||
href={issueData?.media.plexUrl}
|
||||
href={plexUrl}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="w-full"
|
||||
@@ -387,7 +395,7 @@ const IssueDetails = () => {
|
||||
{issueData?.media.plexUrl4k && (
|
||||
<Button
|
||||
as="a"
|
||||
href={issueData?.media.plexUrl4k}
|
||||
href={plexUrl4k}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="w-full"
|
||||
@@ -590,7 +598,7 @@ const IssueDetails = () => {
|
||||
{issueData?.media.plexUrl && (
|
||||
<Button
|
||||
as="a"
|
||||
href={issueData?.media.plexUrl}
|
||||
href={plexUrl}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="w-full"
|
||||
@@ -623,7 +631,7 @@ const IssueDetails = () => {
|
||||
{issueData?.media.plexUrl4k && (
|
||||
<Button
|
||||
as="a"
|
||||
href={issueData?.media.plexUrl4k}
|
||||
href={plexUrl4k}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="w-full"
|
||||
|
||||
@@ -20,7 +20,6 @@ import * as Yup from 'yup';
|
||||
|
||||
const messages = defineMessages({
|
||||
validationMessageRequired: 'You must provide a description',
|
||||
issomethingwrong: 'Is there a problem with {title}?',
|
||||
whatswrong: "What's wrong?",
|
||||
providedetail:
|
||||
'Please provide a detailed explanation of the issue you encountered.',
|
||||
|
||||
@@ -120,7 +120,7 @@ const Sidebar = ({ open, setClosed }: SidebarProps) => {
|
||||
>
|
||||
<>
|
||||
<div className="sidebar relative flex h-full w-full max-w-xs flex-1 flex-col bg-gray-800">
|
||||
<div className="sidebar-close-button absolute top-0 right-0 -mr-14 p-1">
|
||||
<div className="sidebar-close-button absolute right-0 -mr-14 p-1">
|
||||
<button
|
||||
className="flex h-12 w-12 items-center justify-center rounded-full focus:bg-gray-600 focus:outline-none"
|
||||
aria-label="Close sidebar"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import SearchInput from '@app/components/Layout/SearchInput';
|
||||
import Sidebar from '@app/components/Layout/Sidebar';
|
||||
import UserDropdown from '@app/components/Layout/UserDropdown';
|
||||
import PullToRefresh from '@app/components/PullToRefresh';
|
||||
import type { AvailableLocale } from '@app/context/LanguageContext';
|
||||
import useLocale from '@app/hooks/useLocale';
|
||||
import useSettings from '@app/hooks/useSettings';
|
||||
@@ -57,6 +58,7 @@ const Layout = ({ children }: LayoutProps) => {
|
||||
<Sidebar open={isSidebarOpen} setClosed={() => setSidebarOpen(false)} />
|
||||
|
||||
<div className="relative mb-16 flex w-0 min-w-0 flex-1 flex-col lg:ml-64">
|
||||
<PullToRefresh />
|
||||
<div
|
||||
className={`searchbar fixed left-0 right-0 top-0 z-10 flex flex-shrink-0 bg-opacity-80 transition duration-300 ${
|
||||
isScrolled ? 'bg-gray-700' : 'bg-transparent'
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import TitleCard from '@app/components/TitleCard';
|
||||
import { ArrowCircleRightIcon } from '@heroicons/react/solid';
|
||||
import Link from 'next/link';
|
||||
import { useState } from 'react';
|
||||
import { useInView } from 'react-intersection-observer';
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
|
||||
const messages = defineMessages({
|
||||
@@ -15,6 +17,18 @@ interface ShowMoreCardProps {
|
||||
const ShowMoreCard = ({ url, posters }: ShowMoreCardProps) => {
|
||||
const intl = useIntl();
|
||||
const [isHovered, setHovered] = useState(false);
|
||||
const { ref, inView } = useInView({
|
||||
triggerOnce: true,
|
||||
});
|
||||
|
||||
if (!inView) {
|
||||
return (
|
||||
<div ref={ref}>
|
||||
<TitleCard.Placeholder />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Link href={url}>
|
||||
<a
|
||||
|
||||
@@ -18,6 +18,7 @@ import PersonCard from '@app/components/PersonCard';
|
||||
import RequestButton from '@app/components/RequestButton';
|
||||
import Slider from '@app/components/Slider';
|
||||
import StatusBadge from '@app/components/StatusBadge';
|
||||
import useDeepLinks from '@app/hooks/useDeepLinks';
|
||||
import useLocale from '@app/hooks/useLocale';
|
||||
import useSettings from '@app/hooks/useSettings';
|
||||
import { Permission, useUser } from '@app/hooks/useUser';
|
||||
@@ -123,29 +124,12 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
setShowManager(router.query.manage == '1' ? true : false);
|
||||
}, [router.query.manage]);
|
||||
|
||||
const [plexUrl, setPlexUrl] = useState(data?.mediaInfo?.plexUrl);
|
||||
const [plexUrl4k, setPlexUrl4k] = useState(data?.mediaInfo?.plexUrl4k);
|
||||
|
||||
useEffect(() => {
|
||||
if (data) {
|
||||
if (
|
||||
/iPad|iPhone|iPod/.test(navigator.userAgent) ||
|
||||
(navigator.userAgent === 'MacIntel' && navigator.maxTouchPoints > 1)
|
||||
) {
|
||||
setPlexUrl(data.mediaInfo?.iOSPlexUrl);
|
||||
setPlexUrl4k(data.mediaInfo?.iOSPlexUrl4k);
|
||||
} else {
|
||||
setPlexUrl(data.mediaInfo?.plexUrl);
|
||||
setPlexUrl4k(data.mediaInfo?.plexUrl4k);
|
||||
}
|
||||
}
|
||||
}, [
|
||||
data,
|
||||
data?.mediaInfo?.iOSPlexUrl,
|
||||
data?.mediaInfo?.iOSPlexUrl4k,
|
||||
data?.mediaInfo?.plexUrl,
|
||||
data?.mediaInfo?.plexUrl4k,
|
||||
]);
|
||||
const { plexUrl, plexUrl4k } = useDeepLinks({
|
||||
plexUrl: data?.mediaInfo?.plexUrl,
|
||||
plexUrl4k: data?.mediaInfo?.plexUrl4k,
|
||||
iOSPlexUrl: data?.mediaInfo?.iOSPlexUrl,
|
||||
iOSPlexUrl4k: data?.mediaInfo?.iOSPlexUrl4k,
|
||||
});
|
||||
|
||||
if (!data && !error) {
|
||||
return <LoadingSpinner />;
|
||||
@@ -324,7 +308,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
inProgress={(data.mediaInfo?.downloadStatus ?? []).length > 0}
|
||||
tmdbId={data.mediaInfo?.tmdbId}
|
||||
mediaType="movie"
|
||||
plexUrl={data.mediaInfo?.plexUrl}
|
||||
plexUrl={plexUrl}
|
||||
serviceUrl={data.mediaInfo?.serviceUrl}
|
||||
/>
|
||||
{settings.currentSettings.movie4kEnabled &&
|
||||
@@ -346,7 +330,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
|
||||
}
|
||||
tmdbId={data.mediaInfo?.tmdbId}
|
||||
mediaType="movie"
|
||||
plexUrl={data.mediaInfo?.plexUrl4k}
|
||||
plexUrl={plexUrl4k}
|
||||
serviceUrl={data.mediaInfo?.serviceUrl4k}
|
||||
/>
|
||||
)}
|
||||
|
||||
45
src/components/PullToRefresh/index.tsx
Normal file
45
src/components/PullToRefresh/index.tsx
Normal file
@@ -0,0 +1,45 @@
|
||||
import { RefreshIcon } from '@heroicons/react/outline';
|
||||
import { useRouter } from 'next/router';
|
||||
import PR from 'pulltorefreshjs';
|
||||
import { useEffect } from 'react';
|
||||
import ReactDOMServer from 'react-dom/server';
|
||||
|
||||
const PullToRefresh = () => {
|
||||
const router = useRouter();
|
||||
|
||||
useEffect(() => {
|
||||
PR.init({
|
||||
mainElement: '#pull-to-refresh',
|
||||
onRefresh() {
|
||||
router.reload();
|
||||
},
|
||||
iconArrow: ReactDOMServer.renderToString(
|
||||
<div className="p-2">
|
||||
<RefreshIcon className="z-50 m-auto h-9 w-9 rounded-full border-4 border-gray-800 bg-gray-800 text-indigo-500 ring-1 ring-gray-700" />
|
||||
</div>
|
||||
),
|
||||
iconRefreshing: ReactDOMServer.renderToString(
|
||||
<div
|
||||
className="animate-spin p-2"
|
||||
style={{ animationDirection: 'reverse' }}
|
||||
>
|
||||
<RefreshIcon className="z-50 m-auto h-9 w-9 rounded-full border-4 border-gray-800 bg-gray-800 text-indigo-500 ring-1 ring-gray-700" />
|
||||
</div>
|
||||
),
|
||||
instructionsPullToRefresh: ReactDOMServer.renderToString(<div />),
|
||||
instructionsReleaseToRefresh: ReactDOMServer.renderToString(<div />),
|
||||
instructionsRefreshing: ReactDOMServer.renderToString(<div />),
|
||||
distReload: 60,
|
||||
distIgnore: 15,
|
||||
shouldPullToRefresh: () =>
|
||||
!window.scrollY && document.body.style.overflow !== 'hidden',
|
||||
});
|
||||
return () => {
|
||||
PR.destroyAll();
|
||||
};
|
||||
}, [router]);
|
||||
|
||||
return <div id="pull-to-refresh"></div>;
|
||||
};
|
||||
|
||||
export default PullToRefresh;
|
||||
@@ -292,7 +292,6 @@ const RequestButton = ({
|
||||
}) &&
|
||||
media &&
|
||||
media.status !== MediaStatus.AVAILABLE &&
|
||||
media.status !== MediaStatus.UNKNOWN &&
|
||||
!isShowComplete
|
||||
) {
|
||||
buttons.push({
|
||||
@@ -338,7 +337,6 @@ const RequestButton = ({
|
||||
}) &&
|
||||
media &&
|
||||
media.status4k !== MediaStatus.AVAILABLE &&
|
||||
media.status4k !== MediaStatus.UNKNOWN &&
|
||||
!is4kShowComplete &&
|
||||
settings.currentSettings.series4kEnabled
|
||||
) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import CachedImage from '@app/components/Common/CachedImage';
|
||||
import Tooltip from '@app/components/Common/Tooltip';
|
||||
import RequestModal from '@app/components/RequestModal';
|
||||
import StatusBadge from '@app/components/StatusBadge';
|
||||
import useDeepLinks from '@app/hooks/useDeepLinks';
|
||||
import { Permission, useUser } from '@app/hooks/useUser';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
import { withProperties } from '@app/utils/typeHelpers';
|
||||
@@ -61,6 +62,13 @@ const RequestCardError = ({ requestData }: RequestCardErrorProps) => {
|
||||
const { hasPermission } = useUser();
|
||||
const intl = useIntl();
|
||||
|
||||
const { plexUrl, plexUrl4k } = useDeepLinks({
|
||||
plexUrl: requestData?.media?.plexUrl,
|
||||
plexUrl4k: requestData?.media?.plexUrl4k,
|
||||
iOSPlexUrl: requestData?.media?.iOSPlexUrl,
|
||||
iOSPlexUrl4k: requestData?.media?.iOSPlexUrl4k,
|
||||
});
|
||||
|
||||
const deleteRequest = async () => {
|
||||
await axios.delete(`/api/v1/media/${requestData?.media.id}`);
|
||||
mutate('/api/v1/media?filter=allavailable&take=20&sort=mediaAdded');
|
||||
@@ -138,11 +146,7 @@ const RequestCardError = ({ requestData }: RequestCardErrorProps) => {
|
||||
).length > 0
|
||||
}
|
||||
is4k={requestData.is4k}
|
||||
plexUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.plexUrl4k
|
||||
: requestData.media.plexUrl
|
||||
}
|
||||
plexUrl={requestData.is4k ? plexUrl4k : plexUrl}
|
||||
serviceUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.serviceUrl4k
|
||||
@@ -217,6 +221,13 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
|
||||
fallbackData: request,
|
||||
});
|
||||
|
||||
const { plexUrl, plexUrl4k } = useDeepLinks({
|
||||
plexUrl: requestData?.media?.plexUrl,
|
||||
plexUrl4k: requestData?.media?.plexUrl4k,
|
||||
iOSPlexUrl: requestData?.media?.iOSPlexUrl,
|
||||
iOSPlexUrl4k: requestData?.media?.iOSPlexUrl4k,
|
||||
});
|
||||
|
||||
const modifyRequest = async (type: 'approve' | 'decline') => {
|
||||
const response = await axios.post(`/api/v1/request/${request.id}/${type}`);
|
||||
|
||||
@@ -357,20 +368,13 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
|
||||
: request.seasons.length,
|
||||
})}
|
||||
</span>
|
||||
{title.seasons.filter((season) => season.seasonNumber !== 0)
|
||||
.length === request.seasons.length ? (
|
||||
<span className="mr-2 uppercase">
|
||||
<Badge>{intl.formatMessage(globalMessages.all)}</Badge>
|
||||
</span>
|
||||
) : (
|
||||
<div className="hide-scrollbar overflow-x-scroll">
|
||||
{request.seasons.map((season) => (
|
||||
<span key={`season-${season.id}`} className="mr-2">
|
||||
<Badge>{season.seasonNumber}</Badge>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
<div className="hide-scrollbar overflow-x-scroll">
|
||||
{request.seasons.map((season) => (
|
||||
<span key={`season-${season.id}`} className="mr-2">
|
||||
<Badge>{season.seasonNumber}</Badge>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<div className="mt-2 flex items-center text-sm sm:mt-1">
|
||||
@@ -403,11 +407,7 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
|
||||
is4k={requestData.is4k}
|
||||
tmdbId={requestData.media.tmdbId}
|
||||
mediaType={requestData.type}
|
||||
plexUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.plexUrl4k
|
||||
: requestData.media.plexUrl
|
||||
}
|
||||
plexUrl={requestData.is4k ? plexUrl4k : plexUrl}
|
||||
serviceUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.serviceUrl4k
|
||||
|
||||
@@ -4,6 +4,7 @@ import CachedImage from '@app/components/Common/CachedImage';
|
||||
import ConfirmButton from '@app/components/Common/ConfirmButton';
|
||||
import RequestModal from '@app/components/RequestModal';
|
||||
import StatusBadge from '@app/components/StatusBadge';
|
||||
import useDeepLinks from '@app/hooks/useDeepLinks';
|
||||
import { Permission, useUser } from '@app/hooks/useUser';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
import {
|
||||
@@ -61,6 +62,13 @@ const RequestItemError = ({
|
||||
revalidateList();
|
||||
};
|
||||
|
||||
const { plexUrl, plexUrl4k } = useDeepLinks({
|
||||
plexUrl: requestData?.media?.plexUrl,
|
||||
plexUrl4k: requestData?.media?.plexUrl4k,
|
||||
iOSPlexUrl: requestData?.media?.iOSPlexUrl,
|
||||
iOSPlexUrl4k: requestData?.media?.iOSPlexUrl4k,
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="flex h-64 w-full flex-col justify-center rounded-xl bg-gray-800 py-4 text-gray-400 shadow-md ring-1 ring-red-500 xl:h-28 xl:flex-row">
|
||||
<div className="flex w-full flex-col justify-between overflow-hidden sm:flex-row">
|
||||
@@ -130,11 +138,7 @@ const RequestItemError = ({
|
||||
).length > 0
|
||||
}
|
||||
is4k={requestData.is4k}
|
||||
plexUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.plexUrl4k
|
||||
: requestData.media.plexUrl
|
||||
}
|
||||
plexUrl={requestData.is4k ? plexUrl4k : plexUrl}
|
||||
serviceUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.serviceUrl4k
|
||||
@@ -316,6 +320,13 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
}
|
||||
};
|
||||
|
||||
const { plexUrl, plexUrl4k } = useDeepLinks({
|
||||
plexUrl: requestData?.media?.plexUrl,
|
||||
plexUrl4k: requestData?.media?.plexUrl4k,
|
||||
iOSPlexUrl: requestData?.media?.iOSPlexUrl,
|
||||
iOSPlexUrl4k: requestData?.media?.iOSPlexUrl4k,
|
||||
});
|
||||
|
||||
if (!title && !error) {
|
||||
return (
|
||||
<div
|
||||
@@ -420,20 +431,13 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
: request.seasons.length,
|
||||
})}
|
||||
</span>
|
||||
{title.seasons.filter((season) => season.seasonNumber !== 0)
|
||||
.length === request.seasons.length ? (
|
||||
<span className="mr-2 uppercase">
|
||||
<Badge>{intl.formatMessage(globalMessages.all)}</Badge>
|
||||
</span>
|
||||
) : (
|
||||
<div className="hide-scrollbar flex flex-nowrap overflow-x-scroll">
|
||||
{request.seasons.map((season) => (
|
||||
<span key={`season-${season.id}`} className="mr-2">
|
||||
<Badge>{season.seasonNumber}</Badge>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
<div className="hide-scrollbar flex flex-nowrap overflow-x-scroll">
|
||||
{request.seasons.map((season) => (
|
||||
<span key={`season-${season.id}`} className="mr-2">
|
||||
<Badge>{season.seasonNumber}</Badge>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -469,11 +473,7 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
|
||||
is4k={requestData.is4k}
|
||||
tmdbId={requestData.media.tmdbId}
|
||||
mediaType={requestData.type}
|
||||
plexUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.plexUrl4k
|
||||
: requestData.media.plexUrl
|
||||
}
|
||||
plexUrl={requestData.is4k ? plexUrl4k : plexUrl}
|
||||
serviceUrl={
|
||||
requestData.is4k
|
||||
? requestData.media.serviceUrl4k
|
||||
|
||||
@@ -44,6 +44,7 @@ const RequestList = () => {
|
||||
const { user } = useUser({
|
||||
id: Number(router.query.userId),
|
||||
});
|
||||
const { user: currentUser } = useUser();
|
||||
const [currentFilter, setCurrentFilter] = useState<Filter>(Filter.PENDING);
|
||||
const [currentSort, setCurrentSort] = useState<Sort>('added');
|
||||
const [currentPageSize, setCurrentPageSize] = useState<number>(10);
|
||||
@@ -60,7 +61,11 @@ const RequestList = () => {
|
||||
`/api/v1/request?take=${currentPageSize}&skip=${
|
||||
pageIndex * currentPageSize
|
||||
}&filter=${currentFilter}&sort=${currentSort}${
|
||||
router.query.userId ? `&requestedBy=${router.query.userId}` : ''
|
||||
router.pathname.startsWith('/profile')
|
||||
? `&requestedBy=${currentUser?.id}`
|
||||
: router.query.userId
|
||||
? `&requestedBy=${router.query.userId}`
|
||||
: ''
|
||||
}`
|
||||
);
|
||||
|
||||
@@ -116,7 +121,11 @@ const RequestList = () => {
|
||||
<div className="mb-4 flex flex-col justify-between lg:flex-row lg:items-end">
|
||||
<Header
|
||||
subtext={
|
||||
router.query.userId ? (
|
||||
router.pathname.startsWith('/profile') ? (
|
||||
<Link href={`/profile`}>
|
||||
<a className="hover:underline">{currentUser?.displayName}</a>
|
||||
</Link>
|
||||
) : router.query.userId ? (
|
||||
<Link href={`/users/${user?.id}`}>
|
||||
<a className="hover:underline">{user?.displayName}</a>
|
||||
</Link>
|
||||
|
||||
@@ -11,8 +11,9 @@ import type {
|
||||
ServiceCommonServerWithDetails,
|
||||
} from '@server/interfaces/api/serviceInterfaces';
|
||||
import type { UserResultsResponse } from '@server/interfaces/api/userInterfaces';
|
||||
import { hasPermission } from '@server/lib/permissions';
|
||||
import { isEqual } from 'lodash';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
import Select from 'react-select';
|
||||
import useSWR from 'swr';
|
||||
@@ -64,7 +65,7 @@ const AdvancedRequester = ({
|
||||
onChange,
|
||||
}: AdvancedRequesterProps) => {
|
||||
const intl = useIntl();
|
||||
const { user, hasPermission } = useUser();
|
||||
const { user: currentUser, hasPermission: currentHasPermission } = useUser();
|
||||
const { data, error } = useSWR<ServiceCommonServer[]>(
|
||||
`/api/v1/service/${type === 'movie' ? 'radarr' : 'sonarr'}`,
|
||||
{
|
||||
@@ -113,16 +114,41 @@ const AdvancedRequester = ({
|
||||
);
|
||||
|
||||
const { data: userData } = useSWR<UserResultsResponse>(
|
||||
hasPermission([Permission.MANAGE_REQUESTS, Permission.MANAGE_USERS])
|
||||
currentHasPermission([Permission.MANAGE_REQUESTS, Permission.MANAGE_USERS])
|
||||
? '/api/v1/user?take=1000&sort=displayname'
|
||||
: null
|
||||
);
|
||||
const filteredUserData = useMemo(
|
||||
() =>
|
||||
userData?.results.filter((user) =>
|
||||
hasPermission(
|
||||
is4k
|
||||
? [
|
||||
Permission.REQUEST_4K,
|
||||
type === 'movie'
|
||||
? Permission.REQUEST_4K_MOVIE
|
||||
: Permission.REQUEST_4K_TV,
|
||||
]
|
||||
: [
|
||||
Permission.REQUEST,
|
||||
type === 'movie'
|
||||
? Permission.REQUEST_MOVIE
|
||||
: Permission.REQUEST_TV,
|
||||
],
|
||||
user.permissions,
|
||||
{ type: 'or' }
|
||||
)
|
||||
),
|
||||
[userData?.results]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
if (userData?.results && !requestUser) {
|
||||
setSelectedUser(userData.results.find((u) => u.id === user?.id) ?? null);
|
||||
if (filteredUserData && !requestUser) {
|
||||
setSelectedUser(
|
||||
filteredUserData.find((u) => u.id === currentUser?.id) ?? null
|
||||
);
|
||||
}
|
||||
}, [userData?.results]);
|
||||
}, [filteredUserData]);
|
||||
|
||||
useEffect(() => {
|
||||
let defaultServer = data?.find(
|
||||
@@ -273,7 +299,7 @@ const AdvancedRequester = ({
|
||||
serverData.rootFolders.length < 2 &&
|
||||
(serverData.languageProfiles ?? []).length < 2 &&
|
||||
!serverData.tags?.length)))) &&
|
||||
(!selectedUser || (userData?.results ?? []).length < 2)
|
||||
(!selectedUser || (filteredUserData ?? []).length < 2)
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
@@ -512,9 +538,12 @@ const AdvancedRequester = ({
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{hasPermission([Permission.MANAGE_REQUESTS, Permission.MANAGE_USERS]) &&
|
||||
{currentHasPermission([
|
||||
Permission.MANAGE_REQUESTS,
|
||||
Permission.MANAGE_USERS,
|
||||
]) &&
|
||||
selectedUser &&
|
||||
(userData?.results ?? []).length > 1 && (
|
||||
(filteredUserData ?? []).length > 1 && (
|
||||
<Listbox
|
||||
as="div"
|
||||
value={selectedUser}
|
||||
@@ -565,7 +594,7 @@ const AdvancedRequester = ({
|
||||
static
|
||||
className="shadow-xs max-h-60 overflow-auto rounded-md py-1 text-base leading-6 focus:outline-none sm:text-sm sm:leading-5"
|
||||
>
|
||||
{userData?.results.map((user) => (
|
||||
{filteredUserData?.map((user) => (
|
||||
<Listbox.Option key={user.id} value={user}>
|
||||
{({ selected, active }) => (
|
||||
<div
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import Alert from '@app/components/Common/Alert';
|
||||
import { SmallLoadingSpinner } from '@app/components/Common/LoadingSpinner';
|
||||
import Modal from '@app/components/Common/Modal';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
import type { SonarrSeries } from '@server/api/servarr/sonarr';
|
||||
@@ -8,30 +7,30 @@ import useSWR from 'swr';
|
||||
|
||||
const messages = defineMessages({
|
||||
notvdbiddescription:
|
||||
"We couldn't automatically match your request. Please select the correct match from the list below.",
|
||||
nosummary: 'No summary for this title was found.',
|
||||
'We were unable to automatically match this series. Please select the correct match below.',
|
||||
nomatches: 'We were unable to find a match for this series.',
|
||||
});
|
||||
|
||||
interface SearchByNameModalProps {
|
||||
setTvdbId: (id: number) => void;
|
||||
tvdbId: number | undefined;
|
||||
loading: boolean;
|
||||
onCancel?: () => void;
|
||||
closeModal: () => void;
|
||||
modalTitle: string;
|
||||
modalSubTitle: string;
|
||||
tmdbId: number;
|
||||
backdrop?: string;
|
||||
}
|
||||
|
||||
const SearchByNameModal = ({
|
||||
setTvdbId,
|
||||
tvdbId,
|
||||
loading,
|
||||
onCancel,
|
||||
closeModal,
|
||||
modalTitle,
|
||||
modalSubTitle,
|
||||
tmdbId,
|
||||
backdrop,
|
||||
}: SearchByNameModalProps) => {
|
||||
const intl = useIntl();
|
||||
const { data, error } = useSWR<SonarrSeries[]>(
|
||||
@@ -42,9 +41,25 @@ const SearchByNameModal = ({
|
||||
setTvdbId(tvdbId);
|
||||
};
|
||||
|
||||
if ((data ?? []).length === 0 || error) {
|
||||
return (
|
||||
<Modal
|
||||
loading={!data && !error}
|
||||
backgroundClickable
|
||||
onOk={onCancel}
|
||||
title={modalTitle}
|
||||
subTitle={modalSubTitle}
|
||||
okText={intl.formatMessage(globalMessages.close)}
|
||||
okButtonType="primary"
|
||||
backdrop={backdrop}
|
||||
>
|
||||
<Alert title={intl.formatMessage(messages.nomatches)} type="info" />
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Modal
|
||||
loading={loading && !error}
|
||||
backgroundClickable
|
||||
onCancel={onCancel}
|
||||
onOk={closeModal}
|
||||
@@ -53,12 +68,12 @@ const SearchByNameModal = ({
|
||||
okText={intl.formatMessage(globalMessages.next)}
|
||||
okDisabled={!tvdbId}
|
||||
okButtonType="primary"
|
||||
backdrop={backdrop}
|
||||
>
|
||||
<Alert
|
||||
title={intl.formatMessage(messages.notvdbiddescription)}
|
||||
type="info"
|
||||
/>
|
||||
{!data && !error && <SmallLoadingSpinner />}
|
||||
<div className="grid grid-cols-1 gap-4 pb-2 md:grid-cols-2">
|
||||
{data?.slice(0, 6).map((item) => (
|
||||
<button
|
||||
@@ -67,7 +82,7 @@ const SearchByNameModal = ({
|
||||
onClick={() => handleClick(item.tvdbId)}
|
||||
>
|
||||
<div
|
||||
className={`flex h-40 w-full items-center overflow-hidden rounded-xl bg-gray-600 p-2 shadow transition ${
|
||||
className={`flex h-40 w-full items-center overflow-hidden rounded-xl border border-gray-700 bg-gray-700 bg-opacity-20 p-2 shadow backdrop-blur transition ${
|
||||
tvdbId === item.tvdbId ? 'ring ring-indigo-500' : ''
|
||||
} `}
|
||||
>
|
||||
@@ -82,12 +97,35 @@ const SearchByNameModal = ({
|
||||
/>
|
||||
</div>
|
||||
<div className="flex-grow self-start p-3 text-left">
|
||||
<div className="text-grey-200 text-sm font-medium">
|
||||
<div className="text-sm font-medium leading-tight">
|
||||
{item.year}
|
||||
</div>
|
||||
<div
|
||||
className="text-grey-200 text-xl font-bold leading-tight"
|
||||
style={{
|
||||
WebkitLineClamp: 1,
|
||||
display: '-webkit-box',
|
||||
overflow: 'hidden',
|
||||
WebkitBoxOrient: 'vertical',
|
||||
wordBreak: 'break-word',
|
||||
}}
|
||||
>
|
||||
{item.title}
|
||||
</div>
|
||||
<div className="h-24 overflow-hidden text-sm text-gray-400">
|
||||
{item.overview ?? intl.formatMessage(messages.nosummary)}
|
||||
</div>
|
||||
{item.overview && (
|
||||
<div
|
||||
className="whitespace-normal text-xs text-gray-400"
|
||||
style={{
|
||||
WebkitLineClamp: 5,
|
||||
display: '-webkit-box',
|
||||
overflow: 'hidden',
|
||||
WebkitBoxOrient: 'vertical',
|
||||
wordBreak: 'break-word',
|
||||
}}
|
||||
>
|
||||
{item.overview}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
@@ -358,18 +358,18 @@ const TvRequestModal = ({
|
||||
|
||||
const isOwner = editRequest && editRequest.requestedBy.id === user?.id;
|
||||
|
||||
return data && !data.externalIds.tvdbId && searchModal.show ? (
|
||||
return data && !error && !data.externalIds.tvdbId && searchModal.show ? (
|
||||
<SearchByNameModal
|
||||
tvdbId={tvdbId}
|
||||
setTvdbId={setTvdbId}
|
||||
closeModal={() => setSearchModal({ show: false })}
|
||||
loading={!error}
|
||||
onCancel={onCancel}
|
||||
modalTitle={intl.formatMessage(
|
||||
is4k ? messages.requestseries4ktitle : messages.requestseriestitle
|
||||
)}
|
||||
modalSubTitle={data.name}
|
||||
tmdbId={tmdbId}
|
||||
backdrop={`https://image.tmdb.org/t/p/w1920_and_h800_multi_faces/${data?.backdropPath}`}
|
||||
/>
|
||||
) : (
|
||||
<Modal
|
||||
|
||||
@@ -5,15 +5,20 @@ import LoadingSpinner from '@app/components/Common/LoadingSpinner';
|
||||
import Modal from '@app/components/Common/Modal';
|
||||
import PageTitle from '@app/components/Common/PageTitle';
|
||||
import Table from '@app/components/Common/Table';
|
||||
import useLocale from '@app/hooks/useLocale';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
import { formatBytes } from '@app/utils/numberHelpers';
|
||||
import { Transition } from '@headlessui/react';
|
||||
import { PlayIcon, StopIcon, TrashIcon } from '@heroicons/react/outline';
|
||||
import { PencilIcon } from '@heroicons/react/solid';
|
||||
import type { CacheItem } from '@server/interfaces/api/settingsInterfaces';
|
||||
import type {
|
||||
CacheItem,
|
||||
CacheResponse,
|
||||
} from '@server/interfaces/api/settingsInterfaces';
|
||||
import type { JobId } from '@server/lib/settings';
|
||||
import axios from 'axios';
|
||||
import { Fragment, useState } from 'react';
|
||||
import cronstrue from 'cronstrue/i18n';
|
||||
import { Fragment, useReducer, useState } from 'react';
|
||||
import type { MessageDescriptor } from 'react-intl';
|
||||
import { defineMessages, FormattedRelativeTime, useIntl } from 'react-intl';
|
||||
import { useToasts } from 'react-toast-notifications';
|
||||
@@ -52,14 +57,21 @@ const messages: { [messageName: string]: MessageDescriptor } = defineMessages({
|
||||
'sonarr-scan': 'Sonarr Scan',
|
||||
'download-sync': 'Download Sync',
|
||||
'download-sync-reset': 'Download Sync Reset',
|
||||
'image-cache-cleanup': 'Image Cache Cleanup',
|
||||
editJobSchedule: 'Modify Job',
|
||||
jobScheduleEditSaved: 'Job edited successfully!',
|
||||
jobScheduleEditFailed: 'Something went wrong while saving the job.',
|
||||
editJobSchedulePrompt: 'Frequency',
|
||||
editJobScheduleCurrent: 'Current Frequency',
|
||||
editJobSchedulePrompt: 'New Frequency',
|
||||
editJobScheduleSelectorHours:
|
||||
'Every {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}',
|
||||
editJobScheduleSelectorMinutes:
|
||||
'Every {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}',
|
||||
imagecache: 'Image Cache',
|
||||
imagecacheDescription:
|
||||
'When enabled in settings, Overseerr will proxy and cache images from pre-configured external sources. Cached images are saved into your config folder. You can find the files in <code>{appDataPath}/cache/images</code>.',
|
||||
imagecachecount: 'Images Cached',
|
||||
imagecachesize: 'Total Cache Size',
|
||||
});
|
||||
|
||||
interface Job {
|
||||
@@ -67,12 +79,56 @@ interface Job {
|
||||
name: string;
|
||||
type: 'process' | 'command';
|
||||
interval: 'short' | 'long' | 'fixed';
|
||||
cronSchedule: string;
|
||||
nextExecutionTime: string;
|
||||
running: boolean;
|
||||
}
|
||||
|
||||
type JobModalState = {
|
||||
isOpen?: boolean;
|
||||
job?: Job;
|
||||
scheduleHours: number;
|
||||
scheduleMinutes: number;
|
||||
};
|
||||
|
||||
type JobModalAction =
|
||||
| { type: 'set'; hours?: number; minutes?: number }
|
||||
| {
|
||||
type: 'close';
|
||||
}
|
||||
| { type: 'open'; job?: Job };
|
||||
|
||||
const jobModalReducer = (
|
||||
state: JobModalState,
|
||||
action: JobModalAction
|
||||
): JobModalState => {
|
||||
switch (action.type) {
|
||||
case 'close':
|
||||
return {
|
||||
...state,
|
||||
isOpen: false,
|
||||
};
|
||||
|
||||
case 'open':
|
||||
return {
|
||||
isOpen: true,
|
||||
job: action.job,
|
||||
scheduleHours: 1,
|
||||
scheduleMinutes: 5,
|
||||
};
|
||||
|
||||
case 'set':
|
||||
return {
|
||||
...state,
|
||||
scheduleHours: action.hours ?? state.scheduleHours,
|
||||
scheduleMinutes: action.minutes ?? state.scheduleMinutes,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const SettingsJobs = () => {
|
||||
const intl = useIntl();
|
||||
const { locale } = useLocale();
|
||||
const { addToast } = useToasts();
|
||||
const {
|
||||
data,
|
||||
@@ -81,22 +137,20 @@ const SettingsJobs = () => {
|
||||
} = useSWR<Job[]>('/api/v1/settings/jobs', {
|
||||
refreshInterval: 5000,
|
||||
});
|
||||
const { data: cacheData, mutate: cacheRevalidate } = useSWR<CacheItem[]>(
|
||||
const { data: appData } = useSWR('/api/v1/status/appdata');
|
||||
const { data: cacheData, mutate: cacheRevalidate } = useSWR<CacheResponse>(
|
||||
'/api/v1/settings/cache',
|
||||
{
|
||||
refreshInterval: 10000,
|
||||
}
|
||||
);
|
||||
|
||||
const [jobEditModal, setJobEditModal] = useState<{
|
||||
isOpen: boolean;
|
||||
job?: Job;
|
||||
}>({
|
||||
const [jobModalState, dispatch] = useReducer(jobModalReducer, {
|
||||
isOpen: false,
|
||||
scheduleHours: 1,
|
||||
scheduleMinutes: 5,
|
||||
});
|
||||
const [isSaving, setIsSaving] = useState(false);
|
||||
const [jobScheduleMinutes, setJobScheduleMinutes] = useState(5);
|
||||
const [jobScheduleHours, setJobScheduleHours] = useState(1);
|
||||
|
||||
if (!data && !error) {
|
||||
return <LoadingSpinner />;
|
||||
@@ -146,10 +200,10 @@ const SettingsJobs = () => {
|
||||
const jobScheduleCron = ['0', '0', '*', '*', '*', '*'];
|
||||
|
||||
try {
|
||||
if (jobEditModal.job?.interval === 'short') {
|
||||
jobScheduleCron[1] = `*/${jobScheduleMinutes}`;
|
||||
} else if (jobEditModal.job?.interval === 'long') {
|
||||
jobScheduleCron[2] = `*/${jobScheduleHours}`;
|
||||
if (jobModalState.job?.interval === 'short') {
|
||||
jobScheduleCron[1] = `*/${jobModalState.scheduleMinutes}`;
|
||||
} else if (jobModalState.job?.interval === 'long') {
|
||||
jobScheduleCron[2] = `*/${jobModalState.scheduleHours}`;
|
||||
} else {
|
||||
// jobs with interval: fixed should not be editable
|
||||
throw new Error();
|
||||
@@ -157,16 +211,18 @@ const SettingsJobs = () => {
|
||||
|
||||
setIsSaving(true);
|
||||
await axios.post(
|
||||
`/api/v1/settings/jobs/${jobEditModal.job?.id}/schedule`,
|
||||
`/api/v1/settings/jobs/${jobModalState.job.id}/schedule`,
|
||||
{
|
||||
schedule: jobScheduleCron.join(' '),
|
||||
}
|
||||
);
|
||||
|
||||
addToast(intl.formatMessage(messages.jobScheduleEditSaved), {
|
||||
appearance: 'success',
|
||||
autoDismiss: true,
|
||||
});
|
||||
setJobEditModal({ isOpen: false });
|
||||
|
||||
dispatch({ type: 'close' });
|
||||
revalidate();
|
||||
} catch (e) {
|
||||
addToast(intl.formatMessage(messages.jobScheduleEditFailed), {
|
||||
@@ -194,7 +250,7 @@ const SettingsJobs = () => {
|
||||
leave="opacity-100 transition duration-300"
|
||||
leaveFrom="opacity-100"
|
||||
leaveTo="opacity-0"
|
||||
show={jobEditModal.isOpen}
|
||||
show={jobModalState.isOpen}
|
||||
>
|
||||
<Modal
|
||||
title={intl.formatMessage(messages.editJobSchedule)}
|
||||
@@ -203,24 +259,43 @@ const SettingsJobs = () => {
|
||||
? intl.formatMessage(globalMessages.saving)
|
||||
: intl.formatMessage(globalMessages.save)
|
||||
}
|
||||
onCancel={() => setJobEditModal({ isOpen: false })}
|
||||
onCancel={() => dispatch({ type: 'close' })}
|
||||
okDisabled={isSaving}
|
||||
onOk={() => scheduleJob()}
|
||||
>
|
||||
<div className="section">
|
||||
<form>
|
||||
<div className="form-row pb-6">
|
||||
<form className="mb-6">
|
||||
<div className="form-row">
|
||||
<label className="text-label">
|
||||
{intl.formatMessage(messages.editJobScheduleCurrent)}
|
||||
</label>
|
||||
<div className="form-input-area mt-2 mb-1">
|
||||
<div>
|
||||
{jobModalState.job &&
|
||||
cronstrue.toString(jobModalState.job.cronSchedule, {
|
||||
locale,
|
||||
})}
|
||||
</div>
|
||||
<div className="text-sm text-gray-500">
|
||||
{jobModalState.job?.cronSchedule}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="form-row">
|
||||
<label htmlFor="jobSchedule" className="text-label">
|
||||
{intl.formatMessage(messages.editJobSchedulePrompt)}
|
||||
</label>
|
||||
<div className="form-input-area">
|
||||
{jobEditModal.job?.interval === 'short' ? (
|
||||
{jobModalState.job?.interval === 'short' ? (
|
||||
<select
|
||||
name="jobScheduleMinutes"
|
||||
className="inline"
|
||||
value={jobScheduleMinutes}
|
||||
value={jobModalState.scheduleMinutes}
|
||||
onChange={(e) =>
|
||||
setJobScheduleMinutes(Number(e.target.value))
|
||||
dispatch({
|
||||
type: 'set',
|
||||
minutes: Number(e.target.value),
|
||||
})
|
||||
}
|
||||
>
|
||||
{[5, 10, 15, 20, 30, 60].map((v) => (
|
||||
@@ -238,9 +313,12 @@ const SettingsJobs = () => {
|
||||
<select
|
||||
name="jobScheduleHours"
|
||||
className="inline"
|
||||
value={jobScheduleHours}
|
||||
value={jobModalState.scheduleHours}
|
||||
onChange={(e) =>
|
||||
setJobScheduleHours(Number(e.target.value))
|
||||
dispatch({
|
||||
type: 'set',
|
||||
hours: Number(e.target.value),
|
||||
})
|
||||
}
|
||||
>
|
||||
{[1, 2, 3, 4, 6, 8, 12, 24, 48, 72].map((v) => (
|
||||
@@ -319,9 +397,7 @@ const SettingsJobs = () => {
|
||||
<Button
|
||||
className="mr-2"
|
||||
buttonType="warning"
|
||||
onClick={() =>
|
||||
setJobEditModal({ isOpen: true, job: job })
|
||||
}
|
||||
onClick={() => dispatch({ type: 'open', job })}
|
||||
>
|
||||
<PencilIcon />
|
||||
<span>{intl.formatMessage(globalMessages.edit)}</span>
|
||||
@@ -364,7 +440,7 @@ const SettingsJobs = () => {
|
||||
</tr>
|
||||
</thead>
|
||||
<Table.TBody>
|
||||
{cacheData?.map((cache) => (
|
||||
{cacheData?.apiCaches.map((cache) => (
|
||||
<tr key={`cache-list-${cache.id}`}>
|
||||
<Table.TD>{cache.name}</Table.TD>
|
||||
<Table.TD>{intl.formatNumber(cache.stats.hits)}</Table.TD>
|
||||
@@ -383,6 +459,41 @@ const SettingsJobs = () => {
|
||||
</Table.TBody>
|
||||
</Table>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="heading">{intl.formatMessage(messages.imagecache)}</h3>
|
||||
<p className="description">
|
||||
{intl.formatMessage(messages.imagecacheDescription, {
|
||||
code: (msg: React.ReactNode) => (
|
||||
<code className="bg-opacity-50">{msg}</code>
|
||||
),
|
||||
appDataPath: appData ? appData.appDataPath : '/app/config',
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
<div className="section">
|
||||
<Table>
|
||||
<thead>
|
||||
<tr>
|
||||
<Table.TH>{intl.formatMessage(messages.cachename)}</Table.TH>
|
||||
<Table.TH>
|
||||
{intl.formatMessage(messages.imagecachecount)}
|
||||
</Table.TH>
|
||||
<Table.TH>{intl.formatMessage(messages.imagecachesize)}</Table.TH>
|
||||
</tr>
|
||||
</thead>
|
||||
<Table.TBody>
|
||||
<tr>
|
||||
<Table.TD>The Movie Database (tmdb)</Table.TD>
|
||||
<Table.TD>
|
||||
{intl.formatNumber(cacheData?.imageCache.tmdb.imageCount ?? 0)}
|
||||
</Table.TD>
|
||||
<Table.TD>
|
||||
{formatBytes(cacheData?.imageCache.tmdb.size ?? 0)}
|
||||
</Table.TD>
|
||||
</tr>
|
||||
</Table.TBody>
|
||||
</Table>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -5,6 +5,7 @@ import Modal from '@app/components/Common/Modal';
|
||||
import PageTitle from '@app/components/Common/PageTitle';
|
||||
import Table from '@app/components/Common/Table';
|
||||
import Tooltip from '@app/components/Common/Tooltip';
|
||||
import useDebouncedState from '@app/hooks/useDebouncedState';
|
||||
import { useUpdateQueryParams } from '@app/hooks/useUpdateQueryParams';
|
||||
import globalMessages from '@app/i18n/globalMessages';
|
||||
import Error from '@app/pages/_error';
|
||||
@@ -17,6 +18,7 @@ import {
|
||||
FilterIcon,
|
||||
PauseIcon,
|
||||
PlayIcon,
|
||||
SearchIcon,
|
||||
} from '@heroicons/react/solid';
|
||||
import type {
|
||||
LogMessage,
|
||||
@@ -59,6 +61,8 @@ const SettingsLogs = () => {
|
||||
const { addToast } = useToasts();
|
||||
const [currentFilter, setCurrentFilter] = useState<Filter>('debug');
|
||||
const [currentPageSize, setCurrentPageSize] = useState(25);
|
||||
const [searchFilter, debouncedSearchFilter, setSearchFilter] =
|
||||
useDebouncedState('');
|
||||
const [refreshInterval, setRefreshInterval] = useState(5000);
|
||||
const [activeLog, setActiveLog] = useState<{
|
||||
isOpen: boolean;
|
||||
@@ -76,7 +80,9 @@ const SettingsLogs = () => {
|
||||
const { data, error } = useSWR<LogsResultsResponse>(
|
||||
`/api/v1/settings/logs?take=${currentPageSize}&skip=${
|
||||
pageIndex * currentPageSize
|
||||
}&filter=${currentFilter}`,
|
||||
}&filter=${currentFilter}${
|
||||
debouncedSearchFilter ? `&search=${debouncedSearchFilter}` : ''
|
||||
}`,
|
||||
{
|
||||
refreshInterval: refreshInterval,
|
||||
revalidateOnFocus: false,
|
||||
@@ -118,15 +124,13 @@ const SettingsLogs = () => {
|
||||
});
|
||||
};
|
||||
|
||||
if (!data && !error) {
|
||||
return <LoadingSpinner />;
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
// check if there's no data and no errors in the table
|
||||
// so as to show a spinner inside the table and not refresh the whole component
|
||||
if (!data && error) {
|
||||
return <Error statusCode={500} />;
|
||||
}
|
||||
|
||||
const hasNextPage = data.pageInfo.pages > pageIndex + 1;
|
||||
const hasNextPage = data?.pageInfo.pages ?? 0 > pageIndex + 1;
|
||||
const hasPrevPage = pageIndex > 0;
|
||||
|
||||
return (
|
||||
@@ -245,10 +249,21 @@ const SettingsLogs = () => {
|
||||
appDataPath: appData ? appData.appDataPath : '/app/config',
|
||||
})}
|
||||
</p>
|
||||
<div className="mt-2 flex flex-grow flex-row sm:flex-grow-0 sm:justify-end">
|
||||
<div className="mt-2 flex flex-grow flex-col sm:flex-grow-0 sm:flex-row sm:justify-end">
|
||||
<div className="mb-2 flex flex-grow sm:mb-0 sm:mr-2 md:flex-grow-0">
|
||||
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
|
||||
<SearchIcon className="h-6 w-6" />
|
||||
</span>
|
||||
<input
|
||||
type="text"
|
||||
className="rounded-r-only"
|
||||
value={searchFilter}
|
||||
onChange={(e) => setSearchFilter(e.target.value as string)}
|
||||
/>
|
||||
</div>
|
||||
<div className="mb-2 flex flex-1 flex-row justify-between sm:mb-0 sm:flex-none">
|
||||
<Button
|
||||
className="mr-2 w-full flex-grow"
|
||||
className="mr-2 flex flex-grow"
|
||||
buttonType={refreshInterval ? 'default' : 'primary'}
|
||||
onClick={() => toggleLogs()}
|
||||
>
|
||||
@@ -259,34 +274,34 @@ const SettingsLogs = () => {
|
||||
)}
|
||||
</span>
|
||||
</Button>
|
||||
</div>
|
||||
<div className="mb-2 flex flex-1 sm:mb-0 sm:flex-none">
|
||||
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
|
||||
<FilterIcon className="h-6 w-6" />
|
||||
</span>
|
||||
<select
|
||||
id="filter"
|
||||
name="filter"
|
||||
onChange={(e) => {
|
||||
setCurrentFilter(e.target.value as Filter);
|
||||
router.push(router.pathname);
|
||||
}}
|
||||
value={currentFilter}
|
||||
className="rounded-r-only"
|
||||
>
|
||||
<option value="debug">
|
||||
{intl.formatMessage(messages.filterDebug)}
|
||||
</option>
|
||||
<option value="info">
|
||||
{intl.formatMessage(messages.filterInfo)}
|
||||
</option>
|
||||
<option value="warn">
|
||||
{intl.formatMessage(messages.filterWarn)}
|
||||
</option>
|
||||
<option value="error">
|
||||
{intl.formatMessage(messages.filterError)}
|
||||
</option>
|
||||
</select>
|
||||
<div className="flex flex-grow">
|
||||
<span className="inline-flex cursor-default items-center rounded-l-md border border-r-0 border-gray-500 bg-gray-800 px-3 text-sm text-gray-100">
|
||||
<FilterIcon className="h-6 w-6" />
|
||||
</span>
|
||||
<select
|
||||
id="filter"
|
||||
name="filter"
|
||||
onChange={(e) => {
|
||||
setCurrentFilter(e.target.value as Filter);
|
||||
router.push(router.pathname);
|
||||
}}
|
||||
value={currentFilter}
|
||||
className="rounded-r-only"
|
||||
>
|
||||
<option value="debug">
|
||||
{intl.formatMessage(messages.filterDebug)}
|
||||
</option>
|
||||
<option value="info">
|
||||
{intl.formatMessage(messages.filterInfo)}
|
||||
</option>
|
||||
<option value="warn">
|
||||
{intl.formatMessage(messages.filterWarn)}
|
||||
</option>
|
||||
<option value="error">
|
||||
{intl.formatMessage(messages.filterError)}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Table>
|
||||
@@ -300,73 +315,81 @@ const SettingsLogs = () => {
|
||||
</tr>
|
||||
</thead>
|
||||
<Table.TBody>
|
||||
{data.results.map((row: LogMessage, index: number) => {
|
||||
return (
|
||||
<tr key={`log-list-${index}`}>
|
||||
<Table.TD className="text-gray-300">
|
||||
{intl.formatDate(row.timestamp, {
|
||||
year: 'numeric',
|
||||
month: 'short',
|
||||
day: '2-digit',
|
||||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
second: 'numeric',
|
||||
})}
|
||||
</Table.TD>
|
||||
<Table.TD className="text-gray-300">
|
||||
<Badge
|
||||
badgeType={
|
||||
row.level === 'error'
|
||||
? 'danger'
|
||||
: row.level === 'warn'
|
||||
? 'warning'
|
||||
: row.level === 'info'
|
||||
? 'success'
|
||||
: 'default'
|
||||
}
|
||||
>
|
||||
{row.level.toUpperCase()}
|
||||
</Badge>
|
||||
</Table.TD>
|
||||
<Table.TD className="text-gray-300">
|
||||
{row.label ?? ''}
|
||||
</Table.TD>
|
||||
<Table.TD className="text-gray-300">{row.message}</Table.TD>
|
||||
<Table.TD className="-m-1 flex flex-wrap items-center justify-end">
|
||||
{row.data && (
|
||||
{!data ? (
|
||||
<tr>
|
||||
<Table.TD colSpan={5} noPadding>
|
||||
<LoadingSpinner />
|
||||
</Table.TD>
|
||||
</tr>
|
||||
) : (
|
||||
data.results.map((row: LogMessage, index: number) => {
|
||||
return (
|
||||
<tr key={`log-list-${index}`}>
|
||||
<Table.TD className="text-gray-300">
|
||||
{intl.formatDate(row.timestamp, {
|
||||
year: 'numeric',
|
||||
month: 'short',
|
||||
day: '2-digit',
|
||||
hour: 'numeric',
|
||||
minute: 'numeric',
|
||||
second: 'numeric',
|
||||
})}
|
||||
</Table.TD>
|
||||
<Table.TD className="text-gray-300">
|
||||
<Badge
|
||||
badgeType={
|
||||
row.level === 'error'
|
||||
? 'danger'
|
||||
: row.level === 'warn'
|
||||
? 'warning'
|
||||
: row.level === 'info'
|
||||
? 'success'
|
||||
: 'default'
|
||||
}
|
||||
>
|
||||
{row.level.toUpperCase()}
|
||||
</Badge>
|
||||
</Table.TD>
|
||||
<Table.TD className="text-gray-300">
|
||||
{row.label ?? ''}
|
||||
</Table.TD>
|
||||
<Table.TD className="text-gray-300">{row.message}</Table.TD>
|
||||
<Table.TD className="-m-1 flex flex-wrap items-center justify-end">
|
||||
{row.data && (
|
||||
<Tooltip
|
||||
content={intl.formatMessage(messages.viewdetails)}
|
||||
>
|
||||
<Button
|
||||
buttonSize="sm"
|
||||
buttonType="primary"
|
||||
onClick={() =>
|
||||
setActiveLog({ log: row, isOpen: true })
|
||||
}
|
||||
className="m-1"
|
||||
>
|
||||
<DocumentSearchIcon className="icon-md" />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
)}
|
||||
<Tooltip
|
||||
content={intl.formatMessage(messages.viewdetails)}
|
||||
content={intl.formatMessage(messages.copyToClipboard)}
|
||||
>
|
||||
<Button
|
||||
buttonType="primary"
|
||||
buttonSize="sm"
|
||||
onClick={() =>
|
||||
setActiveLog({ log: row, isOpen: true })
|
||||
}
|
||||
onClick={() => copyLogString(row)}
|
||||
className="m-1"
|
||||
>
|
||||
<DocumentSearchIcon className="icon-md" />
|
||||
<ClipboardCopyIcon className="icon-md" />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
)}
|
||||
<Tooltip
|
||||
content={intl.formatMessage(messages.copyToClipboard)}
|
||||
>
|
||||
<Button
|
||||
buttonType="primary"
|
||||
buttonSize="sm"
|
||||
onClick={() => copyLogString(row)}
|
||||
className="m-1"
|
||||
>
|
||||
<ClipboardCopyIcon className="icon-md" />
|
||||
</Button>
|
||||
</Tooltip>
|
||||
</Table.TD>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</Table.TD>
|
||||
</tr>
|
||||
);
|
||||
})
|
||||
)}
|
||||
|
||||
{data.results.length === 0 && (
|
||||
{data?.results.length === 0 && (
|
||||
<tr className="relative h-24 p-2 text-white">
|
||||
<Table.TD colSpan={5} noPadding>
|
||||
<div className="flex w-screen flex-col items-center justify-center p-6 md:w-full">
|
||||
@@ -396,15 +419,15 @@ const SettingsLogs = () => {
|
||||
>
|
||||
<div className="hidden lg:flex lg:flex-1">
|
||||
<p className="text-sm">
|
||||
{data.results.length > 0 &&
|
||||
{(data?.results.length ?? 0) > 0 &&
|
||||
intl.formatMessage(globalMessages.showingresults, {
|
||||
from: pageIndex * currentPageSize + 1,
|
||||
to:
|
||||
data.results.length < currentPageSize
|
||||
data?.results.length ?? 0 < currentPageSize
|
||||
? pageIndex * currentPageSize +
|
||||
data.results.length
|
||||
(data?.results.length ?? 0)
|
||||
: (pageIndex + 1) * currentPageSize,
|
||||
total: data.pageInfo.results,
|
||||
total: data?.pageInfo.results ?? 0,
|
||||
strong: (msg: React.ReactNode) => (
|
||||
<span className="font-medium">{msg}</span>
|
||||
),
|
||||
|
||||
@@ -46,7 +46,7 @@ const messages = defineMessages({
|
||||
'Do NOT enable this setting unless you understand what you are doing!',
|
||||
cacheImages: 'Enable Image Caching',
|
||||
cacheImagesTip:
|
||||
'Cache and serve optimized 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 Overseerr to correctly register client IP addresses behind a proxy',
|
||||
@@ -309,7 +309,7 @@ const SettingsMain = () => {
|
||||
</div>
|
||||
</div>
|
||||
<div className="form-row">
|
||||
<label htmlFor="csrfProtection" className="checkbox-label">
|
||||
<label htmlFor="cacheImages" className="checkbox-label">
|
||||
<span className="mr-2">
|
||||
{intl.formatMessage(messages.cacheImages)}
|
||||
</span>
|
||||
|
||||
@@ -11,7 +11,7 @@ interface SliderProps {
|
||||
items?: JSX.Element[];
|
||||
isLoading: boolean;
|
||||
isEmpty?: boolean;
|
||||
emptyMessage?: string;
|
||||
emptyMessage?: React.ReactNode;
|
||||
placeholder?: React.ReactNode;
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ const Slider = ({
|
||||
</div>
|
||||
))}
|
||||
{isEmpty && (
|
||||
<div className="mt-16 mb-16 text-center text-white">
|
||||
<div className="mt-16 mb-16 text-center font-medium text-gray-400">
|
||||
{emptyMessage
|
||||
? emptyMessage
|
||||
: intl.formatMessage(globalMessages.noresults)}
|
||||
|
||||
@@ -77,7 +77,7 @@ const StatusBadge = ({
|
||||
mediaType === 'movie' ? globalMessages.movie : globalMessages.tvshow
|
||||
),
|
||||
});
|
||||
} else if (hasPermission(Permission.ADMIN)) {
|
||||
} else if (hasPermission(Permission.ADMIN) && serviceUrl) {
|
||||
mediaLink = serviceUrl;
|
||||
mediaLinkDescription = intl.formatMessage(messages.openinarr, {
|
||||
arr: mediaType === 'movie' ? 'Radarr' : 'Sonarr',
|
||||
|
||||
@@ -6,6 +6,7 @@ import useSWR from 'swr';
|
||||
|
||||
const messages = defineMessages({
|
||||
somethingwentwrong: 'Something went wrong while retrieving season data.',
|
||||
noepisodes: 'Episode list unavailable.',
|
||||
});
|
||||
|
||||
type SeasonProps = {
|
||||
@@ -29,32 +30,38 @@ const Season = ({ seasonNumber, tvId }: SeasonProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex flex-col justify-center divide-y divide-gray-700">
|
||||
{data.episodes
|
||||
.slice()
|
||||
.reverse()
|
||||
.map((episode) => {
|
||||
return (
|
||||
<div
|
||||
className="flex flex-col space-y-4 py-4 xl:flex-row xl:space-y-4 xl:space-x-4"
|
||||
key={`season-${seasonNumber}-episode-${episode.episodeNumber}`}
|
||||
>
|
||||
<div className="flex-1">
|
||||
<div className="flex flex-col space-y-2 xl:flex-row xl:items-center xl:space-y-0 xl:space-x-2">
|
||||
<h3 className="text-lg">{episode.name}</h3>
|
||||
<AirDateBadge airDate={episode.airDate} />
|
||||
{data.episodes.length === 0 ? (
|
||||
<p>{intl.formatMessage(messages.noepisodes)}</p>
|
||||
) : (
|
||||
data.episodes
|
||||
.slice()
|
||||
.reverse()
|
||||
.map((episode) => {
|
||||
return (
|
||||
<div
|
||||
className="flex flex-col space-y-4 py-4 xl:flex-row xl:space-y-4 xl:space-x-4"
|
||||
key={`season-${seasonNumber}-episode-${episode.episodeNumber}`}
|
||||
>
|
||||
<div className="flex-1">
|
||||
<div className="flex flex-col space-y-2 xl:flex-row xl:items-center xl:space-y-0 xl:space-x-2">
|
||||
<h3 className="text-lg">{episode.name}</h3>
|
||||
{episode.airDate && (
|
||||
<AirDateBadge airDate={episode.airDate} />
|
||||
)}
|
||||
</div>
|
||||
{episode.overview && <p>{episode.overview}</p>}
|
||||
</div>
|
||||
{episode.overview && <p>{episode.overview}</p>}
|
||||
{episode.stillPath && (
|
||||
<img
|
||||
className="h-auto w-full rounded-lg xl:h-32 xl:w-auto"
|
||||
src={`https://image.tmdb.org/t/p/original/${episode.stillPath}`}
|
||||
alt=""
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
{episode.stillPath && (
|
||||
<img
|
||||
className="h-auto w-full rounded-lg xl:h-32 xl:w-auto"
|
||||
src={`https://image.tmdb.org/t/p/original/${episode.stillPath}`}
|
||||
alt=""
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
);
|
||||
})
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -10,6 +10,7 @@ import LoadingSpinner from '@app/components/Common/LoadingSpinner';
|
||||
import PageTitle from '@app/components/Common/PageTitle';
|
||||
import type { PlayButtonLink } from '@app/components/Common/PlayButton';
|
||||
import PlayButton from '@app/components/Common/PlayButton';
|
||||
import StatusBadgeMini from '@app/components/Common/StatusBadgeMini';
|
||||
import Tooltip from '@app/components/Common/Tooltip';
|
||||
import ExternalLinkBlock from '@app/components/ExternalLinkBlock';
|
||||
import IssueModal from '@app/components/IssueModal';
|
||||
@@ -21,6 +22,7 @@ import RequestModal from '@app/components/RequestModal';
|
||||
import Slider from '@app/components/Slider';
|
||||
import StatusBadge from '@app/components/StatusBadge';
|
||||
import Season from '@app/components/TvDetails/Season';
|
||||
import useDeepLinks from '@app/hooks/useDeepLinks';
|
||||
import useLocale from '@app/hooks/useLocale';
|
||||
import useSettings from '@app/hooks/useSettings';
|
||||
import { Permission, useUser } from '@app/hooks/useUser';
|
||||
@@ -121,29 +123,12 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
setShowManager(router.query.manage == '1' ? true : false);
|
||||
}, [router.query.manage]);
|
||||
|
||||
const [plexUrl, setPlexUrl] = useState(data?.mediaInfo?.plexUrl);
|
||||
const [plexUrl4k, setPlexUrl4k] = useState(data?.mediaInfo?.plexUrl4k);
|
||||
|
||||
useEffect(() => {
|
||||
if (data) {
|
||||
if (
|
||||
/iPad|iPhone|iPod/.test(navigator.userAgent) ||
|
||||
(navigator.userAgent === 'MacIntel' && navigator.maxTouchPoints > 1)
|
||||
) {
|
||||
setPlexUrl(data.mediaInfo?.iOSPlexUrl);
|
||||
setPlexUrl4k(data.mediaInfo?.iOSPlexUrl4k);
|
||||
} else {
|
||||
setPlexUrl(data.mediaInfo?.plexUrl);
|
||||
setPlexUrl4k(data.mediaInfo?.plexUrl4k);
|
||||
}
|
||||
}
|
||||
}, [
|
||||
data,
|
||||
data?.mediaInfo?.iOSPlexUrl,
|
||||
data?.mediaInfo?.iOSPlexUrl4k,
|
||||
data?.mediaInfo?.plexUrl,
|
||||
data?.mediaInfo?.plexUrl4k,
|
||||
]);
|
||||
const { plexUrl, plexUrl4k } = useDeepLinks({
|
||||
plexUrl: data?.mediaInfo?.plexUrl,
|
||||
plexUrl4k: data?.mediaInfo?.plexUrl4k,
|
||||
iOSPlexUrl: data?.mediaInfo?.iOSPlexUrl,
|
||||
iOSPlexUrl4k: data?.mediaInfo?.iOSPlexUrl4k,
|
||||
});
|
||||
|
||||
if (!data && !error) {
|
||||
return <LoadingSpinner />;
|
||||
@@ -239,7 +224,9 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
seasonCount <=
|
||||
(
|
||||
data.mediaInfo?.seasons.filter(
|
||||
(season) => season.status === MediaStatus.AVAILABLE
|
||||
(season) =>
|
||||
season.status === MediaStatus.AVAILABLE ||
|
||||
season.status === MediaStatus.PARTIALLY_AVAILABLE
|
||||
) ?? []
|
||||
).length;
|
||||
|
||||
@@ -247,7 +234,9 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
seasonCount <=
|
||||
(
|
||||
data.mediaInfo?.seasons.filter(
|
||||
(season) => season.status4k === MediaStatus.AVAILABLE
|
||||
(season) =>
|
||||
season.status4k === MediaStatus.AVAILABLE ||
|
||||
season.status4k === MediaStatus.PARTIALLY_AVAILABLE
|
||||
) ?? []
|
||||
).length;
|
||||
|
||||
@@ -332,7 +321,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
inProgress={(data.mediaInfo?.downloadStatus ?? []).length > 0}
|
||||
tmdbId={data.mediaInfo?.tmdbId}
|
||||
mediaType="tv"
|
||||
plexUrl={data.mediaInfo?.plexUrl}
|
||||
plexUrl={plexUrl}
|
||||
serviceUrl={data.mediaInfo?.serviceUrl}
|
||||
/>
|
||||
{settings.currentSettings.series4kEnabled &&
|
||||
@@ -354,7 +343,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
}
|
||||
tmdbId={data.mediaInfo?.tmdbId}
|
||||
mediaType="tv"
|
||||
plexUrl={data.mediaInfo?.plexUrl4k}
|
||||
plexUrl={plexUrl4k}
|
||||
serviceUrl={data.mediaInfo?.serviceUrl4k}
|
||||
/>
|
||||
)}
|
||||
@@ -557,75 +546,149 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
{((!mSeason &&
|
||||
request?.status === MediaRequestStatus.APPROVED) ||
|
||||
mSeason?.status === MediaStatus.PROCESSING) && (
|
||||
<Badge badgeType="primary">
|
||||
{intl.formatMessage(globalMessages.requested)}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="primary">
|
||||
{intl.formatMessage(globalMessages.requested)}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini
|
||||
status={MediaStatus.PROCESSING}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{((!mSeason &&
|
||||
request?.status === MediaRequestStatus.PENDING) ||
|
||||
mSeason?.status === MediaStatus.PENDING) && (
|
||||
<Badge badgeType="warning">
|
||||
{intl.formatMessage(globalMessages.pending)}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="warning">
|
||||
{intl.formatMessage(globalMessages.pending)}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini status={MediaStatus.PENDING} />
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{mSeason?.status ===
|
||||
MediaStatus.PARTIALLY_AVAILABLE && (
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(
|
||||
globalMessages.partiallyavailable
|
||||
)}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(
|
||||
globalMessages.partiallyavailable
|
||||
)}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini
|
||||
status={MediaStatus.PARTIALLY_AVAILABLE}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{mSeason?.status === MediaStatus.AVAILABLE && (
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(globalMessages.available)}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(globalMessages.available)}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini
|
||||
status={MediaStatus.AVAILABLE}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{((!mSeason4k &&
|
||||
request4k?.status ===
|
||||
MediaRequestStatus.APPROVED) ||
|
||||
mSeason4k?.status4k === MediaStatus.PROCESSING) &&
|
||||
show4k && (
|
||||
<Badge badgeType="primary">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.requested
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="primary">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.requested
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini
|
||||
status={MediaStatus.PROCESSING}
|
||||
is4k={true}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{((!mSeason4k &&
|
||||
request4k?.status === MediaRequestStatus.PENDING) ||
|
||||
mSeason?.status4k === MediaStatus.PENDING) &&
|
||||
show4k && (
|
||||
<Badge badgeType="warning">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.pending
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="warning">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.pending
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini
|
||||
status={MediaStatus.PENDING}
|
||||
is4k={true}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{mSeason4k?.status4k ===
|
||||
MediaStatus.PARTIALLY_AVAILABLE &&
|
||||
show4k && (
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.partiallyavailable
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.partiallyavailable
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini
|
||||
status={MediaStatus.PARTIALLY_AVAILABLE}
|
||||
is4k={true}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{mSeason4k?.status4k === MediaStatus.AVAILABLE &&
|
||||
show4k && (
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.available
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
<>
|
||||
<div className="hidden md:flex">
|
||||
<Badge badgeType="success">
|
||||
{intl.formatMessage(messages.status4k, {
|
||||
status: intl.formatMessage(
|
||||
globalMessages.available
|
||||
),
|
||||
})}
|
||||
</Badge>
|
||||
</div>
|
||||
<div className="flex md:hidden">
|
||||
<StatusBadgeMini
|
||||
status={MediaStatus.AVAILABLE}
|
||||
is4k={true}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
<ChevronUpIcon
|
||||
className={`${
|
||||
@@ -750,6 +813,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
|
||||
</div>
|
||||
)}
|
||||
{data.nextEpisodeToAir &&
|
||||
data.nextEpisodeToAir.airDate &&
|
||||
data.nextEpisodeToAir.airDate !== data.firstAirDate && (
|
||||
<div className="media-fact">
|
||||
<span>{intl.formatMessage(messages.nextAirDate)}</span>
|
||||
|
||||
@@ -20,12 +20,11 @@ import type { TvDetails } from '@server/models/Tv';
|
||||
import Link from 'next/link';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { defineMessages, FormattedNumber, useIntl } from 'react-intl';
|
||||
import { defineMessages, useIntl } from 'react-intl';
|
||||
import useSWR from 'swr';
|
||||
|
||||
const messages = defineMessages({
|
||||
recentrequests: 'Recent Requests',
|
||||
norequests: 'No requests.',
|
||||
limit: '{remaining} of {limit}',
|
||||
requestsperdays: '{limit} remaining',
|
||||
unlimited: 'Unlimited',
|
||||
@@ -35,6 +34,8 @@ const messages = defineMessages({
|
||||
seriesrequest: 'Series Requests',
|
||||
recentlywatched: 'Recently Watched',
|
||||
plexwatchlist: 'Plex Watchlist',
|
||||
emptywatchlist:
|
||||
'Media added to your <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> will appear here.',
|
||||
});
|
||||
|
||||
type MediaTitle = MovieDetails | TvDetails;
|
||||
@@ -70,22 +71,24 @@ const UserProfile = () => {
|
||||
? `/api/v1/user/${user.id}/quota`
|
||||
: null
|
||||
);
|
||||
const { data: watchData } = useSWR<UserWatchDataResponse>(
|
||||
user?.userType === UserType.PLEX &&
|
||||
(user.id === currentUser?.id || currentHasPermission(Permission.ADMIN))
|
||||
? `/api/v1/user/${user.id}/watch_data`
|
||||
: null
|
||||
);
|
||||
const { data: watchData, error: watchDataError } =
|
||||
useSWR<UserWatchDataResponse>(
|
||||
user?.userType === UserType.PLEX &&
|
||||
(user.id === currentUser?.id || currentHasPermission(Permission.ADMIN))
|
||||
? `/api/v1/user/${user.id}/watch_data`
|
||||
: null
|
||||
);
|
||||
const { data: watchlistItems, error: watchlistError } =
|
||||
useSWR<WatchlistResponse>(
|
||||
user?.id === currentUser?.id ||
|
||||
currentHasPermission(
|
||||
[Permission.MANAGE_REQUESTS, Permission.WATCHLIST_VIEW],
|
||||
{
|
||||
type: 'or',
|
||||
}
|
||||
)
|
||||
? `/api/v1/user/${user?.id}/watchlist`
|
||||
user?.userType === UserType.PLEX &&
|
||||
(user.id === currentUser?.id ||
|
||||
currentHasPermission(
|
||||
[Permission.MANAGE_REQUESTS, Permission.WATCHLIST_VIEW],
|
||||
{
|
||||
type: 'or',
|
||||
}
|
||||
))
|
||||
? `/api/v1/user/${user.id}/watchlist`
|
||||
: null,
|
||||
{
|
||||
revalidateOnMount: true,
|
||||
@@ -146,7 +149,15 @@ const UserProfile = () => {
|
||||
{intl.formatMessage(messages.totalrequests)}
|
||||
</dt>
|
||||
<dd className="mt-1 text-3xl font-semibold text-white">
|
||||
<FormattedNumber value={user.requestCount} />
|
||||
<Link
|
||||
href={
|
||||
user.id === currentUser?.id
|
||||
? '/profile/requests?filter=all'
|
||||
: `/users/${user?.id}/requests?filter=all`
|
||||
}
|
||||
>
|
||||
<a>{intl.formatNumber(user.requestCount)}</a>
|
||||
</Link>
|
||||
</dd>
|
||||
</div>
|
||||
<div
|
||||
@@ -266,40 +277,49 @@ const UserProfile = () => {
|
||||
currentHasPermission(
|
||||
[Permission.MANAGE_REQUESTS, Permission.REQUEST_VIEW],
|
||||
{ type: 'or' }
|
||||
)) && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
<Link href={`/users/${user?.id}/requests?filter=all`}>
|
||||
<a className="slider-title">
|
||||
<span>{intl.formatMessage(messages.recentrequests)}</span>
|
||||
<ArrowCircleRightIcon />
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
<Slider
|
||||
sliderKey="requests"
|
||||
isLoading={!requests && !requestError}
|
||||
isEmpty={
|
||||
!!requests && !requestError && requests.results.length === 0
|
||||
}
|
||||
items={(requests?.results ?? []).map((request) => (
|
||||
<RequestCard
|
||||
key={`request-slider-item-${request.id}`}
|
||||
request={request}
|
||||
onTitleData={updateAvailableTitles}
|
||||
/>
|
||||
))}
|
||||
placeholder={<RequestCard.Placeholder />}
|
||||
emptyMessage={intl.formatMessage(messages.norequests)}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
{(user.id === currentUser?.id ||
|
||||
currentHasPermission(
|
||||
[Permission.MANAGE_REQUESTS, Permission.WATCHLIST_VIEW],
|
||||
{ type: 'or' }
|
||||
)) &&
|
||||
(!watchlistItems || !!watchlistItems.results.length) &&
|
||||
(!requests || !!requests.results.length) &&
|
||||
!requestError && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
<Link
|
||||
href={
|
||||
user.id === currentUser?.id
|
||||
? '/profile/requests?filter=all'
|
||||
: `/users/${user?.id}/requests?filter=all`
|
||||
}
|
||||
>
|
||||
<a className="slider-title">
|
||||
<span>{intl.formatMessage(messages.recentrequests)}</span>
|
||||
<ArrowCircleRightIcon />
|
||||
</a>
|
||||
</Link>
|
||||
</div>
|
||||
<Slider
|
||||
sliderKey="requests"
|
||||
isLoading={!requests}
|
||||
items={(requests?.results ?? []).map((request) => (
|
||||
<RequestCard
|
||||
key={`request-slider-item-${request.id}`}
|
||||
request={request}
|
||||
onTitleData={updateAvailableTitles}
|
||||
/>
|
||||
))}
|
||||
placeholder={<RequestCard.Placeholder />}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
{user.userType === UserType.PLEX &&
|
||||
(user.id === currentUser?.id ||
|
||||
currentHasPermission(
|
||||
[Permission.MANAGE_REQUESTS, Permission.WATCHLIST_VIEW],
|
||||
{ type: 'or' }
|
||||
)) &&
|
||||
(!watchlistItems ||
|
||||
!!watchlistItems.results.length ||
|
||||
(user.id === currentUser?.id &&
|
||||
(user.settings?.watchlistSyncMovies ||
|
||||
user.settings?.watchlistSyncTv))) &&
|
||||
!watchlistError && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
@@ -318,7 +338,20 @@ const UserProfile = () => {
|
||||
</div>
|
||||
<Slider
|
||||
sliderKey="watchlist"
|
||||
isLoading={!watchlistItems && !watchlistError}
|
||||
isLoading={!watchlistItems}
|
||||
isEmpty={!!watchlistItems && watchlistItems.results.length === 0}
|
||||
emptyMessage={intl.formatMessage(messages.emptywatchlist, {
|
||||
PlexWatchlistSupportLink: (msg: React.ReactNode) => (
|
||||
<a
|
||||
href="https://support.plex.tv/articles/universal-watchlist/"
|
||||
className="text-white transition duration-300 hover:underline"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{msg}
|
||||
</a>
|
||||
),
|
||||
})}
|
||||
items={watchlistItems?.results.map((item) => (
|
||||
<TmdbTitleCard
|
||||
id={item.tmdbId}
|
||||
@@ -330,9 +363,11 @@ const UserProfile = () => {
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
{(user.id === currentUser?.id ||
|
||||
currentHasPermission(Permission.ADMIN)) &&
|
||||
!!watchData?.recentlyWatched.length && (
|
||||
{user.userType === UserType.PLEX &&
|
||||
(user.id === currentUser?.id ||
|
||||
currentHasPermission(Permission.ADMIN)) &&
|
||||
(!watchData || !!watchData.recentlyWatched.length) &&
|
||||
!watchDataError && (
|
||||
<>
|
||||
<div className="slider-header">
|
||||
<div className="slider-title">
|
||||
@@ -342,8 +377,7 @@ const UserProfile = () => {
|
||||
<Slider
|
||||
sliderKey="media"
|
||||
isLoading={!watchData}
|
||||
isEmpty={!watchData?.recentlyWatched.length}
|
||||
items={watchData.recentlyWatched.map((item) => (
|
||||
items={watchData?.recentlyWatched.map((item) => (
|
||||
<TmdbTitleCard
|
||||
key={`media-slider-item-${item.id}`}
|
||||
id={item.id}
|
||||
|
||||
@@ -10,6 +10,7 @@ export type AvailableLocale =
|
||||
| 'el'
|
||||
| 'es'
|
||||
| 'fr'
|
||||
| 'hr'
|
||||
| 'hu'
|
||||
| 'it'
|
||||
| 'ja'
|
||||
@@ -60,6 +61,10 @@ export const availableLanguages: AvailableLanguageObject = {
|
||||
code: 'fr',
|
||||
display: 'Français',
|
||||
},
|
||||
hr: {
|
||||
code: 'hr',
|
||||
display: 'Hrvatski',
|
||||
},
|
||||
it: {
|
||||
code: 'it',
|
||||
display: 'Italiano',
|
||||
|
||||
35
src/hooks/useDeepLinks.ts
Normal file
35
src/hooks/useDeepLinks.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
interface useDeepLinksProps {
|
||||
plexUrl?: string;
|
||||
plexUrl4k?: string;
|
||||
iOSPlexUrl?: string;
|
||||
iOSPlexUrl4k?: string;
|
||||
}
|
||||
|
||||
const useDeepLinks = ({
|
||||
plexUrl,
|
||||
plexUrl4k,
|
||||
iOSPlexUrl,
|
||||
iOSPlexUrl4k,
|
||||
}: useDeepLinksProps) => {
|
||||
const [returnedPlexUrl, setReturnedPlexUrl] = useState(plexUrl);
|
||||
const [returnedPlexUrl4k, setReturnedPlexUrl4k] = useState(plexUrl4k);
|
||||
|
||||
useEffect(() => {
|
||||
if (
|
||||
/iPad|iPhone|iPod/.test(navigator.userAgent) ||
|
||||
(navigator.userAgent === 'MacIntel' && navigator.maxTouchPoints > 1)
|
||||
) {
|
||||
setReturnedPlexUrl(iOSPlexUrl);
|
||||
setReturnedPlexUrl4k(iOSPlexUrl4k);
|
||||
} else {
|
||||
setReturnedPlexUrl(plexUrl);
|
||||
setReturnedPlexUrl4k(plexUrl4k);
|
||||
}
|
||||
}, [iOSPlexUrl, iOSPlexUrl4k, plexUrl, plexUrl4k]);
|
||||
|
||||
return { plexUrl: returnedPlexUrl, plexUrl4k: returnedPlexUrl4k };
|
||||
};
|
||||
|
||||
export default useDeepLinks;
|
||||
@@ -16,7 +16,6 @@
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "تحتاج على الأقل ان تملك <strong>{seasons}</strong> {seasons, plural, one {طلب موسم} other {طلبات مواسم}} متبقية/متبقّي من حدك الأقصى لتتمكن من طلب هذا المسلسل.",
|
||||
"components.Discover.NetworkSlider.networks": "شبكات البث",
|
||||
"components.Discover.upcomingmovies": "أفلام قادمة",
|
||||
"components.Discover.noRequests": "لا يوجد طلبات.",
|
||||
"components.Discover.upcomingtv": "مسلسلات قادمة",
|
||||
"components.IssueDetails.season": "موسم {seasonNumber}",
|
||||
"components.IssueModal.issueVideo": "الفديو",
|
||||
@@ -135,7 +134,6 @@
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "جميع المواسم",
|
||||
"components.IssueModal.CreateIssueModal.episode": "حلقة {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.extras": "الإضافات",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "هل هناك مشكلة في {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "الحلقة المعنيّة",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "الموسم المعني",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "رجاءا قم بتزويد شرح مفصل للمشكلة التي صادفتها.",
|
||||
@@ -326,7 +324,6 @@
|
||||
"components.RequestModal.QuotaDisplay.season": "موسم",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {موسم} other {مواسم}}",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "هذا المستخدم يحتاج أن يملك على الاقل <strong>{seasons}</strong> {seasons, plural, one {طلب موسم} other {طلبات مواسم}} متبقية/متبقي ليتمكن من طلب هذا المسلسل.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "لم يتم العثور على ملخص لهذا العنوان.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "لم نتمكن من مطابقة طلبك بشكل تلقائي. الرجاء إختيار العنوان المراد من القائمة بالإسفل.",
|
||||
"components.RequestModal.alreadyrequested": "تم طلبه مُسبقاً",
|
||||
"components.RequestModal.approve": "الموافقة على الطلب",
|
||||
@@ -336,10 +333,9 @@
|
||||
"components.RequestModal.errorediting": "حدث خطأ ما أثناء محاولة تعديل الطلب.",
|
||||
"components.RequestModal.extras": "إضافات",
|
||||
"components.RequestModal.numberofepisodes": "# حلقات",
|
||||
"components.RequestModal.pending4krequest": "طلب فور كي معلّق لـ {title}",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.pendingapproval": "طلبك معلق بانتظار الموافقة.",
|
||||
"components.RequestModal.pendingrequest": "طلب معلق لـ {title}",
|
||||
"components.RequestModal.request4ktitle": "طلب {title} بجودة فور كي",
|
||||
"components.RequestModal.pendingrequest": "",
|
||||
"components.ResetPassword.validationpasswordmatch": "يجب مطابقة كلمة السر مع تأكيدها",
|
||||
"components.RequestModal.requestmovies": "طلب {count} {count, plural, one {فيلم} other {أفلام}}",
|
||||
"components.ResetPassword.email": "البريد الإلكتروني",
|
||||
@@ -358,7 +354,6 @@
|
||||
"components.RequestModal.requestfrom": "{username} طلب هذا المستخدم معلق بانتظار الموافقة.",
|
||||
"components.RequestModal.requestmovies4k": "طلب {count} {count, plural, one {فيلم} other {أفلام}} بجودة فور كي",
|
||||
"components.RequestModal.requestseasons": "طلب {seasonCount} {seasonCount, plural, one {موسم} other {مواسم}}",
|
||||
"components.RequestModal.requesttitle": "طلب {title}",
|
||||
"components.RequestModal.season": "موسم",
|
||||
"components.RequestModal.seasonnumber": "موسم {number}",
|
||||
"components.RequestModal.selectmovies": "إختيار فيلم /أفلام",
|
||||
@@ -839,7 +834,6 @@
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "حساب هذا المستخدم بدون كلمة سر حاليا. قم بإعداد كلمة سر بالإسفل لإتاحة هذا الحساب من تسجيل الدخول \"كمستخدم محلي.\"",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsSuccess": "تم حفظ كلمة السر بنجاح!",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "لا تملك الصلاحية لتعديل إعدادات هذا المستخدم.",
|
||||
"components.UserProfile.norequests": "لا يوجد طلبات.",
|
||||
"components.UserProfile.totalrequests": "مجموع الطلبات",
|
||||
"i18n.deleting": "جاري الحذف…",
|
||||
"i18n.delete": "حذف",
|
||||
|
||||
@@ -14,16 +14,15 @@
|
||||
"components.UserList.accounttype": "Tipus",
|
||||
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Podeu veure un resum dels límits de sol·licituds d’aquest usuari a la seva <ProfileLink>pàgina de perfil</ProfileLink>.",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "Necessites tenir al menys <strong>{seasons}</strong> {seasons, plural, one {petició de temporada} other {peticions de temporades}} restant(s) per a poder enviar una petició per a aquesta sèrie.",
|
||||
"components.RequestModal.pendingrequest": "Sol·licitud pendent de {title}",
|
||||
"components.RequestModal.pending4krequest": "Sol·licitud en 4K pendent per a {title}",
|
||||
"components.RequestModal.pendingrequest": "Sol·licitud pendent",
|
||||
"components.RequestModal.pending4krequest": "Sol·licitud en 4K pendent",
|
||||
"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.cancel": "Cancel·la la petició",
|
||||
"components.RequestModal.autoapproval": "Aprovació automàtica",
|
||||
"components.RequestModal.alreadyrequested": "Ja s'ha sol·licitat",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "No s'ha pogut emparellat automàticament la vostra sol·licitud. Seleccioneu l'emparellament correcte de la llista següent.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "No s'ha trobat cap sinopsi per a aquest títol.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "No s'ha pogut trobar coincidència d'aquesta serie. Seleccioneu l'emparellament correcte de la llista següent.",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {temporada} other {temporades}}",
|
||||
"components.RequestModal.QuotaDisplay.season": "temporada",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Aquest usuari ha de tenir almenys <strong>{seasons}</strong> {seasons, plural, one {sol·licitud de temporada} other {sol·licituds de temporades}} per enviar una sol·licitud per a aquesta sèrie.",
|
||||
@@ -215,7 +214,6 @@
|
||||
"components.RequestModal.requestadmin": "Aquesta sol·licitud s'aprovarà automàticament.",
|
||||
"components.RequestModal.requestCancel": "S'ha cancel·lat la sol·licitud de <strong>{title}</strong>.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> s'ha sol·licitat correctament!",
|
||||
"components.RequestModal.request4ktitle": "Sol·licita {title} en 4K",
|
||||
"components.Settings.Notifications.NotificationsSlack.validationWebhookUrl": "Heu de proporcionar un URL vàlid",
|
||||
"components.Settings.Notifications.NotificationsSlack.slacksettingssaved": "La configuració de notificacions Slack s'ha desat correctament!",
|
||||
"components.Settings.Notifications.NotificationsSlack.slacksettingsfailed": "No s'ha pogut desar la configuració de notificacions Slack.",
|
||||
@@ -250,7 +248,6 @@
|
||||
"components.RequestModal.selectseason": "Selecciona les temporades",
|
||||
"components.RequestModal.seasonnumber": "Temporada {number}",
|
||||
"components.RequestModal.season": "Temporada",
|
||||
"components.RequestModal.requesttitle": "Sol·licita {title}",
|
||||
"components.RequestModal.requestseasons": "Sol·licita {seasonCount} {seasonCount, plural, one {Temporada} other {Temporades}}",
|
||||
"components.Settings.Notifications.discordsettingssaved": "La configuració de les notificacions de Discord s'ha desat correctament!",
|
||||
"components.Settings.Notifications.NotificationsWebhook.webhooksettingsfailed": "No s'ha pogut desar la configuració de notificacions del Webhook.",
|
||||
@@ -333,7 +330,6 @@
|
||||
"components.UserProfile.requestsperdays": "{limit} restants",
|
||||
"components.UserProfile.recentrequests": "Sol·licituds recents",
|
||||
"components.UserProfile.pastdays": "{type} (últims {days} dies)",
|
||||
"components.UserProfile.norequests": "Sense sol·licituds.",
|
||||
"components.UserProfile.movierequests": "Sol·licituds de pel·lícules",
|
||||
"components.UserProfile.limit": "{remaining} de {limit}",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "No teniu permís per modificar la configuració d'aquest usuari.",
|
||||
@@ -490,7 +486,7 @@
|
||||
"components.Settings.deleteserverconfirm": "Esteu segur que voleu suprimir aquest servidor?",
|
||||
"components.Settings.currentlibrary": "Biblioteca actual: {name}",
|
||||
"components.Settings.cancelscan": "Cancel·la l'exploració",
|
||||
"components.Settings.cacheImagesTip": "Optimitzeu i emmagatzemeu totes les imatges de forma local (consumeix una quantitat important d'espai en disc)",
|
||||
"components.Settings.cacheImagesTip": "Posa en memòria cau i carrega imatges optimitzades (requereix una quantitat important d'espai en disc)",
|
||||
"components.Settings.applicationTitle": "Títol de l'aplicació",
|
||||
"components.Settings.addsonarr": "Afegeix un servidor Sonarr",
|
||||
"components.Settings.activeProfile": "Perfil actiu",
|
||||
@@ -735,17 +731,16 @@
|
||||
"components.Settings.Notifications.validationPgpPassword": "Heu de proporcionar una contrasenya PGP",
|
||||
"components.Settings.Notifications.botUsernameTip": "Permetre als usuaris iniciar un xat amb el bot i configurar les seves pròpies notificacions",
|
||||
"components.RequestModal.pendingapproval": "La vostra sol·licitud està pendent d'aprovació.",
|
||||
"components.RequestList.RequestItem.mediaerror": "El títol associat per a aquesta sol·licitud ja no està disponible.",
|
||||
"components.RequestList.RequestItem.mediaerror": "No s'ha trobat {mediaType}",
|
||||
"components.RequestList.RequestItem.deleterequest": "Suprimeix la sol·licitud",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Cancel·la la sol·licitud",
|
||||
"components.RequestCard.mediaerror": "El títol associat per a aquesta sol·licitud ja no està disponible.",
|
||||
"components.RequestCard.mediaerror": "No s'ha trobat {mediaType}",
|
||||
"components.RequestCard.deleterequest": "Suprimeix la sol·licitud",
|
||||
"components.NotificationTypeSelector.notificationTypes": "Tipus de notificacions",
|
||||
"components.Layout.VersionStatus.streamstable": "Overseer (Estable)",
|
||||
"components.Layout.VersionStatus.streamdevelop": "Overseerr (Desenvolupament)",
|
||||
"components.Layout.VersionStatus.outofdate": "No està actualitzat",
|
||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {canvi} other {canvis}} posterior(s)",
|
||||
"components.Discover.noRequests": "No hi ha cap sol·licitud.",
|
||||
"components.UserList.usercreatedfailedexisting": "Un altre usuari ja utilitza l'adreça electrònica proporcionada.",
|
||||
"components.Settings.SonarrModal.enableSearch": "Activa la cerca automàtica",
|
||||
"components.Settings.RadarrModal.enableSearch": "Activa la cerca automàtica",
|
||||
@@ -914,7 +909,6 @@
|
||||
"components.IssueModal.CreateIssueModal.toastSuccessCreate": "L'informe de la incidència per a <strong>{title}</strong> s'ha enviat correctament!",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Temporada afectada",
|
||||
"components.IssueModal.CreateIssueModal.episode": "Episodi {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Hi ha algun problema amb {title}?",
|
||||
"components.IssueList.sortModified": "Última modificació",
|
||||
"components.IssueList.sortAdded": "Més recent",
|
||||
"components.NotificationTypeSelector.issuecommentDescription": "Envia notificacions quan les incidències rebin comentaris nous.",
|
||||
@@ -925,7 +919,7 @@
|
||||
"components.NotificationTypeSelector.adminissuecommentDescription": "Notifica'm quan altres usuaris facin comentaris sobre incidències.",
|
||||
"components.ManageSlideOver.tvshow": "sèries",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedule": "Modifica la tasca programada",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Freqüència",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Freqüència nova",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Cada {jobScheduleHours, plural, one {hora} other {{jobScheduleHours} hores}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Cada {jobScheduleMinutes, plural, one {minut} other {{jobScheduleMinutes} minuts}}",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationTokenTip": "<ApplicationRegistrationLink>Registreu una aplicació</ApplicationRegistrationLink> per utilitzar-la amb {applicationTitle}",
|
||||
@@ -1036,5 +1030,92 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Identificador d'usuari de Discord",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.validationDiscordId": "Heu de proporcionar un identificador d'usuari de Discord vàlid",
|
||||
"i18n.importing": "S'està important…",
|
||||
"components.RequestBlock.languageprofile": "Perfil d'idioma"
|
||||
"components.RequestBlock.languageprofile": "Perfil d'idioma",
|
||||
"components.AirDateBadge.airedrelative": "Emès {relativeTime}",
|
||||
"components.MovieDetails.digitalrelease": "Llançament digital",
|
||||
"components.MovieDetails.physicalrelease": "Alliberament físic",
|
||||
"components.PermissionEdit.viewrecent": "Veure afegits recentment",
|
||||
"components.PermissionEdit.viewrecentDescription": "Concediu permís per veure la llista de mitjans afegits recentment.",
|
||||
"components.Settings.deleteServer": "Suprimeix el servidor {serverType}",
|
||||
"components.StatusChecker.reloadApp": "Torna a carregar {applicationTitle}",
|
||||
"components.TitleCard.cleardata": "Esborra les dades",
|
||||
"i18n.restartRequired": "Cal reiniciar",
|
||||
"components.RequestList.RequestItem.tvdbid": "Identificador de TheTVDB",
|
||||
"components.TitleCard.tvdbid": "Identificador de TheTVDB",
|
||||
"components.RequestList.RequestItem.tmdbid": "Identificador TMDB",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "La vostra llista de seguiment de Plex",
|
||||
"components.Discover.plexwatchlist": "La vostra llista de seguiment de Plex",
|
||||
"components.PermissionEdit.autorequest": "Sol·licitud automàtica",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Sol·licitud enviada automàticament",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Rep notificacions quan s'enviïn automàticament sol·licituds de contingut multimèdia nous per als elements de la teva llista de seguiment de Plex.",
|
||||
"components.RequestCard.tmdbid": "Identificador TMDB",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Sol·liciteu automàticament pel·lícules de la vostra <PlexWatchlistSupportLink>Llista de seguiment de Plex</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Sol·licitud automàtica de pel·lícules",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Sol·licitud automàtica de sèries",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Sol·liciteu sèries automàticament de la vostra <PlexWatchlistSupportLink>Llista de seguiment de Plex</PlexWatchlistSupportLink>",
|
||||
"components.PermissionEdit.autorequestSeries": "Sol·licitud automàtica de sèrie",
|
||||
"components.PermissionEdit.autorequestMovies": "Sol·licitud automàtica de pel·lícules",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Concediu permís per enviar automàticament sol·licituds de pel·lícules que no siguin 4K mitjançant Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Concediu permís per enviar automàticament sol·licituds de sèries que no siguin 4K mitjançant Plex Watchlist.",
|
||||
"components.Settings.SettingsLogs.viewdetails": "Veure detalls",
|
||||
"components.TitleCard.tmdbid": "Identificador TMDB",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Llista de seguiment de Plex",
|
||||
"components.MovieDetails.managemovie": "Gestiona la pel·lícula",
|
||||
"components.MovieDetails.theatricalrelease": "Estrena en cines",
|
||||
"components.PermissionEdit.autorequestDescription": "Concediu permís per enviar automàticament sol·licituds de mitjans que no siguin 4K mitjançant llistes de seguiment de Plex.",
|
||||
"components.PermissionEdit.viewwatchlists": "Veure les llistes de seguiment de Plex",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Concediu permís per veure les llistes de seguiment de Plex d'altres usuaris.",
|
||||
"components.RequestCard.tvdbid": "Identificador de TheTVDB",
|
||||
"components.Settings.advancedTooltip": "La configuració incorrecta d'aquesta configuració pot provocar un malfuncionament",
|
||||
"components.Settings.experimentalTooltip": "L'activació d'aquesta configuració pot provocar un comportament inesperat de l'aplicació",
|
||||
"components.TvDetails.reportissue": "Informar d'un problema",
|
||||
"components.TitleCard.mediaerror": "No s'ha trobat {mediaType}",
|
||||
"components.UserProfile.plexwatchlist": "Llista de seguiment de Plex",
|
||||
"components.Layout.UserDropdown.requests": "Sol·licituds",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Sol·licituds de pel·lícules",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Sol·licituds de sèries",
|
||||
"components.MovieDetails.reportissue": "Informa d'un problema",
|
||||
"components.StatusChecker.appUpdatedDescription": "Feu clic al botó següent per tornar a carregar l'aplicació.",
|
||||
"components.StatusChecker.appUpdated": "Actualitzat {applicationTitle}",
|
||||
"components.StatusChecker.restartRequiredDescription": "Si us plau, reinicieu el servidor per aplicar la configuració actualitzada.",
|
||||
"components.AirDateBadge.airsrelative": "Emissió {relativeTime}",
|
||||
"components.MovieDetails.rtaudiencescore": "Puntuació d'audiència de Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Tomàmetre Rotten Tomatoes",
|
||||
"components.MovieDetails.tmdbuserscore": "Puntuació d'usuaris de TMDB",
|
||||
"components.RequestBlock.approve": "Aprova la sol·licitud",
|
||||
"components.RequestBlock.decline": "Rebutja la sol·licitud",
|
||||
"components.RequestBlock.requestdate": "Data de sol·licitud",
|
||||
"components.RequestBlock.requestedby": "Sol·licitat per",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr s'ha de reiniciar perquè els canvis a aquesta configuració tinguin efecte",
|
||||
"components.StatusBadge.managemedia": "Gestiona {mediaType}",
|
||||
"components.TvDetails.Season.somethingwentwrong": "S'ha produït un error en recuperar les dades de la temporada.",
|
||||
"components.TvDetails.rtaudiencescore": "Puntuació d'audiència de Rotten Tomatoes",
|
||||
"components.TvDetails.rtcriticsscore": "Tomàmetre Rotten Tomatoes",
|
||||
"components.TvDetails.seasonstitle": "Temporades",
|
||||
"components.RequestCard.approverequest": "Aprova la sol·licitud",
|
||||
"components.RequestCard.cancelrequest": "Cancel·la la sol·licitud",
|
||||
"components.RequestCard.editrequest": "Edita la sol·licitud",
|
||||
"components.TvDetails.manageseries": "Gestiona les Sèries",
|
||||
"components.RequestBlock.delete": "Suprimeix la sol·licitud",
|
||||
"components.RequestBlock.edit": "Edita la sol·licitud",
|
||||
"components.RequestBlock.lastmodifiedby": "Última modificació per",
|
||||
"components.StatusBadge.playonplex": "Reprodueix a Plex",
|
||||
"components.RequestCard.declinerequest": "Rebutja la sol·licitud",
|
||||
"components.StatusBadge.openinarr": "Obre a {arr}",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Sincronització de la llista de seguiment de Plex",
|
||||
"components.TvDetails.seasonnumber": "Temporada {seasonNumber}",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Episodi} other {# Episodis}}",
|
||||
"components.TvDetails.tmdbuserscore": "Puntuació d'usuaris de TMDB",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.StatusChecker.restartRequired": "Cal reiniciar el servidor",
|
||||
"components.Discover.emptywatchlist": "Els mitjans afegits a la vostra <PlexWatchlistSupportLink>Llista de seguiment de Plex</PlexWatchlistSupportLink> apareixeran aquí.",
|
||||
"components.RequestModal.requestcollection4ktitle": "Sol·licitud de col·lecció en 4K",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "No hem pogut trobar cap coincidència per a aquesta sèrie.",
|
||||
"components.UserProfile.emptywatchlist": "Els mitjans afegits a la vostra <PlexWatchlistSupportLink>Llista de seguiment de Plex</PlexWatchlistSupportLink> apareixeran aquí.",
|
||||
"components.RequestModal.requestseries4ktitle": "Sol·licitud de sèries en 4K",
|
||||
"components.RequestModal.requestcollectiontitle": "Sol·licitud de col·lecció",
|
||||
"components.RequestModal.requestmovie4ktitle": "Sol·licitud de pel·lícula en 4K",
|
||||
"components.RequestModal.requestmovietitle": "Sol·licitud de pel·lícula",
|
||||
"components.RequestModal.requestseriestitle": "Sol·licitud de sèries",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Freqüència actual"
|
||||
}
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
"components.Settings.SettingsUsers.userSettings": "Uživatelské nastavení",
|
||||
"components.Settings.SettingsUsers.defaultPermissions": "Výchozí oprávnění",
|
||||
"components.Settings.SettingsJobsCache.unknownJob": "Neznámá úloha",
|
||||
"components.Settings.SettingsJobsCache.sonarr-scan": "Sonarr Sken",
|
||||
"components.Settings.SettingsJobsCache.sonarr-scan": "Sonarr sken",
|
||||
"components.Settings.SettingsJobsCache.runnow": "Spustit nyní",
|
||||
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr Sken",
|
||||
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr sken",
|
||||
"components.Settings.SettingsJobsCache.jobstarted": "{jobname} zahájeno.",
|
||||
"components.Settings.SettingsJobsCache.jobname": "Název úlohy",
|
||||
"components.Settings.SettingsJobsCache.jobcancelled": "{jobname} zrušeno.",
|
||||
@@ -40,11 +40,11 @@
|
||||
"components.Settings.SettingsAbout.totalmedia": "Celkový počet médií",
|
||||
"components.Settings.SettingsAbout.timezone": "Časové pásmo",
|
||||
"components.Settings.SettingsAbout.supportoverseerr": "Podpořte Overseerr",
|
||||
"components.Settings.SettingsAbout.overseerrinformation": "Overseerr Informace",
|
||||
"components.Settings.SettingsAbout.overseerrinformation": "O Overseer",
|
||||
"components.Settings.SettingsAbout.githubdiscussions": "Diskuze na GitHubu",
|
||||
"components.Settings.SettingsAbout.Releases.viewchangelog": "Zobrazit seznam změn",
|
||||
"components.Settings.SettingsAbout.Releases.versionChangelog": "Seznam změn",
|
||||
"components.Settings.SettingsAbout.Releases.currentversion": "Aktuální verze",
|
||||
"components.Settings.SettingsAbout.Releases.versionChangelog": "{version} Seznam změn",
|
||||
"components.Settings.SettingsAbout.Releases.currentversion": "Aktuální",
|
||||
"components.Settings.RadarrModal.syncEnabled": "Povolit skenování",
|
||||
"components.Settings.RadarrModal.ssl": "Použít SSL",
|
||||
"components.Settings.RadarrModal.servername": "Název serveru",
|
||||
@@ -85,13 +85,12 @@
|
||||
"components.Settings.Notifications.NotificationsLunaSea.webhookUrl": "Webhook URL",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.profileName": "Jméno profilu",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.agentenabled": "Povolit agenta",
|
||||
"components.Search.searchresults": "Výsledek vyhledávání",
|
||||
"components.Search.searchresults": "Výsledky vyhledávání",
|
||||
"components.ResetPassword.passwordreset": "Obnovení hesla",
|
||||
"components.ResetPassword.email": "E-mailová adresa",
|
||||
"components.ResetPassword.confirmpassword": "Potvrďte heslo",
|
||||
"components.RequestModal.selectseason": "Vyberte série",
|
||||
"components.RequestModal.seasonnumber": "{number} Série",
|
||||
"components.RequestModal.requesttitle": "Zažádat o {title}",
|
||||
"components.RequestModal.edit": "Upravit žádost",
|
||||
"components.RequestModal.cancel": "Zrušit žádost",
|
||||
"components.RequestModal.autoapproval": "Automatické schválení",
|
||||
@@ -106,7 +105,7 @@
|
||||
"components.RequestModal.AdvancedRequester.destinationserver": "Cílový server",
|
||||
"components.RequestModal.AdvancedRequester.default": "{name} (výchozí)",
|
||||
"components.RequestList.sortModified": "Naposledy změněno",
|
||||
"components.RequestList.sortAdded": "Datum žádosti",
|
||||
"components.RequestList.sortAdded": "Nejnovější",
|
||||
"components.RequestList.RequestItem.editrequest": "Upravit žádost",
|
||||
"components.RequestList.RequestItem.deleterequest": "Odstranit žádost",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Zrušit žádost",
|
||||
@@ -128,8 +127,8 @@
|
||||
"components.PermissionEdit.viewrequests": "Zobrazit žádosti",
|
||||
"components.PermissionEdit.users": "Spravovat uživatele",
|
||||
"components.PermissionEdit.requestTv": "Žádat seriály",
|
||||
"components.PermissionEdit.requestMovies": "Žádat filmy",
|
||||
"components.PermissionEdit.request4k": "Žádosti ve 4K",
|
||||
"components.PermissionEdit.requestMovies": "Vyžádat filmy",
|
||||
"components.PermissionEdit.request4k": "Vyžádat ve 4K",
|
||||
"components.PermissionEdit.managerequests": "Spravovat žádosti",
|
||||
"components.PermissionEdit.autoapproveSeries": "Automaticky schvalovat seriály",
|
||||
"components.PermissionEdit.autoapproveMovies": "Automaticky schvalovat filmy",
|
||||
@@ -233,7 +232,7 @@
|
||||
"components.NotificationTypeSelector.usermediaapprovedDescription": "Získat upozornění na schválení vašich žádostí o média.",
|
||||
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "Získat upozornění, když ostatní uživatelé zadají nové požadavky na média, která jsou automaticky schválena.",
|
||||
"components.NotificationTypeSelector.mediarequestedDescription": "Odeslat oznámení, když uživatelé zažádají o média vyžadující schválení.",
|
||||
"components.MovieDetails.streamingproviders": "Aktuálně streamovatelné zde",
|
||||
"components.MovieDetails.streamingproviders": "Aktuálně streamovatelné na",
|
||||
"pages.serviceunavailable": "Služba není k dispozici",
|
||||
"pages.returnHome": "Vrátit se domů",
|
||||
"pages.pagenotfound": "Stránka nebyla nalezena",
|
||||
@@ -292,7 +291,6 @@
|
||||
"components.UserProfile.seriesrequest": "Seriál zažádán",
|
||||
"components.UserProfile.requestsperdays": "Zbývá {limit}",
|
||||
"components.UserProfile.recentrequests": "Nedávné žádosti",
|
||||
"components.UserProfile.norequests": "Žádné žádosti.",
|
||||
"components.UserProfile.UserSettings.menuPermissions": "Oprávnění",
|
||||
"components.UserProfile.UserSettings.menuNotifications": "Oznámení",
|
||||
"components.UserProfile.UserSettings.menuGeneralSettings": "Obecné",
|
||||
@@ -388,7 +386,6 @@
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} Seriály",
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "{network} Seriály",
|
||||
"components.Discover.popularmovies": "Populární filmy",
|
||||
"components.Discover.noRequests": "Žádné požadavky.",
|
||||
"components.Discover.discovermovies": "Populární filmy",
|
||||
"components.Discover.discover": "Objevte",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Žánry seriálů",
|
||||
@@ -470,7 +467,7 @@
|
||||
"components.IssueDetails.IssueComment.edit": "Upravit komentář",
|
||||
"components.IssueDetails.allseasons": "Všechny série",
|
||||
"components.IssueDetails.closeissue": "Uzavřít problém",
|
||||
"components.ManageSlideOver.downloadstatus": "Stav stahování",
|
||||
"components.ManageSlideOver.downloadstatus": "Stahování",
|
||||
"components.NotificationTypeSelector.issueresolved": "Problém vyřešen",
|
||||
"components.RequestList.RequestItem.modifieduserdate": "{date} od {user}",
|
||||
"components.RequestList.showallrequests": "Zobrazit všechny žádosti",
|
||||
@@ -564,7 +561,6 @@
|
||||
"components.IssueDetails.play4konplex": "Přehrát ve 4K na Plex",
|
||||
"components.IssueList.IssueItem.openeduserdate": "{date} od uživatele {user}",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Uveďte prosím podrobné vysvětlení problému, na který jste narazili.",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Je problém s {title}?",
|
||||
"components.IssueModal.CreateIssueModal.reportissue": "Nahlásit problém",
|
||||
"components.IssueModal.CreateIssueModal.toastFailedCreate": "Při odesílání problému se něco pokazilo.",
|
||||
"components.IssueDetails.IssueComment.validationComment": "Musíte zadat zprávu",
|
||||
@@ -650,7 +646,7 @@
|
||||
"components.UserList.edituser": "Úprava oprávnění uživatele",
|
||||
"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.RequestModal.pending4krequest": "Čeká na vyřízení žádosti 4K pro {title}",
|
||||
"components.RequestModal.pending4krequest": "Čeká na vyřízení žádosti 4K",
|
||||
"components.Settings.Notifications.NotificationsWebPush.webpushsettingsfailed": "Nastavení webových push oznámení se nepodařilo uložit.",
|
||||
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSending": "Odeslání testovacího oznámení webhooku…",
|
||||
"components.Settings.Notifications.toastEmailTestSending": "Odeslání e-mailového oznámení o testu…",
|
||||
@@ -709,7 +705,7 @@
|
||||
"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.cacheImages": "Povolení ukládání obrázků do mezipaměti",
|
||||
"components.Settings.cacheImagesTip": "Optimalizovat a ukládat všechny obrázky lokálně (spotřebovává značné množství místa na disku)",
|
||||
"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. Overseerr 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",
|
||||
@@ -757,7 +753,6 @@
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sendSilentlyDescription": "Odesílání oznámení bez zvuku",
|
||||
"components.RequestBlock.languageprofile": "Jazykový profil",
|
||||
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Souhrn limitů požadavků tohoto uživatele můžete zobrazit na jeho <ProfileLink>profilové stránce</ProfileLink>.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "K tomuto titulu nebylo nalezeno žádné shrnutí.",
|
||||
"components.Settings.Notifications.NotificationsGotify.token": "Token aplikace",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestFailed": "Testovací oznámení LunaSea se nepodařilo odeslat.",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.validationWebhookUrl": "Musíte zadat platnou adresu URL",
|
||||
@@ -893,11 +888,11 @@
|
||||
"components.Settings.Notifications.NotificationsPushover.userToken": "Klíč uživatele nebo skupiny",
|
||||
"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.RequestCard.mediaerror": "Související titul pro tuto žádost již není k dispozici.",
|
||||
"components.RequestCard.mediaerror": "{mediaType} Nenalezeno",
|
||||
"components.Settings.trustProxyTip": "Povolit Overseerr správně registrovat IP adresy klientů za proxy serverem",
|
||||
"components.RequestList.RequestItem.mediaerror": "Související titul pro tuto žádost již není k dispozici.",
|
||||
"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.SearchByNameModal.notvdbiddescription": "Váš požadavek jsme nemohli automaticky porovnat. Vyberte prosím správnou shodu ze seznamu níže.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Tuto sérii jsme nemohli automaticky spárovat. Níže prosím vyberte správnou shodu.",
|
||||
"components.Settings.RadarrModal.validationBaseUrlLeadingSlash": "Základ URL musí mít na začátku lomítko",
|
||||
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Plex Nedávno přidané skenování",
|
||||
"components.Settings.SettingsLogs.logsDescription": "Tyto protokoly můžete také zobrazit přímo prostřednictvím <code>stdout</code> nebo v <code>{appDataPath}/logs/overseerr.log</code>.",
|
||||
@@ -905,8 +900,7 @@
|
||||
"components.Settings.SonarrModal.loadingprofiles": "Načítání kvalitních profilů…",
|
||||
"components.Settings.SonarrModal.selectRootFolder": "Vyberte kořenovou složku",
|
||||
"components.ResetPassword.requestresetlinksuccessmessage": "Na zadanou e-mailovou adresu bude zaslán odkaz pro obnovení hesla, pokud je spojena s platným uživatelem.",
|
||||
"components.RequestModal.pendingrequest": "Čekající žádost o {title}",
|
||||
"components.RequestModal.request4ktitle": "Požadavek {title} v rozlišení 4K",
|
||||
"components.RequestModal.pendingrequest": "Čekající žádost",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.settingsSaved": "Nastavení oznámení LunaSea úspěšně uloženo!",
|
||||
"components.Settings.SonarrModal.default4kserver": "Výchozí server 4K",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverUserKeyTip": "Váš 30znakový <UsersGroupsLink>identifikátor uživatele nebo skupiny</UsersGroupsLink>",
|
||||
@@ -1036,5 +1030,91 @@
|
||||
"components.RequestButton.decline4krequests": "Odmítnout {requestCount, plural, one {4K žádost} other {{requestCount} 4K žádosti}}",
|
||||
"components.RequestButton.declinerequests": "Odmítnout {requestCount, plural, one {Žádost} other {{requestCount} Žádosti}}",
|
||||
"components.RequestModal.requestmovies": "Požádat {count} {count, plural, one {film} other {filmy}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "{jobScheduleMinutes, plural, one {Každou minutu} few {Každé {jobScheduleMinutes} minuty} other {Každých {jobScheduleMinutes} minut}}"
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "{jobScheduleMinutes, plural, one {Každou minutu} few {Každé {jobScheduleMinutes} minuty} other {Každých {jobScheduleMinutes} minut}}",
|
||||
"components.MovieDetails.digitalrelease": "Digitální vydání",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Váš Plex Watchlist",
|
||||
"components.MovieDetails.physicalrelease": "Fyzické vydání",
|
||||
"components.MovieDetails.managemovie": "Spravovat film",
|
||||
"components.AirDateBadge.airsrelative": "Vysíla se {relativeTime}",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Žádosti o filmy",
|
||||
"components.MovieDetails.rtaudiencescore": "Skóre publika Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Žádosti o seriály",
|
||||
"components.AirDateBadge.airedrelative": "Odvysílano {relativeTime}",
|
||||
"components.Layout.UserDropdown.requests": "Žádosti",
|
||||
"components.MovieDetails.reportissue": "Nahlásit problém",
|
||||
"components.StatusChecker.restartRequired": "Je vyžadován restart serveru",
|
||||
"components.PermissionEdit.viewrecent": "Zobrazit naposledy přidané",
|
||||
"components.StatusChecker.appUpdated": "{applicationTitle} Aktualizováno",
|
||||
"components.StatusChecker.appUpdatedDescription": "Chcete-li aplikaci znovu načíst, klikněte na tlačítko níže.",
|
||||
"components.StatusChecker.restartRequiredDescription": "Chcete-li použít aktualizovaná nastavení, restartujte server.",
|
||||
"components.RequestCard.tmdbid": "TMDB ID",
|
||||
"components.RequestList.RequestItem.tmdbid": "TMDB ID",
|
||||
"components.TitleCard.tmdbid": "TMDB ID",
|
||||
"components.TitleCard.tvdbid": "TheTVDB ID",
|
||||
"components.RequestCard.tvdbid": "TheTVDB ID",
|
||||
"components.RequestList.RequestItem.tvdbid": "TheTVDB ID",
|
||||
"components.PermissionEdit.autorequestMovies": "Automatické vyžádání filmů",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Udělte oprávnění k automatickému odesílání žádostí o filmy v jiném rozlišení než 4K prostřednictvím Plex Watchlistu.",
|
||||
"components.PermissionEdit.viewrecentDescription": "Udělte oprávnění k zobrazení seznamu nedávno přidaných médií.",
|
||||
"components.Settings.restartrequiredTooltip": "Aby se změny tohoto nastavení projevily, musí být Overserr restartován",
|
||||
"components.StatusChecker.reloadApp": "Znovu načíst {applicationTitle}",
|
||||
"components.TitleCard.cleardata": "Vyčistit data",
|
||||
"components.TitleCard.mediaerror": "{mediaType} Nenalezeno",
|
||||
"components.PermissionEdit.autorequestDescription": "Udělte oprávnění k automatickému odesílání žádostí o média jiná než 4K prostřednictvím seznamu Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequest": "Automatická žádost",
|
||||
"components.PermissionEdit.autorequestSeries": "Automaticky vyžádat seriál",
|
||||
"components.PermissionEdit.viewwatchlists": "Zobrazit Plex Watchilisty",
|
||||
"components.Settings.advancedTooltip": "Nesprávná konfigurace tohoto nastavení může vést k narušení funkčnosti",
|
||||
"components.Settings.deleteServer": "Smazat server {serverType}",
|
||||
"components.Settings.experimentalTooltip": "Povolení tohoto nastavení může vést k neočekávanému chování aplikace",
|
||||
"components.Settings.SettingsLogs.viewdetails": "Zobrazit podrobnosti",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Udělte oprávnění k automatickému odesílání žádostí o seriály jiné než 4K prostřednictvím Plex Watchlist.",
|
||||
"components.RequestBlock.approve": "Schválit žádost",
|
||||
"components.RequestBlock.decline": "Odmítnout požadavek",
|
||||
"components.RequestBlock.lastmodifiedby": "Naposledy změněno od",
|
||||
"components.RequestBlock.requestdate": "Datum požadavku",
|
||||
"components.RequestBlock.requestedby": "Vyžádáno od",
|
||||
"components.RequestCard.approverequest": "Schválit žádost",
|
||||
"components.RequestCard.cancelrequest": "Zrušit žádost",
|
||||
"components.RequestCard.declinerequest": "Odmítnout požadavek",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex Watchlist synchronizace",
|
||||
"components.StatusBadge.managemedia": "Spravovat {mediaType}",
|
||||
"components.StatusBadge.openinarr": "Otevřít v {arr}",
|
||||
"components.StatusBadge.playonplex": "Přehrávání cez Plex",
|
||||
"components.TvDetails.manageseries": "Spravovat sérii",
|
||||
"components.RequestBlock.delete": "Smazat požadavek",
|
||||
"components.RequestBlock.edit": "Upravit požadavek",
|
||||
"components.RequestCard.editrequest": "Upravit požadavek",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "Pro tuto sérii jsme nenašli shodu.",
|
||||
"components.RequestModal.requestcollection4ktitle": "Vyžádejte si kolekci ve 4K",
|
||||
"components.RequestModal.requestcollectiontitle": "Vyžádat kolekci",
|
||||
"components.RequestModal.requestmovie4ktitle": "Vyžádejte si film ve 4K",
|
||||
"components.RequestModal.requestmovietitle": "Vyžádat si film",
|
||||
"components.RequestModal.requestseries4ktitle": "Žádost o sérii ve 4K",
|
||||
"components.RequestModal.requestseriestitle": "Vyžádat sérii",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Epizoda} other {# Epizody}}",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Žádost byla odeslána automaticky",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Získejte upozornění, když jsou automaticky odeslány nové požadavky na média pro položky na vašem Plex Watchlistu.",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Udělte oprávnění k zobrazení Plex Watchlistu ostatních uživatelů.",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Při načítání údajů o sezóně se něco pokazilo.",
|
||||
"i18n.restartRequired": "Je vyžadován restart",
|
||||
"components.Discover.plexwatchlist": "Váš Plex Watchlist",
|
||||
"components.MovieDetails.theatricalrelease": "Dostupné v kinách",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex Watchlist",
|
||||
"components.TvDetails.reportissue": "Nahlásit problém",
|
||||
"components.MovieDetails.tmdbuserscore": "Uživatelské skóre TMDB",
|
||||
"components.TvDetails.seasonstitle": "Sezóny",
|
||||
"components.TvDetails.seasonnumber": "Sezóna {seasonNumber}",
|
||||
"components.TvDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer",
|
||||
"components.TvDetails.rtaudiencescore": "Rotten Tomatoes Audience Skóre",
|
||||
"components.TvDetails.tmdbuserscore": "Uživatelské skóre TMDB",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.Discover.emptywatchlist": "Média přidaná do vašeho <PlexWatchlistSupportLink>Plex Watchlistu</PlexWatchlistSupportLink> se zobrazí zde.",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automaticky vyžádat filmy na vašem <PlexWatchlistSupportLink>Plex Watchlistu</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automaticky vyžádejte sérii na vašem <PlexWatchlistSupportLink>Plex Watchlistu</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Automaticky vyžádat sérii",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Automaticky vyžádat filmy",
|
||||
"components.UserProfile.plexwatchlist": "Plex Watchlist",
|
||||
"components.UserProfile.emptywatchlist": "Zde se zobrazí média přidaná do vašeho <PlexWatchlistSupportLink>Plex Watchlistu</PlexWatchlistSupportLink>."
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
"components.Discover.recentlyAdded": "Tilføjet for nyligt",
|
||||
"components.Discover.populartv": "Populære Serier",
|
||||
"components.Discover.popularmovies": "Populære Film",
|
||||
"components.Discover.noRequests": "Ingen forespørgsler.",
|
||||
"components.Discover.discovertv": "Populære Serier",
|
||||
"components.Discover.discover": "Udforsk",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Seriegenrer",
|
||||
@@ -161,7 +160,6 @@
|
||||
"components.PermissionEdit.viewissues": "Vis Problemer",
|
||||
"components.RequestBlock.server": "Destinationsserver",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Ekstra",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Er der et problem med {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Berørt Sæson",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Giv venligst en detaljeret beskrivelse af problemet du stødte på.",
|
||||
"components.IssueModal.CreateIssueModal.reportissue": "Rapportér et Problem",
|
||||
@@ -286,14 +284,13 @@
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Denne bruger skal mindst have <strong>{seasons}</strong> {seasons, plural, one {sæsonforespørgsel} other {sæsonforespørgsler}} tilbage for at indsende en forespørgsel fore denne serie.",
|
||||
"components.RequestModal.QuotaDisplay.season": "sæson",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {sæson} other {sæsoner}}",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Der kunne ikke findes en beskrivelse for denne titel.",
|
||||
"components.RequestModal.alreadyrequested": "Allerede Forespurgt",
|
||||
"components.RequestModal.cancel": "Annullér Forespørgsel",
|
||||
"components.RequestModal.edit": "Redigér Forespørgsel",
|
||||
"components.RequestModal.errorediting": "Noget gik galt under redigeringen af forespørgslen.",
|
||||
"components.RequestModal.extras": "Ekstra",
|
||||
"components.RequestModal.numberofepisodes": "Antal Episoder",
|
||||
"components.RequestModal.pending4krequest": "Afventende 4K Forespørgsler for {title}",
|
||||
"components.RequestModal.pending4krequest": "Afventende 4K Forespørgsler",
|
||||
"components.RequestModal.pendingapproval": "Din forespørgsel afventer godkendelse.",
|
||||
"components.ResetPassword.resetpasswordsuccessmessage": "Kodeord er nulstillet!",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.profileName": "Profilnavn",
|
||||
@@ -336,7 +333,6 @@
|
||||
"components.RequestModal.requesterror": "Noget gik galt under indsendelsen af forespørgslen.",
|
||||
"components.RequestModal.requestfrom": "{username}s forespørgsel afventer godkendelse.",
|
||||
"components.RequestModal.requestseasons": "Forespørg om {seasonCount} {seasonCount, plural, one {Sæson} other {Sæsoner}}",
|
||||
"components.RequestModal.requesttitle": "Forespørg om {title}",
|
||||
"components.RequestModal.season": "Sæson",
|
||||
"components.ResetPassword.passwordreset": "Nulstil Kodeord",
|
||||
"components.ResetPassword.requestresetlinksuccessmessage": "Et link til nulstilling af dit kodeord vil blive sendt til den angivne email adresse såfremt der eksisterer en konto til den.",
|
||||
@@ -408,8 +404,7 @@
|
||||
"components.RequestCard.failedretry": "Noget gik galt ved nyt forsøg på forespørgslen.",
|
||||
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {Ingen} other {<strong>#</strong>}} {type} {remaining, plural, one {forespørgsel} other {forespørgsler}} tilbage",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Vi kunne ikke automatisk matche din forespørgsel. Vælg venligst det korrekte match fra listen nedenfor.",
|
||||
"components.RequestModal.pendingrequest": "Afventende Forespørgsel for {title}",
|
||||
"components.RequestModal.request4ktitle": "Forespørg om {title} i 4K",
|
||||
"components.RequestModal.pendingrequest": "Afventende Forespørgsel",
|
||||
"components.Settings.Notifications.NotificationsPushover.userToken": "Bruger- eller Gruppenøgle",
|
||||
"components.Settings.Notifications.NotificationsPushover.userTokenTip": "Dit 30-tegns <UsersGroupsLink>bruger- eller gruppe-ID</UsersGroupsLink>",
|
||||
"components.Settings.Notifications.NotificationsPushover.validationUserTokenRequired": "Du skal angive en gyldig bruger- eller gruppenøgle",
|
||||
@@ -928,7 +923,6 @@
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailure": "Noget gik galt, kodeordet kunne ikke gemmes.",
|
||||
"components.UserProfile.UserSettings.menuPermissions": "Tilladelser",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Du har ikke tilladelse til at ændre denne bruger's indstillinger.",
|
||||
"components.UserProfile.norequests": "Ingen forespørgsler.",
|
||||
"components.UserProfile.pastdays": "{type} (seneste {days} dage)",
|
||||
"components.UserProfile.recentrequests": "Seneste Forespørgsler",
|
||||
"components.UserProfile.requestsperdays": "{limit} tilbage",
|
||||
|
||||
@@ -33,13 +33,12 @@
|
||||
"components.RequestModal.cancel": "Anfrage abbrechen",
|
||||
"components.RequestModal.extras": "Extras",
|
||||
"components.RequestModal.numberofepisodes": "Anzahl der Folgen",
|
||||
"components.RequestModal.pendingrequest": "Ausstehende Anfrage für {title}",
|
||||
"components.RequestModal.pendingrequest": "Ausstehende Anfrage",
|
||||
"components.RequestModal.requestCancel": "Anfrage für <strong>{title}</strong> abgebrochen.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> erfolgreich angefragt!",
|
||||
"components.RequestModal.requestadmin": "Diese Anfrage wird automatisch genehmigt.",
|
||||
"components.RequestModal.requestfrom": "Die Anfrage von {username} muss noch genehmigt werden.",
|
||||
"components.RequestModal.requestseasons": "{seasonCount} {seasonCount, plural, one {Staffel} other {Staffeln}} anfragen",
|
||||
"components.RequestModal.requesttitle": "{title} anfragen",
|
||||
"components.RequestModal.season": "Staffel",
|
||||
"components.RequestModal.seasonnumber": "Staffel {number}",
|
||||
"components.RequestModal.selectseason": "Staffel(n) Auswählen",
|
||||
@@ -190,7 +189,7 @@
|
||||
"i18n.deleting": "Löschen …",
|
||||
"components.UserList.userdeleteerror": "Beim Löschen des Benutzers ist etwas schief gelaufen.",
|
||||
"components.UserList.userdeleted": "Benutzer erfolgreich gelöscht!",
|
||||
"components.UserList.deleteuser": "{username} löschen",
|
||||
"components.UserList.deleteuser": "Benutzer löschen",
|
||||
"components.UserList.deleteconfirm": "Möchtest du diesen Benutzer wirklich löschen? Alle seine Anfragendaten werden dauerhaft entfernt.",
|
||||
"components.Settings.SonarrModal.testFirstRootFolders": "Teste die Verbindung, um Stammordner zu laden",
|
||||
"components.Settings.SonarrModal.testFirstQualityProfiles": "Teste die Verbindung, um Qualitätsprofile zu laden",
|
||||
@@ -283,8 +282,7 @@
|
||||
"components.Settings.Notifications.NotificationsWebhook.customJson": "JSON-Inhalt",
|
||||
"components.Settings.Notifications.NotificationsWebhook.authheader": "Autorisierungsüberschrift",
|
||||
"components.Settings.Notifications.NotificationsWebhook.agentenabled": "Dienst aktivieren",
|
||||
"components.RequestModal.request4ktitle": "{title} in 4K anfragen",
|
||||
"components.RequestModal.pending4krequest": "Ausstehende 4K Anfrage für {title}",
|
||||
"components.RequestModal.pending4krequest": "Ausstehende 4K Anfrage",
|
||||
"components.RequestButton.viewrequest4k": "4K Anfrage anzeigen",
|
||||
"components.RequestButton.viewrequest": "Anfrage anzeigen",
|
||||
"components.RequestButton.requestmore4k": "Mehr in 4K anfragen",
|
||||
@@ -336,7 +334,6 @@
|
||||
"components.Settings.hideAvailable": "Verfügbare Medien ausblenden",
|
||||
"components.RequestModal.requesterror": "Beim Senden der Anfragen ist etwas schief gelaufen.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Wir konnten deine Anfrage nicht automatisch zuordnen. Bitte wähle eine korrekte Übereinstimmung aus der Liste aus.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Keine Zusammenfassung für diesen Titel gefunden.",
|
||||
"components.Login.signinwithplex": "Benutze dein Plex-Konto",
|
||||
"components.Login.signinheader": "Anmelden um fortzufahren",
|
||||
"components.Login.signingin": "Anmelden …",
|
||||
@@ -581,7 +578,6 @@
|
||||
"components.Settings.SettingsUsers.toastSettingsFailure": "Beim Speichern der Einstellungen ist ein Fehler aufgetreten.",
|
||||
"components.Settings.Notifications.pgpPrivateKeyTip": "Signiere verschlüsselte E-Mail-Nachrichten mit <OpenPgpLink>OpenPGP</OpenPgpLink>",
|
||||
"components.Settings.Notifications.pgpPasswordTip": "Signiere verschlüsselte E-Mail-Nachrichten mit <OpenPgpLink>OpenPGP</OpenPgpLink>",
|
||||
"components.UserProfile.norequests": "Keine Anfragen.",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Sie haben keine Berechtigung, die Einstellungen dieses Benutzers zu ändern.",
|
||||
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Sie können Ihre eigenen Berechtigungen nicht ändern.",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} Minuten",
|
||||
@@ -748,7 +744,6 @@
|
||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {Version} other {Versionen}} hinterher",
|
||||
"components.LanguageSelector.originalLanguageDefault": "Alle Sprachen",
|
||||
"components.LanguageSelector.languageServerDefault": "Standard ({language})",
|
||||
"components.Discover.noRequests": "Keine Anfragen.",
|
||||
"components.Settings.Notifications.NotificationsWebhook.validationTypes": "Sie müssen mindestens einen Benachrichtigungstypen auswählen",
|
||||
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSuccess": "Webhook Test Benachrichtigung gesendet!",
|
||||
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSending": "Webhook test Benachrichtigung wird gesendet…",
|
||||
@@ -853,7 +848,6 @@
|
||||
"components.StatusBadge.status": "{status}",
|
||||
"components.IssueDetails.reopenissueandcomment": "Mit Kommentar wieder öffnen",
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "Alle Staffeln",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Gibt es ein Problem mit {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Betroffene Episode",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Betroffene Staffel",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Geben Sie eine detaillierte Erklärung des Problems an.",
|
||||
|
||||
@@ -114,7 +114,6 @@
|
||||
"components.Discover.recentrequests": "Πρόσφατα Αιτήματα",
|
||||
"components.Discover.recentlyAdded": "Προστέθηκαν πρόσφατα",
|
||||
"components.Discover.populartv": "Δημοφιλείς Σειρές",
|
||||
"components.Discover.noRequests": "Δεν υπάρχουν αιτήματα.",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.webhookUrl": "Webhook URL",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.validationWebhookUrl": "Πρέπει να βάλεις μια έγκυρη διεύθυνση URL",
|
||||
"components.Settings.Notifications.NotificationsLunaSea.toastLunaSeaTestSuccess": "Η δοκιμαστική ειδοποίηση LunaSea εστάλη!",
|
||||
@@ -143,7 +142,6 @@
|
||||
"components.RequestModal.selectseason": "Επιλογή Σεζόν",
|
||||
"components.RequestModal.seasonnumber": "Σεζόν {number}",
|
||||
"components.RequestModal.season": "Σεζόν",
|
||||
"components.RequestModal.requesttitle": "Ζήτα {title}",
|
||||
"components.RequestModal.requestseasons": "Ζήτα {seasonCount} {seasonCount, plural, one {Σεζόν} other {Σεζόν}}",
|
||||
"components.RequestModal.requestfrom": "Το αίτημα του/της {username} εκκρεμεί προς έγκριση.",
|
||||
"components.RequestModal.requesterror": "Κάτι πήγε στραβά κατά την υποβολή του αιτήματος.",
|
||||
@@ -152,17 +150,15 @@
|
||||
"components.RequestModal.requestadmin": "Αυτό το αίτημα θα εγκριθεί αυτόματα.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> ζητήθηκε επιτυχώς!",
|
||||
"components.RequestModal.requestCancel": "Το αίτημα για <strong>{title}</strong> ακυρώθηκε.",
|
||||
"components.RequestModal.request4ktitle": "Ζήτα {title} σε 4K",
|
||||
"components.RequestModal.pendingrequest": "Εκκρεμές Αίτημα για {title}",
|
||||
"components.RequestModal.pendingrequest": "",
|
||||
"components.RequestModal.pendingapproval": "Το αίτημα σου εκκρεμεί προς έγκριση.",
|
||||
"components.RequestModal.pending4krequest": "Εκκρεμές 4K Αίτημα για {title}",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.errorediting": "Κάτι πήγε στραβά κατά την επεξεργασία του αιτήματος.",
|
||||
"components.RequestModal.edit": "Επεξεργασία Αιτήματος",
|
||||
"components.RequestModal.cancel": "Ακύρωση Αιτήματος",
|
||||
"components.RequestModal.autoapproval": "Αυτόματη Έγκριση",
|
||||
"components.RequestModal.alreadyrequested": "Έχει ήδη ζητηθεί",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Δεν μπορέσαμε να αντιστοιχίσουμε αυτόματα το αίτημά σου. Παρακαλώ επίλεξε τη σωστή αντιστοιχία από την παρακάτω λίστα.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Δεν βρέθηκε περίληψη για αυτόν τον τίτλο.",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {σεζόν} other {σεζόν}}",
|
||||
"components.RequestModal.QuotaDisplay.season": "σεζόν",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Αυτός ο χρήστης χρειάζεται τουλάχιστον <strong>{seasons}</strong> {seasons, plural, one {αίτημα σεζόν} other {αιτήματα σεζόν}} απομένουν έτσι ώστε να γίνει αίτημα για αυτή τη σειρά.",
|
||||
@@ -498,7 +494,6 @@
|
||||
"components.UserProfile.requestsperdays": "Απομένει {limit}",
|
||||
"components.UserProfile.recentrequests": "Πρόσφατα Αιτήματα",
|
||||
"components.UserProfile.pastdays": "{type} (περασμένες {days} ημέρες)",
|
||||
"components.UserProfile.norequests": "Δεν υπάρχουν αιτήματα.",
|
||||
"components.UserProfile.movierequests": "Αιτήματα Ταινιών",
|
||||
"components.UserProfile.limit": "{remaining} από {limit}",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "Δεν έχεις άδεια να τροποποιήσεις τον κωδικό πρόσβασης αυτού του χρήστη.",
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"components.Discover.discover": "Discover",
|
||||
"components.Discover.discovermovies": "Popular Movies",
|
||||
"components.Discover.discovertv": "Popular Series",
|
||||
"components.Discover.noRequests": "No requests.",
|
||||
"components.Discover.emptywatchlist": "Media added to your <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> will appear here.",
|
||||
"components.Discover.plexwatchlist": "Your Plex Watchlist",
|
||||
"components.Discover.popularmovies": "Popular Movies",
|
||||
"components.Discover.populartv": "Popular Series",
|
||||
@@ -91,7 +91,6 @@
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "All Seasons",
|
||||
"components.IssueModal.CreateIssueModal.episode": "Episode {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Extras",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Is there a problem with {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Affected Episode",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Affected Season",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Please provide a detailed explanation of the issue you encountered.",
|
||||
@@ -370,8 +369,8 @@
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "This user needs to have at least <strong>{seasons}</strong> {seasons, plural, one {season request} other {season requests}} remaining in order to submit a request for this series.",
|
||||
"components.RequestModal.QuotaDisplay.season": "season",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {season} other {seasons}}",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "No summary for this title was found.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "We couldn't automatically match your request. Please select the correct match from the list below.",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "We were unable to find a match for this series.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "We were unable to automatically match this series. Please select the correct match below.",
|
||||
"components.RequestModal.alreadyrequested": "Already Requested",
|
||||
"components.RequestModal.approve": "Approve Request",
|
||||
"components.RequestModal.autoapproval": "Automatic Approval",
|
||||
@@ -640,10 +639,16 @@
|
||||
"components.Settings.SettingsJobsCache.download-sync": "Download Sync",
|
||||
"components.Settings.SettingsJobsCache.download-sync-reset": "Download Sync Reset",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedule": "Modify Job",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Frequency",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Current Frequency",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "New Frequency",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Every {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Every {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
|
||||
"components.Settings.SettingsJobsCache.flushcache": "Flush Cache",
|
||||
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Image Cache Cleanup",
|
||||
"components.Settings.SettingsJobsCache.imagecache": "Image Cache",
|
||||
"components.Settings.SettingsJobsCache.imagecacheDescription": "When enabled in settings, Overseerr will proxy and cache images from pre-configured external sources. Cached images are saved into your config folder. You can find the files in <code>{appDataPath}/cache/images</code>.",
|
||||
"components.Settings.SettingsJobsCache.imagecachecount": "Images Cached",
|
||||
"components.Settings.SettingsJobsCache.imagecachesize": "Total Cache Size",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Something went wrong while saving the job.",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Job edited successfully!",
|
||||
"components.Settings.SettingsJobsCache.jobcancelled": "{jobname} canceled.",
|
||||
@@ -754,7 +759,7 @@
|
||||
"components.Settings.applicationTitle": "Application Title",
|
||||
"components.Settings.applicationurl": "Application URL",
|
||||
"components.Settings.cacheImages": "Enable Image Caching",
|
||||
"components.Settings.cacheImagesTip": "Cache and serve optimized images (requires a significant amount of disk space)",
|
||||
"components.Settings.cacheImagesTip": "Cache externally sourced images (requires a significant amount of disk space)",
|
||||
"components.Settings.cancelscan": "Cancel Scan",
|
||||
"components.Settings.copied": "Copied API key to clipboard.",
|
||||
"components.Settings.csrfProtection": "Enable CSRF Protection",
|
||||
@@ -881,6 +886,7 @@
|
||||
"components.TitleCard.mediaerror": "{mediaType} Not Found",
|
||||
"components.TitleCard.tmdbid": "TMDB ID",
|
||||
"components.TitleCard.tvdbid": "TheTVDB ID",
|
||||
"components.TvDetails.Season.noepisodes": "Episode list unavailable.",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Something went wrong while retrieving season data.",
|
||||
"components.TvDetails.TvCast.fullseriescast": "Full Series Cast",
|
||||
"components.TvDetails.TvCrew.fullseriescrew": "Full Series Crew",
|
||||
@@ -1048,9 +1054,9 @@
|
||||
"components.UserProfile.UserSettings.menuNotifications": "Notifications",
|
||||
"components.UserProfile.UserSettings.menuPermissions": "Permissions",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "You do not have permission to modify this user's settings.",
|
||||
"components.UserProfile.emptywatchlist": "Media added to your <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> will appear here.",
|
||||
"components.UserProfile.limit": "{remaining} of {limit}",
|
||||
"components.UserProfile.movierequests": "Movie Requests",
|
||||
"components.UserProfile.norequests": "No requests.",
|
||||
"components.UserProfile.pastdays": "{type} (past {days} days)",
|
||||
"components.UserProfile.plexwatchlist": "Plex Watchlist",
|
||||
"components.UserProfile.recentlywatched": "Recently Watched",
|
||||
|
||||
@@ -63,13 +63,12 @@
|
||||
"components.RequestModal.selectseason": "Seleccionar Temporada(s)",
|
||||
"components.RequestModal.seasonnumber": "Temporada {number}",
|
||||
"components.RequestModal.season": "Temporada",
|
||||
"components.RequestModal.requesttitle": "Solicitar {title}",
|
||||
"components.RequestModal.requestseasons": "Solicitar {seasonCount} {seasonCount, plural, one {Temporada} other {Temporadas}}",
|
||||
"components.RequestModal.requestfrom": "La solicitud de {username} está pendiente de aprobación.",
|
||||
"components.RequestModal.requestadmin": "Esta solicitud será aprobada automáticamente.",
|
||||
"components.RequestModal.requestSuccess": "¡<strong>{title}</strong> solicitada con éxito!",
|
||||
"components.RequestModal.requestCancel": "Solicitud para <strong>{title}</strong> cancelada.",
|
||||
"components.RequestModal.pendingrequest": "Solicitud pendiente para {title}",
|
||||
"components.RequestModal.pendingrequest": "Solicitud pendiente",
|
||||
"components.RequestModal.numberofepisodes": "# de Episodios",
|
||||
"components.RequestModal.extras": "Extras",
|
||||
"components.RequestModal.cancel": "Cancelar Petición",
|
||||
@@ -298,8 +297,7 @@
|
||||
"components.Settings.Notifications.NotificationsWebhook.agentenabled": "Habilitar Agente",
|
||||
"components.RequestModal.requestedited": "¡Solicitud para <strong>{title}</strong> modificada con éxito!",
|
||||
"components.RequestModal.requestcancelled": "Solicitud para <strong>{title}</strong> cancelada.",
|
||||
"components.RequestModal.request4ktitle": "Solicitar {title} en 4K",
|
||||
"components.RequestModal.pending4krequest": "Solicitud pendiente en 4K para {title}",
|
||||
"components.RequestModal.pending4krequest": "Solicitud pendiente en 4K",
|
||||
"components.RequestModal.errorediting": "Algo salió mal al editar la solicitud.",
|
||||
"components.RequestModal.AdvancedRequester.rootfolder": "Carpeta Raíz",
|
||||
"components.RequestModal.AdvancedRequester.qualityprofile": "Perfil de calidad",
|
||||
@@ -358,7 +356,6 @@
|
||||
"components.ResetPassword.confirmpassword": "Confirmar Contraseña",
|
||||
"components.RequestModal.requesterror": "Algo fue mal al realizar la solicitud.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "No hemos podido emparejar automáticamente tu solicitud. Por favor, selecciona el correcto de la lista.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "No se ha encontrado un resumen para este título.",
|
||||
"components.RequestModal.AdvancedRequester.requestas": "Pedir como",
|
||||
"components.RequestModal.AdvancedRequester.languageprofile": "Perfil de Idioma",
|
||||
"components.RequestModal.AdvancedRequester.folder": "{path} ({space})",
|
||||
@@ -609,7 +606,6 @@
|
||||
"i18n.settings": "Ajustes",
|
||||
"i18n.advanced": "Avanzado",
|
||||
"components.UserProfile.recentrequests": "Solicitudes Recientes",
|
||||
"components.UserProfile.norequests": "Sin solicitudes.",
|
||||
"components.UserProfile.UserSettings.menuPermissions": "Permisos",
|
||||
"components.UserProfile.UserSettings.menuNotifications": "Notificaciones",
|
||||
"components.UserProfile.UserSettings.menuGeneralSettings": "General",
|
||||
@@ -742,7 +738,6 @@
|
||||
"components.Layout.VersionStatus.streamstable": "Overseer (Estable)",
|
||||
"components.Layout.VersionStatus.streamdevelop": "Overseer (Desarrollo)",
|
||||
"components.Layout.VersionStatus.outofdate": "Desactualizado",
|
||||
"components.Discover.noRequests": "Sin solicitudes.",
|
||||
"components.UserList.autogeneratepasswordTip": "Envía por email una contraseña al usuario generada por el servidor",
|
||||
"i18n.retrying": "Reintentando…",
|
||||
"components.Settings.serverSecure": "seguro",
|
||||
@@ -896,7 +891,6 @@
|
||||
"components.ManageSlideOver.manageModalRequests": "Solicitudes",
|
||||
"components.IssueList.sortModified": "Última Modificación",
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "Todas las Temporadas",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "¿Hay algún problema con {title}?",
|
||||
"components.IssueModal.CreateIssueModal.episode": "Episodio {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Temporada Afectada",
|
||||
"components.IssueModal.CreateIssueModal.toastviewissue": "Ver Incidencia",
|
||||
|
||||
@@ -33,13 +33,12 @@
|
||||
"components.RequestModal.cancel": "Annuler la demande",
|
||||
"components.RequestModal.extras": "Extras",
|
||||
"components.RequestModal.numberofepisodes": "Nbr d'épisodes",
|
||||
"components.RequestModal.pendingrequest": "Demande en attente pour {title}",
|
||||
"components.RequestModal.pendingrequest": "Demande en attente",
|
||||
"components.RequestModal.requestCancel": "Demande pour <strong>{title}</strong> refusée.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> demandé avec succès !",
|
||||
"components.RequestModal.requestadmin": "Cette demande sera validée automatiquement.",
|
||||
"components.RequestModal.requestfrom": "La demande de {username} est en attente de validation.",
|
||||
"components.RequestModal.requestseasons": "Demander {seasonCount} {seasonCount, plural, one {saison} other {saisons}}",
|
||||
"components.RequestModal.requesttitle": "Demander {title}",
|
||||
"components.RequestModal.season": "Saison",
|
||||
"components.RequestModal.seasonnumber": "Saison {number}",
|
||||
"components.RequestModal.selectseason": "Sélectionner la/les saison(s)",
|
||||
@@ -236,7 +235,7 @@
|
||||
"components.MovieDetails.watchtrailer": "Regarder la bande-annonce",
|
||||
"components.CollectionDetails.requestcollection": "Demander la collection",
|
||||
"components.CollectionDetails.overview": "Résumé",
|
||||
"components.CollectionDetails.numberofmovies": "{count} Films",
|
||||
"components.CollectionDetails.numberofmovies": "{count} films",
|
||||
"i18n.requested": "Demandé",
|
||||
"i18n.retry": "Réessayer",
|
||||
"i18n.failed": "Échec",
|
||||
@@ -279,8 +278,7 @@
|
||||
"components.Settings.Notifications.NotificationsWebhook.templatevariablehelp": "Aide sur les variables de modèle",
|
||||
"components.Settings.Notifications.NotificationsWebhook.authheader": "En-tête d'autorisation",
|
||||
"components.Settings.Notifications.NotificationsWebhook.agentenabled": "Activer l'agent",
|
||||
"components.RequestModal.request4ktitle": "Demander {title} en 4K",
|
||||
"components.RequestModal.pending4krequest": "Demande en attente pour {title} en 4K",
|
||||
"components.RequestModal.pending4krequest": "Demande 4K en attente",
|
||||
"components.RequestButton.viewrequest4k": "Voir la demande 4K",
|
||||
"components.RequestButton.viewrequest": "Voir la demande",
|
||||
"components.RequestButton.requestmore4k": "Demander d'autres ajouts en 4K",
|
||||
@@ -335,8 +333,7 @@
|
||||
"i18n.experimental": "Expérimentale",
|
||||
"components.Settings.hideAvailable": "Masquer les médias disponibles",
|
||||
"components.RequestModal.requesterror": "Une erreur s'est produite lors de la demande.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Nous n'avons pas pu associer votre demande automatiquement. Veuillez sélectionner l'association correcte dans la liste ci-dessous.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Aucun résumé trouvé pour ce titre.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Nous n'avons pas pu associer cette série automatiquement. Veuillez sélectionner l'association correcte dans la liste ci-dessous.",
|
||||
"components.Login.signinwithplex": "Utilisez votre compte Plex",
|
||||
"components.Login.signin": "Connexion",
|
||||
"components.Login.signinheader": "Connectez-vous pour continuer",
|
||||
@@ -585,7 +582,6 @@
|
||||
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Vous ne pouvez pas modifier vos propres permissions.",
|
||||
"components.Settings.Notifications.pgpPrivateKeyTip": "Signer des emails chiffrés en utilisant <OpenPgpLink>OpenPGP</OpenPgpLink>",
|
||||
"components.Settings.Notifications.pgpPasswordTip": "Signer des emails chiffrés en utilisant <OpenPgpLink>OpenPGP</OpenPgpLink>",
|
||||
"components.UserProfile.norequests": "Aucune demande.",
|
||||
"components.Settings.Notifications.pgpPrivateKey": "PGP Clé privée",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutes",
|
||||
"components.TvDetails.episodeRuntime": "Durée d'un épisode",
|
||||
@@ -625,7 +621,7 @@
|
||||
"components.ResetPassword.passwordreset": "Réinitialiser le mot de passe",
|
||||
"pages.internalservererror": "Erreur interne du serveur",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailureVerifyCurrent": "Un problème est survenu lors de l'enregistrement du mot de passe. Votre mot de passe actuel a-t-il été saisi correctement ?",
|
||||
"components.Settings.cacheImagesTip": "Optimiser et stocker toutes les images localement (consomme une quantité considérable d'espace disque)",
|
||||
"components.Settings.cacheImagesTip": "Met en cache localement et utilise des images optimisées (nécessite une quantité considérable d'espace disque)",
|
||||
"components.Settings.cacheImages": "Activer la mise en cache d'image",
|
||||
"components.Settings.SettingsLogs.time": "Horodatage",
|
||||
"components.Settings.SettingsLogs.resumeLogs": "Résumer",
|
||||
@@ -724,17 +720,16 @@
|
||||
"components.Settings.Notifications.validationPgpPassword": "Vous devez fournir un mot de passe PGP",
|
||||
"components.Settings.Notifications.botUsernameTip": "Permet aux utilisateurs de démarrer également une conversation avec votre bot et de configurer leurs propres notifications personnelles",
|
||||
"components.RequestModal.pendingapproval": "Votre demande est en attente de validation.",
|
||||
"components.RequestList.RequestItem.mediaerror": "Le titre associé à cette demande n’est plus disponible.",
|
||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} non trouvé",
|
||||
"components.RequestList.RequestItem.deleterequest": "Supprimer la Demande",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Annuler la demande",
|
||||
"components.RequestCard.mediaerror": "Le titre associé à cette demande n’est plus disponible.",
|
||||
"components.RequestCard.mediaerror": "{mediaType} non trouvé",
|
||||
"components.RequestCard.deleterequest": "Supprimer la Demande",
|
||||
"components.NotificationTypeSelector.notificationTypes": "Types de Notification",
|
||||
"components.Layout.VersionStatus.streamstable": "Overseerr stable",
|
||||
"components.Layout.VersionStatus.streamdevelop": "Développement d'Overseerr",
|
||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} en retard",
|
||||
"components.Layout.VersionStatus.outofdate": "Obsolète",
|
||||
"components.Discover.noRequests": "Aucune demande.",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "Vous devez avoir au moins <strong>{seasons}</strong> {seasons, plural, one {demande de saison} other {demandes de saisons}} afin de soumettre une demande pour cette série.",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Cet utilisateur doit avoir au moins <strong>{seasons}</strong> {seasons, plural, one {demande de saison} other {demandes de saisons}} afin de soumettre une demande pour cette série.",
|
||||
"components.Settings.noDefaultNon4kServer": "Si vous n’avez qu’un seul serveur {serverType} pour les contenus non-4K et 4K (ou si vous ne téléchargez que du contenu 4K), votre serveur {serverType} ne devrait <strong>PAS</strong> être désigné comme serveur 4K.",
|
||||
@@ -866,7 +861,6 @@
|
||||
"components.IssueDetails.reopenissueandcomment": "Rouvrir avec un commentaire",
|
||||
"components.IssueDetails.season": "Saison {seasonNumber}",
|
||||
"components.IssueModal.CreateIssueModal.episode": "Épisode {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Y a-t-il un problème avec {title} ?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Épisode concerné",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Saison affectée",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Fournissez une explication détaillée du problème.",
|
||||
@@ -1056,7 +1050,7 @@
|
||||
"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.TitleCard.cleardata": "Effacer les données",
|
||||
"components.TitleCard.mediaerror": "{mediaType} Non trouvé",
|
||||
"components.TitleCard.mediaerror": "{mediaType} non trouvé",
|
||||
"components.TitleCard.tmdbid": "TMDB ID",
|
||||
"components.TitleCard.tvdbid": "TheTVDB ID",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Demander automatiquement les films",
|
||||
@@ -1068,5 +1062,59 @@
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synchronisation de la Plex Watchlist",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Demande automatiquement les films sur ta <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink>",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Recevez une notification lorsque de nouvelles demandes de médias sont automatiquement soumises pour des éléments de votre Plex Watchlist.",
|
||||
"components.StatusChecker.restartRequired": "Redémarrage du serveur requis"
|
||||
"components.StatusChecker.restartRequired": "Redémarrage du serveur requis",
|
||||
"components.StatusChecker.appUpdated": "{applicationTitle} mis à jour",
|
||||
"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.experimentalTooltip": "L'activation de ce paramètre peut entraîner un comportement inattendu de l'application",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex Watchlist",
|
||||
"components.PermissionEdit.viewwatchlists": "Voir Plex Watchlists",
|
||||
"components.TvDetails.reportissue": "Signaler un problème",
|
||||
"components.AirDateBadge.airedrelative": "Diffusé {relativeTime}",
|
||||
"components.AirDateBadge.airsrelative": "Diffusion {relativeTime}",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Demandes de films",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Demandes de séries",
|
||||
"components.Layout.UserDropdown.requests": "Demandes",
|
||||
"components.MovieDetails.managemovie": "Gérer le film",
|
||||
"components.MovieDetails.reportissue": "Signaler un problème",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# épisode} sur {# épisodes}}",
|
||||
"components.TvDetails.manageseries": "Gérer les séries",
|
||||
"components.TvDetails.seasonnumber": "Saison {seasonNumber}",
|
||||
"components.TvDetails.seasonstitle": "Saisons",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.MovieDetails.rtaudiencescore": "Note d'audience de Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Rotten Tomatoes Tomatomètre",
|
||||
"components.MovieDetails.tmdbuserscore": "Note des utilisateurs TMDB",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Autorise à voir la Plex Watchlist des autres utilisateurs.",
|
||||
"components.RequestBlock.approve": "Approuver la demande",
|
||||
"components.RequestBlock.decline": "Refuser la demande",
|
||||
"components.RequestBlock.delete": "Supprimer la demande",
|
||||
"components.RequestBlock.edit": "Modifier la demande",
|
||||
"components.RequestBlock.languageprofile": "Profil de langue",
|
||||
"components.RequestBlock.lastmodifiedby": "Dernière modification par",
|
||||
"components.RequestBlock.requestdate": "Date de la demande",
|
||||
"components.RequestBlock.requestedby": "Demandé par",
|
||||
"components.RequestCard.approverequest": "Approuver la demande",
|
||||
"components.RequestCard.cancelrequest": "Annuler la demande",
|
||||
"components.RequestCard.declinerequest": "Refuser la demande",
|
||||
"components.StatusBadge.managemedia": "Gérer {mediaType}",
|
||||
"components.StatusBadge.openinarr": "Ouvrir dans {arr}",
|
||||
"components.StatusBadge.playonplex": "Lire sur Plex",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Une erreur s'est produite lors de la récupération des données de la saison.",
|
||||
"components.TvDetails.rtaudiencescore": "Note d'audience de Rotten Tomatoes",
|
||||
"components.TvDetails.rtcriticsscore": "Rotten Tomatoes Tomatomètre",
|
||||
"components.TvDetails.tmdbuserscore": "Note des utilisateurs TMDB",
|
||||
"components.UserProfile.plexwatchlist": "Plex Watchlist",
|
||||
"components.RequestCard.editrequest": "Modifier la demande",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr doit être redémarré pour que les modifications de ce paramètre prennent effet",
|
||||
"components.Settings.deleteServer": "Supprimer {serverType} serveur",
|
||||
"components.RequestModal.requestcollection4ktitle": "Demander la collection en 4K",
|
||||
"components.Discover.emptywatchlist": "Les médias ajoutés à ta <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> apparaîtront ici.",
|
||||
"components.RequestModal.requestcollectiontitle": "Demander la collection",
|
||||
"components.UserProfile.emptywatchlist": "Les médias ajoutés à ta <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> apparaîtront ici.",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "Nous n'avons pas pu trouver de correspondance pour cette série.",
|
||||
"components.RequestModal.requestmovie4ktitle": "Demander le film en 4K",
|
||||
"components.RequestModal.requestmovietitle": "Demander le film",
|
||||
"components.RequestModal.requestseries4ktitle": "Demander la série en 4K",
|
||||
"components.RequestModal.requestseriestitle": "Demander la série"
|
||||
}
|
||||
|
||||
264
src/i18n/locale/hr.json
Normal file
264
src/i18n/locale/hr.json
Normal file
@@ -0,0 +1,264 @@
|
||||
{
|
||||
"components.CollectionDetails.numberofmovies": "{count} Filmovi",
|
||||
"components.CollectionDetails.overview": "Pregled",
|
||||
"components.CollectionDetails.requestcollection4k": "Zahtjev za serijalom u 4K",
|
||||
"components.CollectionDetails.requestcollection": "Zahtjev za serijalom",
|
||||
"components.Discover.DiscoverMovieGenre.genreMovies": "{genre} Filmovi",
|
||||
"components.Discover.DiscoverMovieLanguage.languageMovies": "{language} Filmovi",
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "{network} Serije",
|
||||
"components.Discover.DiscoverStudio.studioMovies": "{studio} Filmovi",
|
||||
"components.Discover.discover": "Otkrivanje",
|
||||
"components.Discover.discovermovies": "Popularni Filmovi",
|
||||
"components.Discover.discovertv": "Popularne Serije",
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} Serije",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "{language} Serije",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Vaš Plex popis za gledanje",
|
||||
"components.Discover.MovieGenreList.moviegenres": "Filmski Žanrovi",
|
||||
"components.Discover.StudioSlider.studios": "Studio",
|
||||
"components.Discover.TvGenreList.seriesgenres": "Serijski Žanrovi",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Serijski Žanrovi",
|
||||
"components.Discover.plexwatchlist": "Vaš Plex popis za gledanje",
|
||||
"components.Discover.popularmovies": "Popularni Filmovi",
|
||||
"components.Discover.recentlyAdded": "Nedavno Dodano",
|
||||
"components.Discover.recentrequests": "Nedavni Zahtjevi",
|
||||
"components.Discover.trending": "Popularno",
|
||||
"components.IssueDetails.IssueComment.edit": "Uredi Komentar",
|
||||
"components.IssueDetails.IssueDescription.deleteissue": "Izbriši problem",
|
||||
"components.IssueDetails.IssueDescription.description": "Opis",
|
||||
"components.IssueDetails.IssueDescription.edit": "Uredi opis",
|
||||
"components.IssueDetails.allepisodes": "Sve Epizode",
|
||||
"components.IssueDetails.closeissue": "Zatvori Problem",
|
||||
"components.IssueDetails.closeissueandcomment": "Zatvori s komentarom",
|
||||
"components.IssueDetails.commentplaceholder": "Dodaj komentar…",
|
||||
"components.IssueDetails.comments": "Komentari",
|
||||
"components.IssueDetails.deleteissue": "Izbriši problem",
|
||||
"components.AirDateBadge.airedrelative": "Emitirano {relativeTime}",
|
||||
"components.AirDateBadge.airsrelative": "Emitiranje {relativeTime}",
|
||||
"components.AppDataWarning.dockerVolumeMissingDescription": "Navedeni <code>{appDataPath}</code> mapirani volumen nije ispravno podešen. Svi podaci će biti izbrisani kada se spremnik (container) zaustavi ili ponovno pokrene.",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex popis za gledanje",
|
||||
"components.Discover.emptywatchlist": "Filmovi dodani na Vaš <PlexWatchlistSupportLink> popis za gledanje </PlexWatchlistSupportLink> pojaviti će se ovdje.",
|
||||
"components.Discover.MovieGenreSlider.moviegenres": "Filmski Žanrovi",
|
||||
"components.Discover.NetworkSlider.networks": "Striming servisi",
|
||||
"components.Discover.populartv": "Popularne Serije",
|
||||
"components.Discover.upcomingtv": "Nadolazeće Serije",
|
||||
"components.Discover.upcoming": "Nadolazeći Filmovi",
|
||||
"components.Discover.upcomingmovies": "Nadolazeći Filmovi",
|
||||
"components.DownloadBlock.estimatedtime": "Procijenjeno {time}",
|
||||
"components.IssueDetails.IssueComment.areyousuredelete": "Jeste li sigurni da želite izbrisati ovaj komentar?",
|
||||
"components.IssueDetails.IssueComment.delete": "Izbriši Komentar",
|
||||
"components.IssueDetails.IssueComment.postedby": "Objavljeno u {relativeTime} od korisnika {username}",
|
||||
"components.IssueDetails.IssueComment.validationComment": "Morate unijeti poruku",
|
||||
"components.IssueDetails.IssueComment.postedbyedited": "Objavljeno u {relativeTime} od korisnika {username} (Uređeno)",
|
||||
"components.IssueDetails.allseasons": "Sve Sezone",
|
||||
"components.IssueDetails.episode": "Epizode {episodeNumber}",
|
||||
"components.IssueDetails.deleteissueconfirm": "Jeste li sigurni da želite izbrisati ovaj problem?",
|
||||
"components.IssueDetails.lastupdated": "Zadnje ažurirano",
|
||||
"components.IssueDetails.leavecomment": "Komentar",
|
||||
"components.IssueDetails.nocomments": "Bez komentara.",
|
||||
"components.IssueDetails.openedby": "#{issueId} otvoren u {relativeTime} od korisnka {username}",
|
||||
"components.IssueDetails.openin4karr": "Otvoren u 4K {arr}",
|
||||
"components.IssueDetails.openinarr": "Otvoren u {arr}",
|
||||
"components.IssueDetails.toasteditdescriptionfailed": "Nešto nije u redu prilikom uređivanja opisa problema.",
|
||||
"components.IssueModal.CreateIssueModal.allepisodes": "Sve epizode",
|
||||
"components.IssueDetails.toastissuedeleted": "Problem je uspješno izbrisan!",
|
||||
"components.IssueDetails.unknownissuetype": "Nepoznato",
|
||||
"components.IssueList.issues": "Problem",
|
||||
"components.IssueList.IssueItem.openeduserdate": "{date} od korinika {user}",
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "Sve sezone",
|
||||
"components.IssueModal.issueOther": "Ostalo",
|
||||
"components.IssueModal.issueAudio": "Zvuk",
|
||||
"components.IssueModal.issueSubtitles": "Podnaslov",
|
||||
"components.IssueModal.issueVideo": "Video",
|
||||
"components.IssueList.IssueItem.seasons": "{seasonCount, plural, one {Sezona} other {Sezone}}",
|
||||
"components.Layout.UserDropdown.myprofile": "Profil",
|
||||
"components.Layout.UserDropdown.requests": "Zahtjevi",
|
||||
"components.Layout.VersionStatus.streamstable": "Overseerr Stabilan",
|
||||
"components.Login.password": "Zaporka",
|
||||
"components.ManageSlideOver.openarr4k": "Otvori 4K u {arr}-u",
|
||||
"components.ManageSlideOver.pastdays": "Proteklih {days, number} dana",
|
||||
"components.Login.signinwithplex": "Koristite svoj Plex račun",
|
||||
"components.ManageSlideOver.movie": "film",
|
||||
"components.Login.validationemailrequired": "Morate unijeti valjanu adresu e-pošte",
|
||||
"components.ManageSlideOver.manageModalRequests": "Zahtjevi",
|
||||
"components.ManageSlideOver.manageModalClearMediaWarning": "* Ovo će nepovratno ukloniti sve podatke za ovaj {mediaType}, uključujući sve zahtjeve. Ako ova stavka postoji u vašoj Plex biblioteci, informacije o medijima ponovno će se stvoriti tijekom sljedećeg skeniranja.",
|
||||
"components.ManageSlideOver.manageModalMedia4k": "4K Mediji",
|
||||
"components.ManageSlideOver.manageModalNoRequests": "Nema zahtjeva.",
|
||||
"components.ManageSlideOver.manageModalMedia": "Mediji",
|
||||
"components.ManageSlideOver.manageModalTitle": "Upravljanje {mediaType}",
|
||||
"components.ManageSlideOver.mark4kavailable": "Označi kao dostupno u 4K",
|
||||
"components.MovieDetails.originaltitle": "Izvorni naslov",
|
||||
"components.MovieDetails.overview": "Pregled",
|
||||
"components.ManageSlideOver.openarr": "Otvori u {arr}-u",
|
||||
"components.MovieDetails.cast": "Postava",
|
||||
"components.MovieDetails.budget": "Proračun",
|
||||
"components.ManageSlideOver.opentautulli": "Otvori u Tautulli-u",
|
||||
"components.MediaSlider.ShowMoreCard.seemore": "Vidi više",
|
||||
"components.MovieDetails.markavailable": "Označi kao dostupno",
|
||||
"components.ManageSlideOver.tvshow": "serije",
|
||||
"components.MovieDetails.productioncountries": "{countryCount, plural, one {Država produkcije} other {Države produkcije}}",
|
||||
"components.MovieDetails.managemovie": "Upravljanje filmom",
|
||||
"components.MovieDetails.playonplex": "Reproduciraj na Plex-u",
|
||||
"components.MovieDetails.overviewunavailable": "Pregled nedostupan.",
|
||||
"components.MovieDetails.reportissue": "Prijavi problem",
|
||||
"components.MovieDetails.revenue": "Prihod",
|
||||
"components.MovieDetails.rtaudiencescore": "Rotten Tomatoes ocjena publike",
|
||||
"components.MovieDetails.showless": "Prikaži manje",
|
||||
"components.MovieDetails.showmore": "Prikaži više",
|
||||
"components.MovieDetails.similar": "Slični naslovi",
|
||||
"components.MovieDetails.streamingproviders": "Trenutačno se prikacuje na",
|
||||
"components.NotificationTypeSelector.issuecommentDescription": "Pošaljite obavijest kada problemi dobiju nove komentare.",
|
||||
"components.NotificationTypeSelector.issueresolved": "Problem riješen",
|
||||
"components.NotificationTypeSelector.issuereopened": "Problem ponovno otvoren",
|
||||
"components.NotificationTypeSelector.issueresolvedDescription": "Pošalji obavijest kada se problem riješi.",
|
||||
"components.NotificationTypeSelector.issuereopenedDescription": "Pošalji obavijest kada se problem ponovno otvori.",
|
||||
"components.NotificationTypeSelector.mediaAutoApproved": "Automatsko odobravanje zahtjeva",
|
||||
"components.IssueDetails.issuepagetitle": "Problem",
|
||||
"components.IssueDetails.issuetype": "Tip",
|
||||
"components.IssueDetails.play4konplex": "Reproduciraj u 4K na Plex-u",
|
||||
"components.IssueDetails.playonplex": "Reproduciraj na Plex-u",
|
||||
"components.IssueDetails.problemseason": "Zahvaćene Sezone",
|
||||
"components.IssueDetails.problemepisode": "Zahvaćene Epizode",
|
||||
"components.IssueDetails.reopenissue": "Ponovno otvorite problem",
|
||||
"components.IssueDetails.reopenissueandcomment": "Ponovno otvori s komentarom",
|
||||
"components.IssueDetails.season": "Sezona {seasonNumber}",
|
||||
"components.IssueDetails.toasteditdescriptionsuccess": "Opis problema je uspješno uređen!",
|
||||
"components.IssueDetails.toastissuedeletefailed": "Nešto nije u redu prilikom brisanja problema.",
|
||||
"components.IssueDetails.toaststatusupdated": "Status problema je uspješno ažuriran!",
|
||||
"components.IssueDetails.toaststatusupdatefailed": "Nešto nije u redu prilikom ažuriranja statusa problema.",
|
||||
"components.IssueList.IssueItem.issuestatus": "Status",
|
||||
"components.IssueList.IssueItem.issuetype": "Vrsta",
|
||||
"components.IssueList.IssueItem.opened": "Otvoren",
|
||||
"components.IssueList.IssueItem.problemepisode": "Zahvaćene Epizode",
|
||||
"components.IssueList.IssueItem.unknownissuetype": "Nepoznato",
|
||||
"components.IssueList.IssueItem.episodes": "{episodeCount, plural, one {Epizoda} other {Epizode}}",
|
||||
"components.IssueList.IssueItem.viewissue": "Pogledaj problem",
|
||||
"components.IssueList.showallissues": "Prikaži sve probleme",
|
||||
"components.IssueList.sortAdded": "Najnoviji",
|
||||
"components.IssueList.sortModified": "Zadnje promjene",
|
||||
"components.IssueModal.CreateIssueModal.episode": "Epizoda {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Dodaci",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Zahvaćene epizode",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Zahvaćene sezone",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Navedite detaljno objašnjenje problema na koji ste naišli.",
|
||||
"components.IssueModal.CreateIssueModal.reportissue": "Prijavite problem",
|
||||
"components.IssueModal.CreateIssueModal.season": "Sezona {seasonNumber}",
|
||||
"components.IssueModal.CreateIssueModal.submitissue": "Pošalji problem",
|
||||
"components.IssueModal.CreateIssueModal.toastFailedCreate": "Nešto nije u redu prilikom slanja problema.",
|
||||
"components.IssueModal.CreateIssueModal.toastSuccessCreate": "Problem prijavljen za <strong>{title}</strong> je uspješno predan!",
|
||||
"components.IssueModal.CreateIssueModal.toastviewissue": "Pogledaj problem",
|
||||
"components.IssueModal.CreateIssueModal.validationMessageRequired": "Morate unijeti opis",
|
||||
"components.IssueModal.CreateIssueModal.whatswrong": "Što nije u redu?",
|
||||
"components.LanguageSelector.languageServerDefault": "Default ({language})",
|
||||
"components.LanguageSelector.originalLanguageDefault": "Svi jezici",
|
||||
"components.Layout.LanguagePicker.displaylanguage": "Jezik prikaza",
|
||||
"components.Layout.SearchInput.searchPlaceholder": "Pretražite filmove i TV",
|
||||
"components.Layout.Sidebar.dashboard": "Otkrivanje",
|
||||
"components.Layout.Sidebar.issues": "Problemi",
|
||||
"components.Layout.Sidebar.requests": "Zahtjevi",
|
||||
"components.Layout.Sidebar.settings": "Postavke",
|
||||
"components.Layout.Sidebar.users": "Korisnici",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Zahtjevi za serije",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Zahtjevi za filmove",
|
||||
"components.Layout.UserDropdown.settings": "Postavke",
|
||||
"components.Layout.UserDropdown.signout": "Odjavi se",
|
||||
"components.Layout.VersionStatus.outofdate": "Zastarjelo",
|
||||
"components.Layout.VersionStatus.streamdevelop": "Overseerr Razvoj",
|
||||
"components.Login.email": "Adresa e-pošte",
|
||||
"components.Login.forgotpassword": "Zaboravljena lozinka?",
|
||||
"components.Login.loginerror": "Nešto nije u redu prilikom pokušaja prijave.",
|
||||
"components.Login.signin": "Prijavite se",
|
||||
"components.Login.signingin": "Prijava…",
|
||||
"components.Layout.VersionStatus.commitsbehind": "",
|
||||
"components.Login.signinheader": "Prijavite se za nastavak",
|
||||
"components.Login.signinwithoverseerr": "Koristite svoj {applicationTitle} račun",
|
||||
"components.Login.validationpasswordrequired": "Morate unijeti lozinku",
|
||||
"components.ManageSlideOver.alltime": "Cijelo vrijeme",
|
||||
"components.ManageSlideOver.downloadstatus": "Preuzimanja",
|
||||
"components.ManageSlideOver.manageModalAdvanced": "Napredna",
|
||||
"components.ManageSlideOver.manageModalClearMedia": "Obriši podatke",
|
||||
"components.ManageSlideOver.manageModalIssues": "Otvoreni problemi",
|
||||
"components.ManageSlideOver.markallseasons4kavailable": "Označi sve sezone kao dostupne u 4K",
|
||||
"components.ManageSlideOver.markallseasonsavailable": "Označi sve sezone kao dostupne",
|
||||
"components.ManageSlideOver.markavailable": "Označi kao dostupno",
|
||||
"components.ManageSlideOver.playedby": "Reproducirano od",
|
||||
"components.ManageSlideOver.plays": "<strong>{playCount, broj}</strong> {playCount, plural, one {reproducirano} other {reproducirano}}",
|
||||
"components.MovieDetails.MovieCast.fullcast": "Glumačka postava",
|
||||
"components.MovieDetails.digitalrelease": "Digitalno izdanje",
|
||||
"components.MovieDetails.mark4kavailable": "Označi kao dostupno u 4K",
|
||||
"components.MovieDetails.originallanguage": "Izvorni jezik",
|
||||
"components.MovieDetails.MovieCrew.fullcrew": "Filmska postava",
|
||||
"components.MovieDetails.physicalrelease": "Fizičko izdanje",
|
||||
"components.MovieDetails.play4konplex": "Reproduciraj u 4K na Plex-u",
|
||||
"components.MovieDetails.recommendations": "Preporuke",
|
||||
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Datum Izlaska} other {Datumi izlaska}}",
|
||||
"components.MovieDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer",
|
||||
"components.MovieDetails.runtime": "{minutes} minute",
|
||||
"components.MovieDetails.studio": "{studioCount, plural, one {Studio} other {Studiji}}",
|
||||
"components.MovieDetails.theatricalrelease": "Izdanje u kinima",
|
||||
"components.MovieDetails.tmdbuserscore": "Ocjena korisnika TMDB-a",
|
||||
"components.MovieDetails.viewfullcrew": "Pogledajte cijelu filmsku postavu",
|
||||
"components.MovieDetails.watchtrailer": "Pogledajte najavu",
|
||||
"components.NotificationTypeSelector.adminissuecommentDescription": "Primite obavijest kada drugi korisnici komentiraju probleme.",
|
||||
"components.NotificationTypeSelector.adminissuereopenedDescription": "Primite obavijest kada problem ponovno otvore drugi korisnici.",
|
||||
"components.NotificationTypeSelector.adminissueresolvedDescription": "Primite obavijest kada drugi korisnici riješe probleme.",
|
||||
"components.NotificationTypeSelector.issuecomment": "Komentiraj problem",
|
||||
"components.NotificationTypeSelector.issuecreated": "Problem prijavljen",
|
||||
"components.NotificationTypeSelector.issuecreatedDescription": "Pošalji obavijest kada se problem prijavi.",
|
||||
"components.NotificationTypeSelector.userissueresolvedDescription": "Primite obavijest kada problemi koje ste prijavili budu riješeni.",
|
||||
"components.NotificationTypeSelector.mediaavailableDescription": "Slanje obavijesti kada medijski zahtjevi postanu dostupni.",
|
||||
"components.NotificationTypeSelector.mediadeclinedDescription": "Slanje obavijesti kada su medijski zahtjevi odbijeni.",
|
||||
"components.NotificationTypeSelector.mediarequested": "Zahtjev čeka odobrenje",
|
||||
"components.NotificationTypeSelector.mediarequestedDescription": "Slanje obavijesti kada korisnici pošalju nove medijske zahtjeve koji zahtijevaju odobrenje.",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Zahtjev je automatski poslan",
|
||||
"components.NotificationTypeSelector.mediaavailable": "Zahtjev dostupan",
|
||||
"components.NotificationTypeSelector.mediafailedDescription": "Slanje obavijesti kada se medijski zahtjevi ne uspiju dodati u Radarr ili Sonarr.",
|
||||
"components.NotificationTypeSelector.userissuecommentDescription": "Primite obavijest kada problemi koje ste prijavili dobiju nove komentare.",
|
||||
"components.PermissionEdit.autoapprove4kSeries": "Automatsko odobravanje serija u 4K",
|
||||
"components.NotificationTypeSelector.usermediafailedDescription": "Primite obavijest kada se medijski zahtjevi ne uspiju dodati u Radarr ili Sonarr.",
|
||||
"components.NotificationTypeSelector.usermediarequestedDescription": "Primite obavijest kada drugi korisnici pošalju nove medijske zahtjeve koji zahtijevaju odobrenje.",
|
||||
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "Primite obavijest kada drugi korisnici pošalju nove medijske zahtjeve koji se automatski odobravaju.",
|
||||
"components.NotificationTypeSelector.usermediadeclinedDescription": "Primite obavijest kada vaši medijski zahtjevi budu odbijeni.",
|
||||
"components.PermissionEdit.adminDescription": "Potpuni administratorski pristup. Zaobilazi sve druge provjere dopuštenja.",
|
||||
"components.PermissionEdit.advancedrequest": "Napredni zahtjevi",
|
||||
"components.PermissionEdit.autoapprove4k": "Automatsko odobravanje 4K",
|
||||
"components.PermissionEdit.autoapproveSeriesDescription": "Dozvolite automatsko odobravanje zahtjeva za serijale koji nisu u 4K.",
|
||||
"components.PermissionEdit.autoapprove4kMoviesDescription": "Dozvolite automatsko odobravanje zahtjeva za filmove u 4K.",
|
||||
"components.PermissionEdit.autoapprove4kSeriesDescription": "Dozvolite automatsko odobravanje zahtjeva za serije u 4K.",
|
||||
"components.QuotaSelector.days": "{count, plural, one {danu} other {danu}}",
|
||||
"components.QuotaSelector.movies": "{count, plural, one {film} other {filmova}}",
|
||||
"components.PermissionEdit.autoapproveMoviesDescription": "Dozvolite automatsko odobravanje zahtjeva za filmove koji nisu u 4K.",
|
||||
"components.RequestButton.approve4krequests": "Odobriti {requestCount, plural, one {4K Zahtjev} other {{requestCount} 4K Zahtjeve}}",
|
||||
"components.RequestModal.QuotaDisplay.movielimit": "{limit, plural, one {film} other {filmova}}",
|
||||
"components.RequestButton.approverequests": "Odobriti {requestCount, plural, one {Zatjev} other {{requestCount} Zahtjeve}}",
|
||||
"components.QuotaSelector.seasons": "{count, plural, one {sezona} other {sezone}}",
|
||||
"components.RequestCard.seasons": "{seasonCount, plural, one {Sezona} other {Sezone}}",
|
||||
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Sezona} other {Sezone}}",
|
||||
"components.RequestBlock.seasons": "{seasonCount, plural, one {Sezona} other {Sezone}}",
|
||||
"components.RequestButton.decline4krequests": "Odbiti {requestCount, plural, one {4K Zahtjev} other {{requestCount} 4K Zahtjeve}}",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Ovaj korisnik treba imati još barem <strong>{seasons}</strong> {seasons, plural, one {jedan zahtjev za sezonu} other {nekoliko zahtjeva za sezone}} kako bi mogao preadti zahtjev za ovu seriju.",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "Morate imati još barem <strong>{seasons}</strong> {seasons, plural, one {jedan zahtjev za sezonu} other {nekoliko zahtjeva za sezone}} kako bi mogli preadti zahtjev za ovu seriju.",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {sezona} other {sezona/e}}",
|
||||
"components.RequestModal.requestmovies": "{count} {count, plural, one {Zahtjev za film} other {Zahtjevi za filmove}}",
|
||||
"components.RequestModal.requestmovies4k": "{count} {count, plural, one {Zahtjev za film} other {Zahtejvi za filmove}} u 4K",
|
||||
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Slanje obavijesti kada korisnici pošalju novi medijski zahtjev koji se automatski odobrava.",
|
||||
"components.NotificationTypeSelector.mediaapproved": "Zahtjev odobren",
|
||||
"components.NotificationTypeSelector.mediaapprovedDescription": "Slanje obavijesti kada se medijski zahtjev ručno odobri.",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Primite obavijest kada se automatski pošalje novi medijski zahtjevi za stavke na vašoj Plex listi koju pratite.",
|
||||
"components.NotificationTypeSelector.mediadeclined": "Zahtjev je odbijen",
|
||||
"components.NotificationTypeSelector.mediafailed": "Obrada zahtjeva nije uspjela",
|
||||
"components.NotificationTypeSelector.notificationTypes": "Vrste obavijesti",
|
||||
"components.NotificationTypeSelector.userissuecreatedDescription": "Primite obavijest kada drugi korisnici prijave probleme.",
|
||||
"components.NotificationTypeSelector.userissuereopenedDescription": "Primite obavijest kada se problemi koje ste prijavili ponovno otvore.",
|
||||
"components.NotificationTypeSelector.usermediaapprovedDescription": "Primite obavijest kada vaši zahtjevi za medije budu odobreni.",
|
||||
"components.NotificationTypeSelector.usermediaavailableDescription": "Primite obavijest kada vaši medijski zahtjevi postanu dostupni.",
|
||||
"components.PermissionEdit.admin": "Administrator",
|
||||
"components.PermissionEdit.advancedrequestDescription": "Dodajte dozvolu za izmjenu naprednih opcija zahtjeva za medije.",
|
||||
"components.PermissionEdit.autoapprove": "Automatsko odobravanje",
|
||||
"components.PermissionEdit.autoapprove4kMovies": "Automatsko odobravanje 4K filmova",
|
||||
"components.PermissionEdit.autoapprove4kDescription": "Dozvolite automatsko odobravanje svih zahtjeva za 4K medije.",
|
||||
"components.PermissionEdit.autoapproveDescription": "Dozvolite automatsko odobravanje svih zahtjeva koji nisu u 4K mediji.",
|
||||
"components.PermissionEdit.autoapproveMovies": "Automatsko odobravanje filmova",
|
||||
"components.PermissionEdit.autoapproveSeries": "Automatsko odobravanje serijala",
|
||||
"components.RequestButton.declinerequests": "Odbiti {requestCount, plural, one {Zahtjev} other {{requestCount} Zahtjeve}}",
|
||||
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {No} other {<strong>#</strong>}} {type} {remaining, plural, one {zahtjev preostalo} other {zahtjeva preostala}}"
|
||||
}
|
||||
@@ -103,7 +103,6 @@
|
||||
"components.RequestModal.extras": "Extrák",
|
||||
"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.SearchByNameModal.nosummary": "Nem található összefoglaló ehhez a címhez.",
|
||||
"components.RequestModal.AdvancedRequester.rootfolder": "Root könyvtár",
|
||||
"components.RequestModal.AdvancedRequester.qualityprofile": "Minőség profil",
|
||||
"components.RequestModal.AdvancedRequester.destinationserver": "Cél szerver",
|
||||
@@ -201,13 +200,11 @@
|
||||
"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.requesttitle": "{title} kérése",
|
||||
"components.RequestModal.requestseasons": "{seasonCount} évad kérése",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> kérés elküldve!",
|
||||
"components.RequestModal.requestCancel": "<strong>{title}</strong> kérése visszavonva.",
|
||||
"components.RequestModal.request4ktitle": "{title} kérése - 4K-ban",
|
||||
"components.RequestModal.pendingrequest": "Függőben lévő kérés {title} - hez",
|
||||
"components.RequestModal.pending4krequest": "Függőben lévő 4k-s kérés a {title}-hoz",
|
||||
"components.RequestModal.pendingrequest": "Elbírálásra váró kérelem",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.autoapproval": "Automatikus jóváhagyás",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Nem sikerült azonosítani a kérésed. Kérlek, válaszd ki a megfelelő találatot az alábbi listából.",
|
||||
"components.RequestBlock.profilechanged": "Minőség profil",
|
||||
@@ -645,7 +642,6 @@
|
||||
"components.UserProfile.seriesrequest": "Sorozatkérések",
|
||||
"components.UserProfile.requestsperdays": "{limit} maradt",
|
||||
"components.UserProfile.recentrequests": "Legutóbbi kérések",
|
||||
"components.UserProfile.norequests": "Nincs kérés.",
|
||||
"components.UserProfile.movierequests": "Filmkérések",
|
||||
"components.UserProfile.limit": "{remaining} a {limit}-ből",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Nincs jogosultsága a felhasználó beállításainak módosítására.",
|
||||
@@ -750,7 +746,6 @@
|
||||
"components.LanguageSelector.languageServerDefault": "Alap ({language})",
|
||||
"components.DownloadBlock.estimatedtime": "Becsült {time}",
|
||||
"components.Discover.upcomingtv": "Hamarosan megjelenő sorozatok",
|
||||
"components.Discover.noRequests": "Nincsenek kérések.",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Sorozat műfajok",
|
||||
"components.Discover.TvGenreList.seriesgenres": "Sorozat műfajok",
|
||||
"components.Discover.StudioSlider.studios": "Studiók",
|
||||
@@ -885,7 +880,6 @@
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "Minden Évad",
|
||||
"components.IssueModal.CreateIssueModal.episode": "{episodeNumber}. Epizód",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Extrák",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Probléma van ezzel? {title}",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Érintett Epizód",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Érintett Évad",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Kérjük, adjon részletes magyarázatot a felmerült problémára.",
|
||||
@@ -1018,5 +1012,31 @@
|
||||
"i18n.importing": "Importálás…",
|
||||
"i18n.import": "Importálás",
|
||||
"components.PermissionEdit.viewissues": "Problémák Megtekintése",
|
||||
"components.Settings.externalUrl": "Külső URL"
|
||||
"components.Settings.externalUrl": "Külső URL",
|
||||
"components.MovieDetails.physicalrelease": "Fizikai kiadás",
|
||||
"components.MovieDetails.digitalrelease": "Digitális kiadás",
|
||||
"components.RequestCard.cancelrequest": "Kérés visszavonása",
|
||||
"components.RequestCard.declinerequest": "Kérelem elutasítása",
|
||||
"components.RequestCard.editrequest": "Kérelem szerkesztése",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "",
|
||||
"components.PermissionEdit.autorequest": "Automatikus kérés",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "A kérelem automatikusan elküldve",
|
||||
"components.MovieDetails.reportissue": "Probléma bejelentése",
|
||||
"components.PermissionEdit.autorequestMovies": "Filmek automatikus kérése",
|
||||
"components.NotificationTypeSelector.issuecomment": "Probléma Megjegyzés",
|
||||
"components.PermissionEdit.autorequestSeries": "Automatikus kérés sorozatok",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Sorozatkérések",
|
||||
"components.MovieDetails.managemovie": "Film kezelése",
|
||||
"components.MovieDetails.rtaudiencescore": "Rotten Tomatoes közönségpontszám",
|
||||
"components.MovieDetails.tmdbuserscore": "TMDB felhasználói pontszám",
|
||||
"components.RequestBlock.delete": "Kérelem törlése",
|
||||
"components.RequestBlock.edit": "Kérelem szerkesztése",
|
||||
"components.RequestBlock.approve": "Kérelem jóváhagyása",
|
||||
"components.RequestBlock.decline": "Kérelem elutasítása",
|
||||
"components.RequestBlock.lastmodifiedby": "Utoljára módosította",
|
||||
"components.RequestBlock.requestdate": "Igénylés dátuma",
|
||||
"components.RequestCard.approverequest": "Kérelem jóváhagyása",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Filmkérések",
|
||||
"components.Layout.UserDropdown.requests": "Kérések",
|
||||
"components.RequestModal.requestcollectiontitle": "Gyűjtemény kérése"
|
||||
}
|
||||
|
||||
@@ -90,9 +90,8 @@
|
||||
"components.Settings.RadarrModal.apiKey": "Chiave API",
|
||||
"components.Settings.RadarrModal.add": "Aggiungi un server",
|
||||
"components.Settings.Notifications.discordsettingsfailed": "Impossibile salvare le impostazioni di Discord.",
|
||||
"components.RequestModal.requesttitle": "Richiedi {title}",
|
||||
"components.RequestModal.requestfrom": "La richiesta di {username} è in attesa di approvazione.",
|
||||
"components.RequestModal.pendingrequest": "Richiesta in sospeso per {title}",
|
||||
"components.RequestModal.pendingrequest": "Richiesta in sospeso",
|
||||
"components.Layout.Sidebar.dashboard": "Esplora",
|
||||
"components.TvDetails.cast": "Cast",
|
||||
"components.TvDetails.anime": "Anime",
|
||||
@@ -302,7 +301,6 @@
|
||||
"components.Login.email": "Indirizzo e-mail",
|
||||
"components.Settings.Notifications.NotificationsWebhook.templatevariablehelp": "Guida per variabili di modello",
|
||||
"components.Settings.Notifications.NotificationsWebhook.agentenabled": "Abilita Agente",
|
||||
"components.RequestModal.request4ktitle": "Richiedi {title} in 4K",
|
||||
"components.Settings.Notifications.NotificationsWebhook.authheader": "Intestazione di autorizzazione",
|
||||
"components.MediaSlider.ShowMoreCard.seemore": "Vedi altro",
|
||||
"components.RequestBlock.server": "Server di destinazione",
|
||||
@@ -323,7 +321,7 @@
|
||||
"components.Settings.Notifications.NotificationsWebhook.customJson": "Payload JSON",
|
||||
"components.RequestModal.requestedited": "Richiesta di <strong>{title}</strong> modificata correttamente!",
|
||||
"components.RequestModal.requestcancelled": "Richiesta per <strong>{title}</strong> eliminata.",
|
||||
"components.RequestModal.pending4krequest": "Richiesta 4K in sospeso per {title}",
|
||||
"components.RequestModal.pending4krequest": "Richiesta 4K in sospeso",
|
||||
"components.RequestModal.errorediting": "Qualcosa è andato storto durante la modifica della richiesta.",
|
||||
"components.RequestModal.autoapproval": "Approvazione automatica",
|
||||
"components.RequestModal.AdvancedRequester.rootfolder": "Cartella principale",
|
||||
@@ -426,7 +424,6 @@
|
||||
"components.ResetPassword.confirmpassword": "Conferma la password",
|
||||
"components.RequestModal.requesterror": "Qualcosa è andato storto durante l'invio della richiesta.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Non siamo riusciti a soddisfare automaticamente la tua richiesta. Seleziona la corrispondenza corretta dall'elenco seguente.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Non è stato trovato alcun riassunto per questo titolo.",
|
||||
"components.RequestModal.AdvancedRequester.requestas": "Richiedi come",
|
||||
"components.RequestModal.AdvancedRequester.languageprofile": "Profilo lingua",
|
||||
"components.PlexLoginButton.signinwithplex": "Accedi",
|
||||
@@ -587,7 +584,6 @@
|
||||
"components.RequestModal.AdvancedRequester.folder": "{path} ({space})",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Generi Serie",
|
||||
"components.Discover.MovieGenreSlider.moviegenres": "Generi film",
|
||||
"components.UserProfile.norequests": "Nessuna richiesta.",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Non hai l'autorizzazione per modificare le impostazioni di questo utente.",
|
||||
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Non è possibile modificare le proprie autorizzazioni.",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minuti",
|
||||
@@ -709,7 +705,6 @@
|
||||
"components.RequestModal.AdvancedRequester.tags": "Tag",
|
||||
"components.RequestModal.AdvancedRequester.selecttags": "Seleziona i tag",
|
||||
"components.RequestModal.AdvancedRequester.notagoptions": "Nessun tag.",
|
||||
"components.Discover.noRequests": "Nessuna richiesta.",
|
||||
"components.Layout.VersionStatus.outofdate": "Non aggiornato",
|
||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {versione} other {versioni}} indietro",
|
||||
"components.Settings.serviceSettingsDescription": "Configura i tuoi server {serverType} qui sotto. Puoi collegare più server {serverType}, ma solo due possono essere contrassegnati come predefiniti (uno non-4K e uno 4K). Gli amministratori possono selezionare il server usato per elaborare le nuove richieste prima dell'approvazione.",
|
||||
@@ -871,7 +866,6 @@
|
||||
"components.IssueDetails.toaststatusupdated": "Stato segnalazione aggiornato correttamente!",
|
||||
"components.IssueDetails.toaststatusupdatefailed": "Qualcosa è andato storto durante l'aggiornamento dello stato della segnalazione.",
|
||||
"components.IssueList.IssueItem.problemepisode": "Episodio coinvolto",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "C'è un problema con {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Episodio coinvolto",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Stagione coinvolta",
|
||||
"components.IssueModal.CreateIssueModal.toastFailedCreate": "Qualcosa è andato storto durante l'invio della segnalazione.",
|
||||
@@ -1036,5 +1030,14 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "ID Utente Discord",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.discordIdTip": "Il <FindDiscordIdLink>numero ID a più cifre</FindDiscordIdLink> associato al tuo account utente Discord",
|
||||
"components.Settings.SettingsAbout.appDataPath": "Cartella applicazione",
|
||||
"components.RequestBlock.languageprofile": "Lingua Profilo"
|
||||
"components.RequestBlock.languageprofile": "Lingua Profilo",
|
||||
"components.MovieDetails.digitalrelease": "Uscita versione digitale",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "La tua lista da guardare Plex",
|
||||
"components.Discover.plexwatchlist": "La tua lista da guardare Plex",
|
||||
"components.PermissionEdit.autorequest": "Richiesta automatica",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Lista da guardare Plex",
|
||||
"components.MovieDetails.managemovie": "Gestisci Film",
|
||||
"components.MovieDetails.physicalrelease": "Uscita versione fisica",
|
||||
"components.MovieDetails.theatricalrelease": "Uscita nelle sale",
|
||||
"components.MovieDetails.reportissue": "Segnala un problema"
|
||||
}
|
||||
|
||||
@@ -33,13 +33,12 @@
|
||||
"components.RequestModal.cancel": "キャンセルリクエスト",
|
||||
"components.RequestModal.extras": "おまけ",
|
||||
"components.RequestModal.numberofepisodes": "エピソード数",
|
||||
"components.RequestModal.pendingrequest": "{title} がリクエスト中",
|
||||
"components.RequestModal.pendingrequest": "",
|
||||
"components.RequestModal.requestCancel": "<strong>{title}</strong> のリクエストは取り消されました。",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> のリクエストは完了しました。",
|
||||
"components.RequestModal.requestadmin": "このリクエストは今すぐ承認されます。",
|
||||
"components.RequestModal.requestfrom": "{username} はすでにリクエストを上げています。",
|
||||
"components.RequestModal.requestseasons": "{seasonCount} シーズンをリクエスト",
|
||||
"components.RequestModal.requesttitle": "{title}をリクエスト",
|
||||
"components.RequestModal.season": "シーズン",
|
||||
"components.RequestModal.seasonnumber": "シーズン {number}",
|
||||
"components.RequestModal.selectseason": "シーズンを選ぶ",
|
||||
@@ -345,7 +344,6 @@
|
||||
"components.LanguageSelector.languageServerDefault": "デフォルト言語({language})",
|
||||
"components.DownloadBlock.estimatedtime": "所要時間:{time}",
|
||||
"components.Discover.upcomingtv": "今後リリースされるシリーズ",
|
||||
"components.Discover.noRequests": "リクエストが有りません。",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "シリーズのジャンル",
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre}シリーズ",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "{language}のシリーズ",
|
||||
@@ -356,13 +354,12 @@
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "{network}シーリーズ",
|
||||
"components.Discover.DiscoverMovieLanguage.languageMovies": "{language}の映画",
|
||||
"components.Discover.DiscoverMovieGenre.genreMovies": "{genre}映画",
|
||||
"components.RequestModal.pending4krequest": "{title} が 4K リクエスト中",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.errorediting": "リクエストを編集するときに問題が発生しました。",
|
||||
"components.RequestModal.edit": "リクエストを編集",
|
||||
"components.RequestModal.autoapproval": "自動承認",
|
||||
"components.RequestModal.alreadyrequested": "すでにリクエスト済み",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "リクエストは自動的にマッチできませんでした。以下のリストから正しいマッチングを選択してください。",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "このタイトルの概要は見つかりませんでした。",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "シーズン",
|
||||
"components.RequestModal.QuotaDisplay.season": "シーズン",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "このユーザーはこのシーズンをリクエストするには、最低でも <strong>{seasons}</strong> シーズンリクエストが残っている必要があります。",
|
||||
@@ -502,7 +499,6 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.applanguage": "表示言語",
|
||||
"components.Settings.locale": "表示言語",
|
||||
"components.StatusBadge.status": "{status}",
|
||||
"components.UserProfile.norequests": "リクエストが有りません。",
|
||||
"components.ManageSlideOver.downloadstatus": "ダウンロード",
|
||||
"components.ManageSlideOver.manageModalClearMedia": "データを消去",
|
||||
"components.ManageSlideOver.manageModalRequests": "リクエスト",
|
||||
@@ -570,7 +566,6 @@
|
||||
"components.IssueList.showallissues": "すべてのチケットを表示",
|
||||
"components.IssueModal.CreateIssueModal.episode": "エピソード {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.extras": "特典",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "{title}に問題がありますか?",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "該当シーズン",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "チケットの詳細をご記入ください。",
|
||||
"components.IssueModal.CreateIssueModal.submitissue": "報告を送信",
|
||||
@@ -654,7 +649,6 @@
|
||||
"components.NotificationTypeSelector.adminissueresolvedDescription": "他ユーザーがチケットを解決した際に通知を受ける",
|
||||
"components.NotificationTypeSelector.issuereopenedDescription": "チケットが再度開く際に通知を受ける",
|
||||
"components.ManageSlideOver.markavailable": "視聴可能にする",
|
||||
"components.RequestModal.request4ktitle": "4Kで {title} をリクエストする",
|
||||
"components.RequestModal.requestedited": "<strong>{title}</strong>のリクエストは編集に成功しました!",
|
||||
"components.RequestModal.requesterror": "リクエストの送信中に問題が発生しました。",
|
||||
"components.Settings.Notifications.NotificationsGotify.validationTokenRequired": "アプリケーショントークンを入力してください",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"components.Discover.populartv": "Populiarūs serialai",
|
||||
"components.Discover.recentlyAdded": "Paskutiniai pridėti",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Serialų žanrai",
|
||||
"components.Discover.noRequests": "Nėra rezervacijų.",
|
||||
"components.Discover.trending": "Populiarėjantys",
|
||||
"components.DownloadBlock.estimatedtime": "Liko {time}",
|
||||
"components.IssueDetails.IssueComment.areyousuredelete": "Ar tikrai norite ištrinti šį komentarą?",
|
||||
@@ -231,7 +230,6 @@
|
||||
"components.RequestModal.season": "Sezonas",
|
||||
"components.RequestModal.requestApproved": "<strong>{title}</strong> rezervacija patvirtinta!",
|
||||
"components.RequestModal.requestadmin": "Rezervacija bus automatiškai patvirtinta.",
|
||||
"components.RequestModal.requesttitle": "Rezervuoti {title}",
|
||||
"components.RequestModal.selectmovies": "Pasirinkite filmą(-us)",
|
||||
"components.RequestModal.selectseason": "Pasirinkite sezoną(-us)",
|
||||
"components.Search.searchresults": "Paieškos rezultatai",
|
||||
@@ -303,7 +301,6 @@
|
||||
"components.IssueList.sortAdded": "Naujausi",
|
||||
"components.IssueList.sortModified": "Paskutinės redaguotos",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Papildomos",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Ar iškilo problema su {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Paveikti epizodai",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Prašome pateikti detalų kilusios problemos aprašą.",
|
||||
"components.IssueModal.CreateIssueModal.reportissue": "Pranešti apie problemą",
|
||||
@@ -399,13 +396,11 @@
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Šiam vartootjui reikia <strong>{seasons}</strong> {seasons, plural, one {sezono rezervacijos} other {sezonų rezervacijų}}, kad rezervuoti šį serialą.",
|
||||
"components.RequestModal.QuotaDisplay.season": "sezonas",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {sezonas} other {sezonai}}",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Nerastas aprašymas.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Negalėjome automatiškai surasti jūsų rezervacijos. Prašau pasirinkti tinkamą variantą iš galimų.",
|
||||
"components.RequestModal.approve": "Tvirtinti rezervaciją",
|
||||
"components.RequestModal.autoapproval": "Automatinis patvirtinimas",
|
||||
"components.RequestModal.pending4krequest": "Laukiama 4K rezervacija {title}",
|
||||
"components.RequestModal.pendingrequest": "Laukiama rezervacijos {title}",
|
||||
"components.RequestModal.request4ktitle": "Rezervuoti {title} 4K raiška",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.pendingrequest": "",
|
||||
"components.RequestModal.requestmovies4k": "Rezervacijos {count} {count, plural, one {filmo} other {filmų}} 4K raiška",
|
||||
"components.RequestModal.requestseasons4k": "Rezervuoti {seasonCount} {seasonCount, plural, one {sezoną} other {sezonus}} 4K raiška",
|
||||
"components.ResetPassword.emailresetlink": "El. pašto atkūrimo nuoroda",
|
||||
|
||||
@@ -30,16 +30,15 @@
|
||||
"components.RequestCard.seasons": "{seasonCount, plural, one {Sesong} other {Sesonger}}",
|
||||
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Sesong} other {Sesonger}}",
|
||||
"components.RequestList.requests": "Forespørsler",
|
||||
"components.RequestModal.cancel": "Slett forespørsel",
|
||||
"components.RequestModal.cancel": "Avbryt Forespørsel",
|
||||
"components.RequestModal.extras": "Ekstra",
|
||||
"components.RequestModal.numberofepisodes": "Antall episoder",
|
||||
"components.RequestModal.pendingrequest": "Ventende forespørsel for {title}",
|
||||
"components.RequestModal.pendingrequest": "Ventende forespørsel",
|
||||
"components.RequestModal.requestCancel": "Forespørsel for <strong>{title}</strong> kansellert.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> forespurt!",
|
||||
"components.RequestModal.requestadmin": "Din forespørsel vil bli godkjent automatisk.",
|
||||
"components.RequestModal.requestadmin": "Denne forespørselen vil bli godkjent automagisk.",
|
||||
"components.RequestModal.requestfrom": "{username} sin forespørsel venter på godkjenning.",
|
||||
"components.RequestModal.requestseasons": "Forespør {seasonCount} {seasonCount, plural, one {Sesong} other {Sesonger}}",
|
||||
"components.RequestModal.requesttitle": "Forespør {title}",
|
||||
"components.RequestModal.season": "Sesong",
|
||||
"components.RequestModal.seasonnumber": "Sesong {number}",
|
||||
"components.RequestModal.selectseason": "Velg sesong(er)",
|
||||
@@ -181,7 +180,7 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.role": "Rolle",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Filtrer innhold basert på regiontilgjengelighet",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Utforskelsesregion",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Plexbruker",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Plex-bruker",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Eier",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Filtrer innhold basert på originalspråk",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguage": "Utforskelsesspråk",
|
||||
@@ -255,11 +254,9 @@
|
||||
"components.ResetPassword.confirmpassword": "Verifiser passord",
|
||||
"components.RequestModal.requesterror": "Noe gikk galt ved sending av forespørsel.",
|
||||
"components.RequestModal.requestcancelled": "Forespørsel for <strong>{title}</strong> kansellert.",
|
||||
"components.RequestModal.request4ktitle": "Forespør {title} i 4K",
|
||||
"components.RequestModal.pending4krequest": "Ventende forespørsel i 4K for {title}",
|
||||
"components.RequestModal.pending4krequest": "Ventende forespørsel i 4K",
|
||||
"components.RequestModal.errorediting": "Noe gikk galt under endring av forespørselen.",
|
||||
"components.RequestModal.autoapproval": "Automatisk Godkjenning",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Fant ingen sammendrag.",
|
||||
"components.RequestModal.autoapproval": "Automagisk Godkjenning",
|
||||
"components.RequestModal.AdvancedRequester.rootfolder": "Grunnmappe",
|
||||
"components.RequestModal.AdvancedRequester.requestas": "Forespør som",
|
||||
"components.RequestModal.AdvancedRequester.qualityprofile": "Kvalitetsprofil",
|
||||
@@ -274,7 +271,7 @@
|
||||
"components.RequestList.showallrequests": "Vis Alle Forespørsler",
|
||||
"components.RequestList.RequestItem.modifieduserdate": "{date} av {user}",
|
||||
"components.RequestList.RequestItem.modified": "Endret",
|
||||
"components.RequestList.RequestItem.failedretry": "Noe gikk galt under forespørsel-forsøket.",
|
||||
"components.RequestList.RequestItem.failedretry": "Noe gikk galt mens du prøvde forespørselen på nytt.",
|
||||
"components.RequestButton.viewrequest4k": "Vis forespørsel i 4K",
|
||||
"components.RequestButton.viewrequest": "Vis Forespørsel",
|
||||
"components.RequestButton.requestmore4k": "Forespør mer i 4K",
|
||||
@@ -300,38 +297,38 @@
|
||||
"components.PersonDetails.birthdate": "Født {birthdate}",
|
||||
"components.PersonDetails.alsoknownas": "Også kjent som: {names}",
|
||||
"components.PermissionEdit.viewrequests": "Vis Forespørsler",
|
||||
"components.PermissionEdit.requestDescription": "Gi tilgang til å forespørre medie som ikke er i 4K.",
|
||||
"components.PermissionEdit.requestDescription": "Gi tilgang til å forespørre matriale som ikke er i 4K.",
|
||||
"components.PermissionEdit.request4kTvDescription": "Gi tilgang til å forespørre serier i 4K.",
|
||||
"components.PermissionEdit.request4kTv": "Forespør Serier i 4K",
|
||||
"components.PermissionEdit.request4kMoviesDescription": "Gi tilgang til å forespørre filmer i 4K.",
|
||||
"components.PermissionEdit.request4kMovies": "Forespør Filmer i 4K",
|
||||
"components.PermissionEdit.request4kDescription": "Gi tillatelse til å forespørre medie i 4K.",
|
||||
"components.PermissionEdit.request4kDescription": "Gi tillatelse til å forespørre matriale i 4K.",
|
||||
"components.PermissionEdit.request4k": "Forespør i 4K",
|
||||
"components.PermissionEdit.request": "Forespør",
|
||||
"components.PermissionEdit.managerequestsDescription": "Gi tilgang til å administrere medie-forespørsler. Alle forespørsler utført av en bruker med denne tilgangen vil automatisk bli godkjent.",
|
||||
"components.PermissionEdit.managerequestsDescription": "Gi tilgang til å administrere forespørsler. Alle forespørsler utført av en bruker med denne tilgangen vil automagisk bli godkjent.",
|
||||
"components.PermissionEdit.managerequests": "Administrer Forespørsler",
|
||||
"components.PermissionEdit.autoapproveSeriesDescription": "Godkjenn serieforespørsler som ikke er i 4K automatisk.",
|
||||
"components.PermissionEdit.autoapproveSeries": "Godkjenn serieforespørsler automatisk",
|
||||
"components.PermissionEdit.autoapproveMoviesDescription": "Godkjenn filmforespørsler som ikke er i 4K automatisk.",
|
||||
"components.PermissionEdit.autoapproveMovies": "Godkjenn filmforespørsler automatisk",
|
||||
"components.PermissionEdit.autoapproveDescription": "Godkjenn alle forespørsler som ikke er i 4K automatisk.",
|
||||
"components.PermissionEdit.autoapprove4kSeriesDescription": "Godkjenn serieforespørsler i 4K automatisk.",
|
||||
"components.PermissionEdit.autoapprove4kSeries": "Automatisk godkjenning av serier i 4K",
|
||||
"components.PermissionEdit.autoapprove4kMoviesDescription": "Godkjenn filmforespørsler i 4K automatisk.",
|
||||
"components.PermissionEdit.autoapprove4kMovies": "Automatisk godkjenning av filmer i 4K",
|
||||
"components.PermissionEdit.autoapprove4kDescription": "Godkjenn alle forespørsler av 4K automatisk.",
|
||||
"components.PermissionEdit.autoapprove4k": "Godkjenn 4K Automatisk",
|
||||
"components.PermissionEdit.autoapprove": "Godkjenn Automatisk",
|
||||
"components.PermissionEdit.autoapproveSeriesDescription": "Godkjenn serieforespørsler som ikke er i 4K automagisk.",
|
||||
"components.PermissionEdit.autoapproveSeries": "Godkjenn serieforespørsler automagisk",
|
||||
"components.PermissionEdit.autoapproveMoviesDescription": "Godkjenn filmforespørsler som ikke er i 4K automagisk.",
|
||||
"components.PermissionEdit.autoapproveMovies": "Godkjenn filmforespørsler automagisk",
|
||||
"components.PermissionEdit.autoapproveDescription": "Godkjenn alle forespørsler som ikke er i 4K automagisk.",
|
||||
"components.PermissionEdit.autoapprove4kSeriesDescription": "Godkjenn serieforespørsler i 4K automagisk.",
|
||||
"components.PermissionEdit.autoapprove4kSeries": "Automagisk godkjenning av serier i 4K",
|
||||
"components.PermissionEdit.autoapprove4kMoviesDescription": "Godkjenn filmforespørsler i 4K automagisk.",
|
||||
"components.PermissionEdit.autoapprove4kMovies": "Automagisk godkjenning av filmer i 4K",
|
||||
"components.PermissionEdit.autoapprove4kDescription": "Godkjenn alle forespørsler av 4K automagisk.",
|
||||
"components.PermissionEdit.autoapprove4k": "Godkjenn 4K Automagisk",
|
||||
"components.PermissionEdit.autoapprove": "Godkjenn Automagisk",
|
||||
"components.PermissionEdit.advancedrequestDescription": "Gi tilgang til å endre avanserte forespørsler.",
|
||||
"components.PermissionEdit.advancedrequest": "Avanserte Forespørsler",
|
||||
"components.PermissionEdit.adminDescription": "Full administrator tilgang. Overstyrer alle andre tillatelser.",
|
||||
"components.PermissionEdit.admin": "Administrator",
|
||||
"components.NotificationTypeSelector.mediafailed": "Forespørsel Feilet",
|
||||
"components.NotificationTypeSelector.mediadeclinedDescription": "Bli varslet når en medieforespørsel blir avvist.",
|
||||
"components.NotificationTypeSelector.mediadeclinedDescription": "Bli varslet når en forespørsel om nytt matriale blir avvist.",
|
||||
"components.NotificationTypeSelector.mediadeclined": "Forespørsel Avvist",
|
||||
"components.NotificationTypeSelector.mediaavailable": "Forespørsel Tilgjengelig",
|
||||
"components.NotificationTypeSelector.mediaapproved": "Forespørsel Godkjent",
|
||||
"components.NotificationTypeSelector.mediaAutoApproved": "Forespørsel Automatisk Godkjent",
|
||||
"components.NotificationTypeSelector.mediaAutoApproved": "Forespørsel Automagisk Godkjent",
|
||||
"components.MovieDetails.watchtrailer": "Se Trailer",
|
||||
"components.MovieDetails.playonplex": "Spill av med Plex",
|
||||
"components.MovieDetails.play4konplex": "Spill av i 4K i Plex",
|
||||
@@ -340,7 +337,7 @@
|
||||
"components.MediaSlider.ShowMoreCard.seemore": "Vis mer",
|
||||
"components.Login.validationpasswordrequired": "Du må skrive et passord",
|
||||
"components.Login.validationemailrequired": "Du må bruke en gyldig E-postadresse",
|
||||
"components.Login.signinwithplex": "Bruk Plex-konto",
|
||||
"components.Login.signinwithplex": "Bruk din Plex-konto",
|
||||
"components.Login.signinwithoverseerr": "Bruk {applicationTitle}-konto",
|
||||
"components.Login.signinheader": "Logg inn for å fortsette",
|
||||
"components.Login.signingin": "Logger inn…",
|
||||
@@ -354,12 +351,12 @@
|
||||
"components.RequestModal.requestedited": "Redigerte forespørsel for <strong>{title}</strong>!",
|
||||
"components.RequestModal.alreadyrequested": "Allerede forespurt",
|
||||
"components.RequestList.RequestItem.requested": "Forespurt",
|
||||
"components.NotificationTypeSelector.mediarequestedDescription": "Bli varslet når medie blir forespurt og krever godkjenning.",
|
||||
"components.NotificationTypeSelector.mediarequestedDescription": "Bli varslet når nytt matriale blir forespurt og krever godkjenning.",
|
||||
"components.NotificationTypeSelector.mediarequested": "Forespørsel venter Godkjenning",
|
||||
"components.NotificationTypeSelector.mediafailedDescription": "Bli varslet når forespurt medie ikke kan bli lagt til i Radarr eller Sonarr.",
|
||||
"components.NotificationTypeSelector.mediaavailableDescription": "Bli varslet når forespurt medie blir tilgjengelig.",
|
||||
"components.NotificationTypeSelector.mediaapprovedDescription": "Bli varslet når forespurt medie blir manuelt godkjent.",
|
||||
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Bli varslet når medie blir forespurt og forespørselen automatisk blir godkjent.",
|
||||
"components.NotificationTypeSelector.mediafailedDescription": "Bli varslet når forespurt matriale ikke kan bli lagt til i Radarr eller Sonarr.",
|
||||
"components.NotificationTypeSelector.mediaavailableDescription": "Bli varslet når forespurt matriale blir tilgjengelig.",
|
||||
"components.NotificationTypeSelector.mediaapprovedDescription": "Bli varslet når forespurt matriale blir manuelt godkjent.",
|
||||
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Bli varslet når nytt matriale blir forespurt og forespørselen blir automagisk godkjent.",
|
||||
"i18n.delimitedlist": "{a}, {b}",
|
||||
"i18n.tvshow": "Serie",
|
||||
"components.UserProfile.seriesrequest": "Serieforespørsler",
|
||||
@@ -370,13 +367,13 @@
|
||||
"components.MovieDetails.originaltitle": "Originaltittel",
|
||||
"i18n.all": "Alle",
|
||||
"components.UserList.deleteconfirm": "Er du sikker på at du ønsker å slette denne brukeren? All forespørseldata for denne brukeren vil bli slettet.",
|
||||
"components.UserList.autogeneratepassword": "Generer passord automatisk",
|
||||
"components.UserList.autogeneratepassword": "Generer passord automagisk",
|
||||
"components.Settings.originallanguageTip": "Filtrer innhold basert på originalspråk",
|
||||
"components.Settings.originallanguage": "Utforskelsesspråk",
|
||||
"components.Settings.SettingsLogs.showall": "Vis all logg",
|
||||
"components.Settings.SettingsJobsCache.cacheDescription": "Overseerr mellomlagrer forespørsler til eksterne APIer for å optimalisere ytelsen samt unngå unødvendige API-kall.",
|
||||
"components.Settings.Notifications.allowselfsigned": "Godta selvsignerte sertifikater",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Vi kunne ikke koble forespørselen din automatisk. Vennligst velg korrekt kobling fra listen under.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Vi klarte ikke å koble denne serien automagisk. Vennligst velg riktig serie under.",
|
||||
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Denne brukeren har tillatelse til å forespørre <strong>{limit}</strong> {type} hver <strong>{days}.</strong> dag.",
|
||||
"components.RequestModal.QuotaDisplay.allowedRequests": "Du har tillatelse til å forespørre <strong>{limit}</strong> {type} hver <strong>{days}.</strong> dag.",
|
||||
"components.Settings.partialRequestsEnabled": "Godta ufullstendige serieforespørsler",
|
||||
@@ -459,7 +456,7 @@
|
||||
"components.RequestModal.QuotaDisplay.quotaLink": "Du kan se en oppsummering av dine forespørselbegrensninger på <ProfileLink>profilsiden</ProfileLink>.",
|
||||
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Ikke nok gjenværende sesongforespørsler",
|
||||
"components.Settings.csrfProtectionTip": "Sett ekstern API-tilgang til skrivebeskyttet modus (krever HTTPS)",
|
||||
"components.Settings.csrfProtectionHoverTip": "Ikke aktiver dette med mindre du vet hva du gjør!",
|
||||
"components.Settings.csrfProtectionHoverTip": "Ikke aktiver denne instillingen med mindre du vet hva du gjør!",
|
||||
"components.Settings.csrfProtection": "Aktiver CSRF-beskyttelse",
|
||||
"components.Settings.cacheImages": "Aktiver mellomlagring av bilder",
|
||||
"components.Settings.region": "Utforskelsesregion",
|
||||
@@ -574,15 +571,13 @@
|
||||
"components.UserProfile.totalrequests": "Totalt antall forespørsler",
|
||||
"components.UserProfile.requestsperdays": "{limit} gjenstår",
|
||||
"components.UserProfile.recentrequests": "Nylig Forespurt",
|
||||
"components.UserProfile.norequests": "Ingen forespørsler.",
|
||||
"components.Settings.noDefaultServer": "Minst én {serverType} server må være definert som standard for at {mediaType}-forespørsler skal kunne bli håndtert.",
|
||||
"components.RequestModal.pendingapproval": "Forespørselen din avventer godkjenning.",
|
||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} Finnes ikke",
|
||||
"components.RequestCard.deleterequest": "Slett forespørsel",
|
||||
"components.RequestList.RequestItem.deleterequest": "Slett forespørsel",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Avbryt forespørsel",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Avbryt Forespørsel",
|
||||
"components.RequestCard.mediaerror": "{mediaType} Finnes ikke",
|
||||
"components.Discover.noRequests": "Ingen forespørsler.",
|
||||
"components.Settings.SettingsAbout.betawarning": "Dette er beta-programvare. Funksjoner kan slutte og fungerer og/eller være ustabile. Reporter gjerne problemer på GitHub!",
|
||||
"components.Settings.noDefaultNon4kServer": "Dersom du har én {serverType} server for både ikke-4K og 4K-media (eller hvis du kun laster ned 4K-innhold), skal {serverType} server <strong>IKKE</strong> være huket av som en 4K server.",
|
||||
"components.Settings.noDefault4kServer": "En 4K {serverType} server må være satt som standard for at brukere skal kunne forspørre 4K {mediaType}.",
|
||||
@@ -620,10 +615,10 @@
|
||||
"components.PermissionEdit.requestTv": "Forespør Serier",
|
||||
"components.PermissionEdit.requestMoviesDescription": "Gi tilgang til å forespørre filmer som ikke er i 4K.",
|
||||
"components.PermissionEdit.requestMovies": "Forespør Filmer",
|
||||
"components.NotificationTypeSelector.usermediarequestedDescription": "Bli varslet når andre brukere forespør medie hvor forespørselen krever godkjenning.",
|
||||
"components.NotificationTypeSelector.usermediarequestedDescription": "Bli varslet når andre brukere forespør nytt matriale hvor forespørselen krever godkjenning.",
|
||||
"components.NotificationTypeSelector.usermediafailedDescription": "Bli varslet når dine forespørsler ikke kan bli lagt til Radarr eller Sonarr.",
|
||||
"components.NotificationTypeSelector.usermediadeclinedDescription": "Bli varslet når dine forespørsler blir avvist.",
|
||||
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "Bli varslet når andre brukere forespør medie og forespørselen er automatisk godkjent.",
|
||||
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "Bli varslet når andre brukere forespør nytt matriale og forespørselen er automagisk godkjent.",
|
||||
"components.NotificationTypeSelector.usermediaapprovedDescription": "Bli varslet når dine forespørsler blir godkjent.",
|
||||
"components.NotificationTypeSelector.usermediaavailableDescription": "Bli varslet når dine forespørsler blir tilgjengelig.",
|
||||
"components.NotificationTypeSelector.notificationTypes": "Varselstyper",
|
||||
@@ -653,9 +648,9 @@
|
||||
"components.IssueDetails.closeissueandcomment": "Lukk med Kommentar",
|
||||
"components.IssueModal.issueOther": "Annet",
|
||||
"components.ManageSlideOver.manageModalRequests": "Forespørsler",
|
||||
"components.ManageSlideOver.manageModalTitle": "Adminstrer {mediaType}",
|
||||
"components.ManageSlideOver.manageModalTitle": "Administrer {mediaType}",
|
||||
"components.ManageSlideOver.mark4kavailable": "Marker som Tilgjengelig i 4K",
|
||||
"components.ManageSlideOver.openarr": "Åpne i {arr}",
|
||||
"components.ManageSlideOver.openarr": "Vis i {arr}",
|
||||
"components.MovieDetails.streamingproviders": "Tilgjengelig på",
|
||||
"components.NotificationTypeSelector.adminissuereopenedDescription": "Bli varslet når avvik blir gjenåpnet av andre brukere.",
|
||||
"components.NotificationTypeSelector.adminissueresolvedDescription": "Bli varslet når avvik blir utbedret av andre brukere.",
|
||||
@@ -682,7 +677,7 @@
|
||||
"components.IssueModal.issueSubtitles": "Undertekster",
|
||||
"components.Layout.Sidebar.issues": "Avvik",
|
||||
"components.ManageSlideOver.downloadstatus": "Nedlastningsstatus",
|
||||
"components.ManageSlideOver.manageModalClearMedia": "Fjern all Medieinfo",
|
||||
"components.ManageSlideOver.manageModalClearMedia": "Fjern all Info",
|
||||
"components.ManageSlideOver.manageModalIssues": "Åpne et Avvik",
|
||||
"components.ManageSlideOver.manageModalNoRequests": "Ingen forespørsler.",
|
||||
"components.ManageSlideOver.markavailable": "Marker som Tilgjengelig",
|
||||
@@ -758,7 +753,7 @@
|
||||
"components.Settings.Notifications.NotificationsGotify.validationTokenRequired": "Du må oppgi en applikasjon/API-nøkkel",
|
||||
"i18n.next": "Neste",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedule": "Endre Oppgave",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Frekvens",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Ny Frekvens",
|
||||
"components.TvDetails.firstAirDate": "Første gang sendt",
|
||||
"i18n.deleting": "Sletter…",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.emailsettingssaved": "Innstillingene for E-post ble lagret!",
|
||||
@@ -778,7 +773,7 @@
|
||||
"components.Settings.validationPortRequired": "Du må oppgi et gyldig port-nummer",
|
||||
"components.PermissionEdit.manageissuesDescription": "Gi tillatelse til å administre avvik.",
|
||||
"i18n.retrying": "Prøver på nytt…",
|
||||
"components.Settings.RadarrModal.enableSearch": "Aktiver Automatisk Søk",
|
||||
"components.Settings.RadarrModal.enableSearch": "Aktiver Automagisk Søk",
|
||||
"components.Settings.Notifications.validationPgpPrivateKey": "Du må oppgi en gyldig PGP-privatnøkkel",
|
||||
"components.Settings.SettingsJobsCache.cachekeys": "Totalt antall nøkkler",
|
||||
"components.MovieDetails.productioncountries": "Produksjonsland",
|
||||
@@ -801,7 +796,6 @@
|
||||
"components.IssueModal.CreateIssueModal.episode": "Episode {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Gjelder Episode",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Tillegg",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Hva er problemet med {title}?",
|
||||
"components.IssueList.sortAdded": "Nylig Lagt til",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Gjelder Sesong",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Vennligst gi en forklaring av problemet som oppsto, gjerne så detaljert som mulig.",
|
||||
@@ -860,8 +854,8 @@
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Oppgaven ble endret!",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Hver {jobScheduleHours}. time",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Hvert {jobScheduleMinutes}. minutt",
|
||||
"components.Settings.SettingsUsers.localLoginTip": "Tillater brukere å kunne logge inn med kun deres E-postadresse og passord istedenfor med Plex OAuth",
|
||||
"components.Settings.SettingsUsers.newPlexLoginTip": "Tillater Plex brukere å logge inn uten å være importert på forhånd",
|
||||
"components.Settings.SettingsUsers.localLoginTip": "Tilllat brukere å logge på med kun E-postadresse og passord istedenfor med Plex OAuth",
|
||||
"components.Settings.SettingsUsers.newPlexLoginTip": "Tillat Plex brukere å logge inn uten å være importert på forhånd",
|
||||
"components.Settings.SonarrModal.validationApplicationUrl": "Du må oppgi en gyldig nettadresse",
|
||||
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "Base URL kan ikke slutte med en skråstrek",
|
||||
"components.Settings.locale": "Visningsspråk",
|
||||
@@ -881,7 +875,7 @@
|
||||
"components.UserList.password": "Passord",
|
||||
"components.UserList.nouserstoimport": "Det er ingen brukere å importere fra Plex.",
|
||||
"components.UserList.userdeleteerror": "Noe gikk galt under sletting av brukeren.",
|
||||
"components.UserList.passwordinfodescription": "Sett opp en nettadresse for Overseerr og aktiver E-postvarsler for å kunne sende ut automatiske genererte passord.",
|
||||
"components.UserList.passwordinfodescription": "Sett opp en nettadresse for Overseerr og aktiver E-postvarsler for å kunne sende ut automagisk genererte passord.",
|
||||
"components.UserList.usercreatedfailedexisting": "Denne E-postadressen er allerede i bruk av en annen bruker.",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingsfailed": "Kunne ikke lagre instillingene for Discord.",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.email": "E-post",
|
||||
@@ -937,10 +931,10 @@
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingsfailed": "Kunne ikke lagre instillingene for Telegram.",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatId": "Chat ID",
|
||||
"components.Settings.SettingsUsers.newPlexLogin": "Aktiver \"Plex Sign-In\" for nye brukere",
|
||||
"components.Settings.SonarrModal.enableSearch": "Aktiver Automatisk Søk",
|
||||
"components.Settings.SonarrModal.enableSearch": "Aktiver Automagisk Søk",
|
||||
"components.Settings.notificationAgentSettingsDescription": "Konfigurer og aktiver varslingstjenester.",
|
||||
"components.UserList.displayName": "Visningsnavn",
|
||||
"components.UserList.autogeneratepasswordTip": "Send et automatisk generet passord til bruken på E-post",
|
||||
"components.UserList.autogeneratepasswordTip": "Send et automagisk generet passord til bruken på E-post",
|
||||
"components.UserList.usercreatedsuccess": "Bruker opprettet!",
|
||||
"components.UserList.userdeleted": "Bruker slettet!",
|
||||
"components.UserList.validationEmail": "Du må oppgi en gyldig E-postadresse",
|
||||
@@ -984,7 +978,7 @@
|
||||
"components.Settings.Notifications.toastEmailTestSuccess": "Test-varsel ble sendt med E-post!",
|
||||
"components.Settings.Notifications.toastTelegramTestFailed": "Telegram mislykkes med å sende test-varsel.",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Noe gikk galt under lagring av oppgaven.",
|
||||
"components.Settings.cacheImagesTip": "Optimaliser alle bilder og lagre de lokalt på serveren (Dette kommer til å ta veldig mye plass på harddisken)",
|
||||
"components.Settings.cacheImagesTip": "Mellomlagrer og serverer optimaliserte bilder (Dette tar veldig mye diskplass)",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Din konto har ikke noe passord på nåværende tidspunkt. Lag et passord under for å kunne logge inn med din E-postadresse som \"lokal-bruker\".",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailureVerifyCurrent": "Noe gikk galt under lagring av passordet. Var ditt nåværende passord skrevet korrekt?",
|
||||
"components.Settings.Notifications.NotificationsWebhook.resetPayloadSuccess": "JSON payload tilbakestilt!",
|
||||
@@ -1046,5 +1040,82 @@
|
||||
"components.Settings.deleteServer": "Slett {serverType} tjener",
|
||||
"components.RequestCard.tmdbid": "TMDB ID",
|
||||
"components.RequestCard.tvdbid": "TheTVDB ID",
|
||||
"components.StatusChecker.appUpdatedDescription": "Vennligst klikk her for å laste applikasjonen på nytt."
|
||||
"components.StatusChecker.appUpdatedDescription": "Vennligst klikk her for å laste applikasjonen på nytt.",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Din Plex Watchlist",
|
||||
"components.Discover.plexwatchlist": "Din Plex Watchlist",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Bli varslet når nytt matriale fra diin Plex Watchlist blir automagisk forespurt.",
|
||||
"components.PermissionEdit.autorequestSeries": "Forespør Serier Automagisk",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Gi tilgang til å automagisk sende film forespørsler som ikke er i 4K via Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequest": "Auto-Forespørsel",
|
||||
"components.PermissionEdit.autorequestDescription": "Gi tilgang til å automagisk sende forespørsler som ikke er i 4K via Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequestMovies": "Forespør Serier Automagisk",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex Watchlist",
|
||||
"components.MovieDetails.managemovie": "Administrer Film",
|
||||
"components.MovieDetails.reportissue": "Rapporter Avvik",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Forespørsel Automagisk Forespurt",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Gi tilgang til å automagisk sende serie forespørsler som ikke er i 4K via Plex Watchlist.",
|
||||
"components.Settings.SettingsLogs.viewdetails": "Vis Detaljer",
|
||||
"components.AirDateBadge.airedrelative": "Sendt {relativeTime}",
|
||||
"components.AirDateBadge.airsrelative": "Sendes {relativeTime}",
|
||||
"components.MovieDetails.rtaudiencescore": "Publikumspoeng for Rotten Tomatoes",
|
||||
"components.PermissionEdit.viewwatchlists": "Vis Plex Watchlist",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Gi tilgang til å vise andre brukere sin Plex Watchlist.",
|
||||
"components.RequestBlock.requestdate": "Tidspunkt for Forespørsel",
|
||||
"components.RequestBlock.requestedby": "Forespurt av",
|
||||
"components.RequestCard.approverequest": "Godkjenn Forespørsel",
|
||||
"components.RequestCard.cancelrequest": "Avbryt Forespørsel",
|
||||
"components.RequestCard.declinerequest": "Avvis Forespørsel",
|
||||
"components.RequestCard.editrequest": "Rediger forespørsel",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Filmforespørsler",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Serieforespørsler",
|
||||
"components.Layout.UserDropdown.requests": "Forespørsler",
|
||||
"components.MovieDetails.tmdbuserscore": "Brukerpoeng for TMDb",
|
||||
"components.MovieDetails.rtcriticsscore": "Tomatometer for Rotten Tomatoes",
|
||||
"components.RequestBlock.edit": "Rediger forespørsel",
|
||||
"components.RequestBlock.lastmodifiedby": "Sist endret av",
|
||||
"components.RequestBlock.approve": "Godkjenn Forespørsel",
|
||||
"components.RequestBlock.delete": "Slett forespørsel",
|
||||
"components.RequestBlock.decline": "Avvis Forespørsel",
|
||||
"components.TitleCard.mediaerror": "{mediaType} Finnes ikke",
|
||||
"components.RequestList.RequestItem.tmdbid": "TMDb ID",
|
||||
"i18n.restartRequired": "Omstart Nødvendig",
|
||||
"components.TitleCard.cleardata": "Fjern all Info",
|
||||
"components.TitleCard.tmdbid": "TMDb ID",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Forespør Filmer Automagisk",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synkronisering av Plex-Watchlist",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr må startes på nytt for at de nye innstillingene skal tre i kraft",
|
||||
"components.TvDetails.reportissue": "Rapporter Avvik",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automagisk forespør serier som ligger på <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Forespør Serier Automagisk",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automagisk forespør filmer som ligger på <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink>",
|
||||
"components.UserProfile.plexwatchlist": "Plex Watchlist",
|
||||
"components.RequestList.RequestItem.tvdbid": "TheTVDb ID",
|
||||
"components.StatusChecker.restartRequiredDescription": "Start tjeneren på nytt for å ta i bruk de nye innstillingene.",
|
||||
"components.StatusChecker.restartRequired": "Omstart av tjener nødvendig",
|
||||
"components.TitleCard.tvdbid": "TheTVDb ID",
|
||||
"components.Settings.experimentalTooltip": "Aktivering av denne innstillingen kan føre til uventet oppførsel av programmet",
|
||||
"components.Settings.advancedTooltip": "Feil konfigurering av denne innstillingen kan føre til defekt funksjonalitet",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Noe gikk galt under henting av data for denne sesongen.",
|
||||
"components.StatusChecker.reloadApp": "Last inn {applicationTitle} på nytt",
|
||||
"components.StatusBadge.playonplex": "Spill av med Plex",
|
||||
"components.StatusBadge.openinarr": "Vis i {arr}",
|
||||
"components.StatusBadge.managemedia": "Administrer {mediaType}",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Episode} other {# Episoder}}",
|
||||
"components.TvDetails.rtcriticsscore": "Tomatometer for Rotten Tomatoes",
|
||||
"components.TvDetails.manageseries": "Administrer Serie",
|
||||
"components.TvDetails.rtaudiencescore": "Publikumspoeng for Rotten Tomatoes",
|
||||
"components.TvDetails.seasonstitle": "Sesonger",
|
||||
"components.TvDetails.seasonnumber": "Sesong {seasonNumber}",
|
||||
"components.RequestModal.requestseriestitle": "Forespør Serier",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.TvDetails.tmdbuserscore": "Brukerpoeng for TMDb",
|
||||
"components.RequestModal.requestseries4ktitle": "Forespør Serier i 4K",
|
||||
"components.RequestModal.requestmovietitle": "Forespør Film",
|
||||
"components.RequestModal.requestcollection4ktitle": "Forespør hele samlingen i 4K",
|
||||
"components.RequestModal.requestmovie4ktitle": "Forespør Film i 4K",
|
||||
"components.RequestModal.requestcollectiontitle": "Forespør hele samlingen",
|
||||
"components.Discover.emptywatchlist": "Matriale som du legger til via <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> vil dukke opp her.",
|
||||
"components.UserProfile.emptywatchlist": "Matriale som du legger til via <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> vil dukke opp her.",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "Vi klarte ikke å koble denne serien med et søkbart treff.",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Nåværende frekvens"
|
||||
}
|
||||
|
||||
@@ -33,13 +33,12 @@
|
||||
"components.RequestModal.cancel": "Verzoek annuleren",
|
||||
"components.RequestModal.extras": "Extra's",
|
||||
"components.RequestModal.numberofepisodes": "Aantal afleveringen",
|
||||
"components.RequestModal.pendingrequest": "Verzoek voor {title} in behandeling",
|
||||
"components.RequestModal.pendingrequest": "Verzoek in behandeling",
|
||||
"components.RequestModal.requestCancel": "Verzoek voor <strong>{title}</strong> is geannuleerd.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> is succesvol aangevraagd!",
|
||||
"components.RequestModal.requestadmin": "Dit verzoek zal automatisch goedgekeurd worden.",
|
||||
"components.RequestModal.requestfrom": "Het verzoek van {user} is in behandeling.",
|
||||
"components.RequestModal.requestseasons": "{seasonCount} {seasonCount, plural, one {seizoen} other {seizoenen}} aanvragen",
|
||||
"components.RequestModal.requesttitle": "{title} aanvragen",
|
||||
"components.RequestModal.season": "Seizoen",
|
||||
"components.RequestModal.seasonnumber": "Seizoen {number}",
|
||||
"components.RequestModal.selectseason": "Seizoen(en) selecteren",
|
||||
@@ -288,8 +287,7 @@
|
||||
"components.Settings.Notifications.NotificationsWebhook.customJson": "JSON-payload",
|
||||
"components.Settings.Notifications.NotificationsWebhook.authheader": "Autorisatie-header",
|
||||
"components.Settings.Notifications.NotificationsWebhook.agentenabled": "Agent inschakelen",
|
||||
"components.RequestModal.request4ktitle": "{title} in 4K aanvragen",
|
||||
"components.RequestModal.pending4krequest": "4K-verzoek voor {title} in behandeling",
|
||||
"components.RequestModal.pending4krequest": "4K-verzoek in behandeling",
|
||||
"components.RequestButton.viewrequest4k": "4K-verzoek bekijken",
|
||||
"components.RequestButton.viewrequest": "Verzoek bekijken",
|
||||
"components.RequestButton.requestmore": "Meer aanvragen",
|
||||
@@ -335,8 +333,7 @@
|
||||
"i18n.experimental": "Experimenteel",
|
||||
"components.Settings.hideAvailable": "Beschikbare media verbergen",
|
||||
"components.RequestModal.requesterror": "Er ging iets mis bij het aanvragen.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "We konden je verzoek niet automatisch matchen. Selecteer de juiste match uit de onderstaande lijst.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Er is geen samenvatting voor deze titel gevonden.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "We kunnen deze serie niet automatisch matchen. Selecteer hieronder de juiste match.",
|
||||
"components.Login.signinwithplex": "Plex-account gebruiken",
|
||||
"components.Login.signinheader": "Log in om verder te gaan",
|
||||
"components.Login.signingin": "Bezig met inloggen…",
|
||||
@@ -583,7 +580,6 @@
|
||||
"components.NotificationTypeSelector.mediaAutoApproved": "Verzoek automatisch goedgekeurd",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Je hebt geen toestemming om de instellingen van deze gebruiker te wijzigen.",
|
||||
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Je kan je eigen machtigingen niet wijzigen.",
|
||||
"components.UserProfile.norequests": "Geen verzoeken.",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minuten",
|
||||
"components.TvDetails.episodeRuntime": "Afleveringsduur",
|
||||
"components.Settings.Notifications.pgpPrivateKeyTip": "Versleutelde e-mailberichten ondertekenen met <OpenPgpLink>OpenPGP</OpenPgpLink>",
|
||||
@@ -628,7 +624,7 @@
|
||||
"components.Settings.SettingsJobsCache.jobsandcache": "Taken en cache",
|
||||
"components.Settings.SettingsAbout.about": "Over",
|
||||
"components.ResetPassword.passwordreset": "Wachtwoord opnieuw instellen",
|
||||
"components.Settings.cacheImagesTip": "Alle afbeeldingen optimaliseren en lokaal opslaan (gebruikt een aanzienlijke hoeveelheid schijfruimte)",
|
||||
"components.Settings.cacheImagesTip": "Geoptimaliseerde afbeeldingen cachen en hosten (vereist veel schijfruimte)",
|
||||
"components.Settings.cacheImages": "Afbeeldingscaching inschakelen",
|
||||
"components.Settings.SettingsLogs.logDetails": "Loggegevens",
|
||||
"components.Settings.SettingsLogs.extraData": "Aanvullende gegevens",
|
||||
@@ -709,9 +705,9 @@
|
||||
"components.RequestModal.AdvancedRequester.selecttags": "Labels selecteren",
|
||||
"components.RequestModal.AdvancedRequester.notagoptions": "Geen labels.",
|
||||
"components.Settings.RadarrModal.loadingTags": "Labels laden…",
|
||||
"components.RequestList.RequestItem.mediaerror": "De gekoppelde titel voor dit verzoek is niet meer beschikbaar.",
|
||||
"components.RequestList.RequestItem.mediaerror": "{mediaType} niet gevonden",
|
||||
"components.RequestList.RequestItem.deleterequest": "Verzoek verwijderen",
|
||||
"components.RequestCard.mediaerror": "De gekoppelde titel voor dit verzoek is niet meer beschikbaar.",
|
||||
"components.RequestCard.mediaerror": "{mediaType} niet gevonden",
|
||||
"components.RequestCard.deleterequest": "Verzoek verwijderen",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationPgpPublicKey": "Je moet een geldige openbare PGP-sleutel opgeven",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingssaved": "Instellingen Telegrammeldingen succesvol opgeslagen!",
|
||||
@@ -729,7 +725,6 @@
|
||||
"components.RequestModal.pendingapproval": "Je verzoek is in afwachting van goedkeuring.",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Verzoek annuleren",
|
||||
"components.NotificationTypeSelector.notificationTypes": "Meldingtypes",
|
||||
"components.Discover.noRequests": "Geen verzoeken.",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Er is voor jouw account momenteel geen wachtwoord ingesteld. Configureer hieronder een wachtwoord om in te kunnen loggen als een \"lokale gebruiker\" met uw e-mailadres.",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "Deze gebruikersaccount heeft momenteel geen wachtwoord ingesteld. Configureer hieronder een wachtwoord zodat deze account in staat is om zich aan te melden als een \"lokale gebruiker\".",
|
||||
"components.Settings.serviceSettingsDescription": "Configureer je {serverType} server(s) hieronder. Je kunt meerdere {serverType} servers verbinden, maar slechts twee ervan kunnen als standaard worden gemarkeerd (één niet-4K en één 4K). Beheerders kunnen vóór de goedkeuring de server die gebruikt wordt om nieuwe aanvragen te verwerken aanpassen.",
|
||||
@@ -852,7 +847,7 @@
|
||||
"components.MovieDetails.streamingproviders": "Momenteel te streamen op",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "Taak succesvol bewerkt!",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Elk(e) {jobScheduleMinutes, plural, one {minuut} other {{jobScheduleMinutes} minuten}}",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Frequentie",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Nieuwe frequentie",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Er ging iets mis bij het opslaan van de taak.",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedule": "Taak wijzigen",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Elk(e) {jobScheduleHours, plural, one {uur} other {{jobScheduleHours} uren}}",
|
||||
@@ -890,7 +885,7 @@
|
||||
"components.IssueModal.CreateIssueModal.allepisodes": "Alle afleveringen",
|
||||
"components.IssueModal.issueAudio": "Audio",
|
||||
"components.IssueDetails.nocomments": "Geen opmerkingen.",
|
||||
"components.IssueModal.CreateIssueModal.reportissue": "Een probleem melden",
|
||||
"components.IssueModal.CreateIssueModal.reportissue": "Probleem melden",
|
||||
"components.IssueDetails.allepisodes": "Alle afleveringen",
|
||||
"components.IssueDetails.toasteditdescriptionsuccess": "Probleembeschrijving succesvol bewerkt!",
|
||||
"components.IssueDetails.toastissuedeleted": "Probleem succesvol verwijderd!",
|
||||
@@ -930,7 +925,6 @@
|
||||
"components.IssueList.IssueItem.unknownissuetype": "Onbekend",
|
||||
"components.IssueList.IssueItem.viewissue": "Probleem bekijken",
|
||||
"components.IssueList.IssueItem.problemepisode": "Getroffen aflevering",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Is er een probleem met {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Getroffen aflevering",
|
||||
"components.IssueModal.CreateIssueModal.toastSuccessCreate": "Probleemmelding voor <strong>{title}</strong> succesvol ingediend!",
|
||||
"components.PermissionEdit.viewissues": "Problemen weergeven",
|
||||
@@ -1036,5 +1030,92 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.discordIdTip": "Het <FindDiscordIdLink>meercijferige ID-nummer</FindDiscordIdLink> van je Discord-account",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.validationDiscordId": "Je moet een geldige gebruikers-ID van Discord opgeven",
|
||||
"components.Settings.SettingsAbout.appDataPath": "Gegevensmap",
|
||||
"components.RequestBlock.languageprofile": "Taalprofiel"
|
||||
"components.RequestBlock.languageprofile": "Taalprofiel",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Huidige frequentie",
|
||||
"components.StatusBadge.managemedia": "{mediaType} beheren",
|
||||
"components.StatusBadge.openinarr": "Openen in {arr}",
|
||||
"components.StatusBadge.playonplex": "Afspelen op Plex",
|
||||
"components.UserProfile.emptywatchlist": "Media die zijn toegevoegd aan je <PlexWatchlistSupportLink>Plex Kijklijst</PlexWatchlistSupportLink> verschijnen hier.",
|
||||
"components.MovieDetails.digitalrelease": "Digitale release",
|
||||
"i18n.restartRequired": "Opnieuw opstarten vereist",
|
||||
"components.PermissionEdit.viewrecentDescription": "Toestemming geven om de lijst met recent toegevoegde media te bekijken.",
|
||||
"components.PermissionEdit.viewrecent": "Recent toegevoegd bekijken",
|
||||
"components.Settings.deleteServer": "{serverType}-server verwijderen",
|
||||
"components.StatusChecker.appUpdated": "{applicationTitle} bijgewerkt",
|
||||
"components.RequestList.RequestItem.tmdbid": "TMDB ID",
|
||||
"components.RequestList.RequestItem.tvdbid": "TheTVDB ID",
|
||||
"components.StatusChecker.restartRequired": "Server opnieuw opstarten vereist",
|
||||
"components.StatusChecker.restartRequiredDescription": "Start de server opnieuw op om de bijgewerkte instellingen toe te passen.",
|
||||
"components.TitleCard.cleardata": "Gegevens wissen",
|
||||
"components.TitleCard.mediaerror": "{mediatype} niet gevonden",
|
||||
"components.TitleCard.tvdbid": "TheTVDB ID",
|
||||
"components.RequestCard.tmdbid": "TMDB ID",
|
||||
"components.RequestCard.declinerequest": "Verzoek weigeren",
|
||||
"components.RequestCard.editrequest": "Verzoek bewerken",
|
||||
"components.RequestCard.cancelrequest": "Verzoek annuleren",
|
||||
"components.RequestModal.requestcollection4ktitle": "Collectie aanvragen in 4K",
|
||||
"components.RequestModal.requestcollectiontitle": "Collectie aanvragen",
|
||||
"components.RequestModal.requestseries4ktitle": "Serie aanvragen in 4K",
|
||||
"components.RequestModal.requestmovie4ktitle": "Film aanvragen in 4K",
|
||||
"components.RequestModal.requestseriestitle": "Serie aanvragen",
|
||||
"components.RequestModal.requestmovietitle": "Film aanvragen",
|
||||
"components.TvDetails.tmdbuserscore": "Gebruikersscore TMDB",
|
||||
"components.TvDetails.rtaudiencescore": "Publieksscore Rotten Tomatoes",
|
||||
"components.TvDetails.seasonnumber": "Seizoen {seasonNumber}",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Er ging iets mis bij het ophalen van de seizoensgegevens.",
|
||||
"components.TvDetails.seasonstitle": "Seizoenen",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Je Plex Kijklijst",
|
||||
"components.Discover.plexwatchlist": "Je Plex Kijklijst",
|
||||
"components.MovieDetails.physicalrelease": "Fysieke release",
|
||||
"components.PermissionEdit.autorequest": "Automatisch aanvragen",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex Kijklijst synchroniseren",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Series automatisch aanvragen",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automatisch series op je <PlexWatchlistSupportLink>Plex Kijklijst</PlexWatchlistSupportLink> aanvragen",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automatisch films op je <PlexWatchlistSupportLink>Plex Kijklijst</PlexWatchlistSupportLink> aanvragen",
|
||||
"components.PermissionEdit.autorequestDescription": "Toestemming geven om niet-4K media in je Plex Kijklijst automatisch aan te vragen.",
|
||||
"components.RequestCard.tvdbid": "TheTVDB ID",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex Kijklijst",
|
||||
"components.MovieDetails.theatricalrelease": "Bioscooprelease",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Aanvraag automatisch ingediend",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Ontvang een melding wanneer er automatisch nieuwe mediaverzoeken worden ingediend voor items op je Plex Kijklijst.",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Toestemming geven om niet-4K series in je Plex Kijklijst automatisch aan te vragen.",
|
||||
"components.PermissionEdit.viewwatchlists": "Plex Kijklijsten bekijken",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Toestemming verlenen om de Plex Kijklijsten van andere gebruikers te bekijken.",
|
||||
"components.Settings.SettingsLogs.viewdetails": "Details bekijken",
|
||||
"components.Settings.advancedTooltip": "Deze instelling onjuist configureren, kan resulteren in gebroken functionaliteit",
|
||||
"components.StatusChecker.reloadApp": "{applicationTitle} opnieuw laden",
|
||||
"components.TitleCard.tmdbid": "TMDB ID",
|
||||
"components.StatusChecker.appUpdatedDescription": "Klik op de onderstaande knop om de toepassing opnieuw te laden.",
|
||||
"components.UserProfile.plexwatchlist": "Plex Kijklijst",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Films automatisch aanvragen",
|
||||
"components.TvDetails.manageseries": "Serie beheren",
|
||||
"components.MovieDetails.managemovie": "Film beheren",
|
||||
"components.MovieDetails.reportissue": "Probleem melden",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Toestemming geven om niet-4K films in je Plex Kijklijst automatisch aan te vragen.",
|
||||
"components.PermissionEdit.autorequestSeries": "Series automatisch aanvragen",
|
||||
"components.PermissionEdit.autorequestMovies": "Films automatisch aanvragen",
|
||||
"components.Settings.experimentalTooltip": "Deze instelling inschakelen, kan leiden tot onverwacht gedrag van de toepassing",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr moet opnieuw worden gestart om wijzigingen in deze instelling door te voeren",
|
||||
"components.AirDateBadge.airedrelative": "{relativeTime} uitgezonden",
|
||||
"components.AirDateBadge.airsrelative": "Uitzending {relativeTime}",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Serieverzoeken",
|
||||
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# aflevering} other {# afleveringen}}",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.MovieDetails.rtaudiencescore": "Publieksscore Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Tomatometer Rotten Tomatoes",
|
||||
"components.MovieDetails.tmdbuserscore": "Gebruikersscore TMDB",
|
||||
"components.RequestBlock.approve": "Verzoek goedkeuren",
|
||||
"components.TvDetails.reportissue": "Probleem melden",
|
||||
"components.TvDetails.rtcriticsscore": "Tomatometer Rotten Tomatoes",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "We konden geen match vinden voor deze serie.",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Filmverzoeken",
|
||||
"components.Layout.UserDropdown.requests": "Verzoeken",
|
||||
"components.RequestBlock.decline": "Verzoek weigeren",
|
||||
"components.Discover.emptywatchlist": "Media die zijn toegevoegd aan je <PlexWatchlistSupportLink>Plex Kijklijst</PlexWatchlistSupportLink> verschijnen hier.",
|
||||
"components.RequestBlock.delete": "Verzoek verwijderen",
|
||||
"components.RequestBlock.edit": "Verzoek bewerken",
|
||||
"components.RequestBlock.lastmodifiedby": "Laatst gewijzigd door",
|
||||
"components.RequestBlock.requestdate": "Aanvraagdatum",
|
||||
"components.RequestBlock.requestedby": "Aangevraagd door",
|
||||
"components.RequestCard.approverequest": "Verzoek goedkeuren"
|
||||
}
|
||||
|
||||
@@ -108,14 +108,12 @@
|
||||
"components.IssueModal.CreateIssueModal.whatswrong": "Co jest nie tak?",
|
||||
"components.Discover.MovieGenreList.moviegenres": "Gatunki filmowe",
|
||||
"components.Discover.TvGenreList.seriesgenres": "Gatunki seriali",
|
||||
"components.Discover.noRequests": "Brak próśb.",
|
||||
"components.Discover.recentrequests": "Ostatnie prośby",
|
||||
"components.Discover.upcomingmovies": "Nadchodzące filmy",
|
||||
"components.IssueModal.CreateIssueModal.reportissue": "Zgłoś problem",
|
||||
"components.IssueModal.CreateIssueModal.season": "Sezon {seasonNumber}",
|
||||
"components.IssueModal.CreateIssueModal.validationMessageRequired": "Musisz podać opis",
|
||||
"components.IssueModal.issueAudio": "Audio",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Czy wystąpił problem z {title}?",
|
||||
"components.IssueDetails.reopenissueandcomment": "Otwórz ponownie z komentarzem",
|
||||
"components.IssueModal.issueOther": "Inny",
|
||||
"components.CollectionDetails.numberofmovies": "{count} Filmy",
|
||||
@@ -342,7 +340,6 @@
|
||||
"components.RequestModal.requestadmin": "Ta prośba zostanie zatwierdzona automatycznie.",
|
||||
"components.ResetPassword.passwordreset": "Resetowanie hasła",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestSuccess": "Powiadomienie testowe Pushbullet wysłane!",
|
||||
"components.RequestModal.requesttitle": "Prośba o {title}",
|
||||
"components.ResetPassword.confirmpassword": "Potwierdź hasło",
|
||||
"components.ResetPassword.email": "Adres e-mail",
|
||||
"components.ResetPassword.password": "Hasło",
|
||||
@@ -452,7 +449,6 @@
|
||||
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Brak wystarczającej liczby próśb o sezon",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Aby przesłać prośbę o ten serial, ten użytkownik musi mieć co najmniej <strong>{seasons}</strong> {seasons, plural, one {prośbę} other {prośby}}.",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {sezon} other {sezony}}",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Nie znaleziono żadnych informacji o tym tytule.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Nie mogliśmy automatycznie spełnić Twojej prośby. Wybierz odpowiednie dopasowanie z poniższej listy.",
|
||||
"components.RequestModal.alreadyrequested": "Już poproszono",
|
||||
"components.RequestModal.autoapproval": "Automatyczne zatwierdzenie",
|
||||
@@ -460,10 +456,9 @@
|
||||
"components.RequestModal.errorediting": "Coś poszło nie tak podczas edytowania prośby.",
|
||||
"components.RequestModal.extras": "Dodatki",
|
||||
"components.RequestModal.numberofepisodes": "Liczba odcinków",
|
||||
"components.RequestModal.pending4krequest": "Oczekująca prośba o 4K dla {title}",
|
||||
"components.RequestModal.pending4krequest": "Oczekująca prośba o 4K",
|
||||
"components.RequestModal.pendingapproval": "Twoja prośba oczekuje na zatwierdzenie.",
|
||||
"components.RequestModal.pendingrequest": "Oczekująca prośba o {title}",
|
||||
"components.RequestModal.request4ktitle": "Poproś o {title} w 4K",
|
||||
"components.RequestModal.pendingrequest": "Oczekująca prośba",
|
||||
"components.RequestModal.requestCancel": "Prośba o <strong>{title}</strong> została anulowana.",
|
||||
"components.RequestModal.requestedited": "Prośba o <strong>{title}</strong> została pomyślnie edytowana!",
|
||||
"components.RequestModal.requesterror": "Coś poszło nie tak podczas przesyłania prośby.",
|
||||
@@ -781,7 +776,7 @@
|
||||
"components.UserList.autogeneratepasswordTip": "Wyślij do użytkownika wiadomość e-mail z hasłem wygenerowanym przez serwer",
|
||||
"components.UserList.createlocaluser": "Utwórz użytkownika lokalnego",
|
||||
"components.UserList.creating": "Tworzenie…",
|
||||
"components.UserList.deleteuser": "Usuń {username}",
|
||||
"components.UserList.deleteuser": "Usuń użytkownika",
|
||||
"components.UserList.displayName": "Wyświetlana nazwa",
|
||||
"components.UserList.importedfromplex": "<strong>{userCount}</strong> {userCount, plural, one {użytkownik Plex został zaimportowany} other {użytkowników Plex zostało zaimportowanych}} pomyślnie!",
|
||||
"components.UserList.localLoginDisabled": "Ustawienie <strong>Włącz Lokalne Logowanie</strong> jest obecnie wyłączone.",
|
||||
@@ -855,7 +850,6 @@
|
||||
"components.UserProfile.UserSettings.menuPermissions": "Uprawnienia",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Nie masz uprawnień do modyfikowania ustawień tego użytkownika.",
|
||||
"components.UserProfile.limit": "{remaining} z {limit}",
|
||||
"components.UserProfile.norequests": "Brak próśb.",
|
||||
"components.UserProfile.pastdays": "{type} (ostatnie {days} dni)",
|
||||
"components.UserProfile.requestsperdays": "Pozostało {limit}",
|
||||
"components.UserProfile.seriesrequest": "Prośby o seriale",
|
||||
@@ -1046,5 +1040,25 @@
|
||||
"components.StatusChecker.restartRequired": "Wymagane ponowne uruchomienie serwera",
|
||||
"components.MovieDetails.digitalrelease": "Wydanie cyfrowe",
|
||||
"components.MovieDetails.physicalrelease": "Wydanie fizyczne",
|
||||
"components.MovieDetails.theatricalrelease": "Wydanie kinowe"
|
||||
"components.MovieDetails.theatricalrelease": "Wydanie kinowe",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Twoja lista obserwowanych Plex",
|
||||
"components.Discover.plexwatchlist": "Twoja lista obserwowanych Plex",
|
||||
"components.PermissionEdit.autorequest": "Automatyczna prośba",
|
||||
"components.PermissionEdit.autorequestDescription": "Udziel zgody na automatyczne przesyłanie próśb dotyczących multimediów innych niż 4K za pośrednictwem listy obserwowanych Plex.",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Prośba przesłana automatycznie",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Otrzymuj powiadomienia o automatycznym składaniu nowych próśb o multimedia dla pozycji znajdujących się na liście obserwowanych Plex.",
|
||||
"components.PermissionEdit.autorequestMovies": "Filmy z próśb automatycznych",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Lista obserwowanych Plex",
|
||||
"components.MovieDetails.managemovie": "Zarządzaj filmem",
|
||||
"components.MovieDetails.reportissue": "Zgłoś problem",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Udziel zgody na automatyczne przesyłanie próśb dotyczących multimediów innych niż 4K za pośrednictwem listy obserwowanych Plex.",
|
||||
"components.PermissionEdit.autorequestSeries": "Automatyczna prośba o serial",
|
||||
"components.AirDateBadge.airedrelative": "Wyemitowany {relativeTime}",
|
||||
"components.AirDateBadge.airsrelative": "Data emisji {relativeTime}",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Prośby o filmy",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Prośby o seriale",
|
||||
"components.Layout.UserDropdown.requests": "Prośby",
|
||||
"components.MovieDetails.rtaudiencescore": "Ocena Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Tomatometer Rotten Tomatoes",
|
||||
"components.MovieDetails.tmdbuserscore": "Ocena użytkowników TMDB"
|
||||
}
|
||||
|
||||
@@ -141,12 +141,11 @@
|
||||
"components.Search.searchresults": "Resultados da Pesquisa",
|
||||
"components.RequestModal.selectseason": "Selecione Temporada(s)",
|
||||
"components.RequestModal.seasonnumber": "Temporada {number}",
|
||||
"components.RequestModal.requesttitle": "Solicitar {title}",
|
||||
"components.RequestModal.requestfrom": "Existe uma solicitação pendente de {username}.",
|
||||
"components.RequestModal.requestadmin": "Essa solicitação será aprovada automaticamente.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> solicitado com sucesso!",
|
||||
"components.RequestModal.requestCancel": "Solicitação para <strong>{title}</strong> cancelada.",
|
||||
"components.RequestModal.pendingrequest": "Solicitação Pendente para {title}",
|
||||
"components.RequestModal.pendingrequest": "Solicitação Pendente",
|
||||
"components.RequestModal.numberofepisodes": "# de Episódeos",
|
||||
"components.RequestModal.extras": "Extras",
|
||||
"components.RequestModal.cancel": "Cancelar Solicitação",
|
||||
@@ -215,7 +214,7 @@
|
||||
"components.UserList.totalrequests": "Solicitações",
|
||||
"components.UserList.role": "Privilégio",
|
||||
"components.UserList.plexuser": "Usuário Plex",
|
||||
"components.UserList.deleteuser": "Remover {username}",
|
||||
"components.UserList.deleteuser": "Deletar Usuário",
|
||||
"components.UserList.deleteconfirm": "Tem certeza que deseja apagar esse usuário? Todas informações de solicitações feitas por esse usuário serão permanentemente removidas.",
|
||||
"components.UserList.created": "Criado",
|
||||
"components.UserList.admin": "Administrador",
|
||||
@@ -273,8 +272,7 @@
|
||||
"components.RequestList.sortAdded": "Mais Recente",
|
||||
"components.RequestList.showallrequests": "Exibir Todas Solicitações",
|
||||
"components.StatusBadge.status4k": "4K {status}",
|
||||
"components.RequestModal.request4ktitle": "Solicitar {title} em 4K",
|
||||
"components.RequestModal.pending4krequest": "Solicitação em 4K Pendente para {title}",
|
||||
"components.RequestModal.pending4krequest": "Solicitação em 4K Pendente",
|
||||
"components.Settings.Notifications.NotificationsWebhook.webhooksettingssaved": "Configurações de notificação via Webhook salvas com sucesso!",
|
||||
"components.Settings.Notifications.NotificationsWebhook.webhooksettingsfailed": "Falha ao salvar configurações de notificação via Webhook.",
|
||||
"components.Settings.Notifications.NotificationsWebhook.webhookUrl": "URL de Webhook",
|
||||
@@ -336,7 +334,6 @@
|
||||
"components.Settings.hideAvailable": "Ocultar Títulos Disponíveis",
|
||||
"components.RequestModal.requesterror": "Algo deu errado ao solicitar mídia.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Não conseguimos correlacionar sua solicitação automaticamente. Por favor selecione a correspondência correta na lista abaixo.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Sinopse não encontrada para esse título.",
|
||||
"components.Login.signin": "Entrar",
|
||||
"components.UserList.userssaved": "Permissões de usuário salvas com sucesso!",
|
||||
"components.UserList.bulkedit": "Edição Em Massa",
|
||||
@@ -570,7 +567,6 @@
|
||||
"components.Settings.SettingsJobsCache.radarr-scan": "Escanemento do Radarr",
|
||||
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Recentemente Adicionado ao Plex",
|
||||
"components.Settings.SettingsJobsCache.plex-full-scan": "Escaneamento de Todas Bibliotecas do Plex",
|
||||
"components.UserProfile.norequests": "Nenhuma solicitação.",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Você não tem permissão para modificar as configurações desse usuários.",
|
||||
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Você não pode modificar suas próprias permissões.",
|
||||
"components.UserProfile.ProfileHeader.userid": "ID de Usuário: {userid}",
|
||||
@@ -601,7 +597,7 @@
|
||||
"components.ResetPassword.passwordreset": "Redefinir Senha",
|
||||
"components.Settings.SettingsLogs.logDetails": "Detalhes do Log",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailureVerifyCurrent": "Algo deu errado ao salvar sua senha. Sua senha foi digitada corretamente?",
|
||||
"components.Settings.cacheImagesTip": "Otimiza e armazena todas imagens localmente (consume um espaço significante do disco)",
|
||||
"components.Settings.cacheImagesTip": "Armazena em cache e distribui imagens otimizadas (requer um espaço significante no disco)",
|
||||
"pages.somethingwentwrong": "Algo deu errado",
|
||||
"pages.serviceunavailable": "Serviço Indisponível",
|
||||
"pages.pagenotfound": "Página Não Encontrada",
|
||||
@@ -742,7 +738,6 @@
|
||||
"components.Layout.VersionStatus.streamdevelop": "Overseerr Desenv.",
|
||||
"components.Layout.VersionStatus.outofdate": "Desatualizado",
|
||||
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {versão} other {versões}} atrasado(a)",
|
||||
"components.Discover.noRequests": "Nenhuma solicitação.",
|
||||
"components.UserList.autogeneratepasswordTip": "Envia para o usuário uma senha gerada automaticamente",
|
||||
"i18n.retrying": "Tentando Novamente…",
|
||||
"components.UserList.usercreatedfailedexisting": "O e-mail informado já está em uso por outro usuário.",
|
||||
@@ -903,7 +898,6 @@
|
||||
"components.IssueDetails.toaststatusupdatefailed": "Algo deu errado ao atualizar o estado do problema.",
|
||||
"components.IssueDetails.unknownissuetype": "Desconhecido",
|
||||
"components.IssueList.issues": "Problemas",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Algum problema com {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Episódio Afetado",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Temporada Afetada",
|
||||
"components.IssueList.IssueItem.problemepisode": "Episódio Afetado",
|
||||
@@ -1061,5 +1055,53 @@
|
||||
"components.PermissionEdit.autorequestMovies": "Solicitar Filmes Automaticamente",
|
||||
"components.PermissionEdit.autorequestSeries": "Solicitar Séries Automaticamente",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Solicitar Filmes Automaticamente",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Solicitar Séries Automaticamente"
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Solicitar Séries Automaticamente",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Sua Lista para Assistir do Plex",
|
||||
"components.Discover.plexwatchlist": "Sua Lista para Assistir do Plex",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Lista para Assistir do Plex",
|
||||
"components.AirDateBadge.airedrelative": "Exibido em {relativeTime}",
|
||||
"components.AirDateBadge.airsrelative": "Exibindo {relativeTime}",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Pedidos de Filmes",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Pedidos de Séries",
|
||||
"components.Layout.UserDropdown.requests": "Pedidos",
|
||||
"components.MovieDetails.managemovie": "Gerenciar Filme",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Ser notificado quando um novo pedido de mídia de algum item da sua Lista para assistir no Plex for automaticamente enviado.",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Pedido automaticamente enviado",
|
||||
"components.PermissionEdit.autorequestDescription": "Dar permissão para enviar automaticamente pedidos para mídias não-4K via Lista para assistir do Plex.",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Dar permissão para enviar automaticamente pedidos para filmes não-4K via Lista para assistir do Plex.",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Dar permissão para enviar automaticamente pedidos para séries não-4K via Lista para assistir do Plex.",
|
||||
"components.PermissionEdit.viewwatchlists": "Ver Lista para assistir do Plex",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Dar permissão para ver a Lista para assistir do Plex de outros usuários.",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Sincronizar Lista para assistir do Plex",
|
||||
"components.Settings.SettingsLogs.viewdetails": "Ver Detalhes",
|
||||
"components.Settings.advancedTooltip": "Configurar incorretamente esta opção pode resultar em uma funcionalidade quebrada",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr deve ser reiniciado para as mudanças tomarem efeito",
|
||||
"components.Settings.experimentalTooltip": "Habilitar essa opção pode resultar em um comportamento não esperado da aplicação",
|
||||
"components.TvDetails.reportissue": "Reportar um Problema",
|
||||
"components.MovieDetails.reportissue": "Reportar um problema",
|
||||
"components.StatusBadge.managemedia": "Gerenciar {mediaType}",
|
||||
"components.StatusBadge.openinarr": "Abrir em {arr}",
|
||||
"components.TvDetails.Season.somethingwentwrong": "Algo deu errado enquanto os dados da temporada eram adquiridos.",
|
||||
"components.TvDetails.manageseries": "Gerenciar Séries",
|
||||
"components.TvDetails.rtcriticsscore": "Pontuação de audiência no Rotten Tomatoes",
|
||||
"components.TvDetails.seasonnumber": "Temporada {seasonNumber}",
|
||||
"components.TvDetails.seasonstitle": "Temporadas",
|
||||
"components.TvDetails.rtaudiencescore": "Pontuação de audiência no Rotten Tomatoes",
|
||||
"components.TvDetails.status4k": "4K {status}",
|
||||
"components.TvDetails.tmdbuserscore": "Pontuação de Usuário do TMDB",
|
||||
"components.MovieDetails.tmdbuserscore": "Pontuação de usuário do TMDB",
|
||||
"components.MovieDetails.rtaudiencescore": "Pontuação de audiência no Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Tomatômetro do Rotten Tomatoes",
|
||||
"components.RequestBlock.edit": "Editar Pedido",
|
||||
"components.RequestCard.approverequest": "Aprovar pedido",
|
||||
"components.RequestBlock.approve": "Aprovar pedido",
|
||||
"components.RequestBlock.requestdate": "Data do pedido",
|
||||
"components.RequestCard.declinerequest": "Rejeitar Pedido",
|
||||
"components.RequestCard.editrequest": "Editar Pedido",
|
||||
"components.StatusBadge.playonplex": "Reproduzir no Plex",
|
||||
"components.RequestBlock.decline": "Rejeitar pedido",
|
||||
"components.RequestBlock.lastmodifiedby": "Última modificação por",
|
||||
"components.RequestBlock.delete": "Deletar pedido",
|
||||
"components.RequestBlock.requestedby": "Pedido por",
|
||||
"components.RequestCard.cancelrequest": "Cancelar pedido"
|
||||
}
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
"components.RequestModal.selectseason": "Selecionar Semporada(s)",
|
||||
"components.RequestModal.seasonnumber": "Temporada {number}",
|
||||
"components.RequestModal.season": "Temporada",
|
||||
"components.RequestModal.requesttitle": "Pedir {title}",
|
||||
"components.RequestModal.requestseasons": "Pedir {seasonCount} {seasonCount, plural, one {Temporada} other {Temporadas}}",
|
||||
"components.RequestModal.requestfrom": "O peido de {username} está com aprovação pendente.",
|
||||
"components.RequestModal.requestedited": "Pedido para <strong>{title}</strong> modificado com sucesso!",
|
||||
@@ -79,9 +78,8 @@
|
||||
"components.RequestModal.requestadmin": "Este pedido será aprovado automaticamente.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> pedido com sucesso!",
|
||||
"components.RequestModal.requestCancel": "Pedido para <strong>{title}</strong> cancelado.",
|
||||
"components.RequestModal.request4ktitle": "Pedir {title} em 4K",
|
||||
"components.RequestModal.pendingrequest": "Pedido pendente para {title}",
|
||||
"components.RequestModal.pending4krequest": "Pedido 4K pendente para {title}",
|
||||
"components.RequestModal.pendingrequest": "Pedido pendente",
|
||||
"components.RequestModal.pending4krequest": "Pedido 4K pendente",
|
||||
"components.RequestModal.numberofepisodes": "# de Episódios",
|
||||
"components.RequestModal.extras": "Extras",
|
||||
"components.RequestModal.errorediting": "Ocorreu um erro durante a edição do pedido.",
|
||||
@@ -337,7 +335,6 @@
|
||||
"components.Login.signinwithplex": "Iniciar sessão com a sua conta Plex",
|
||||
"components.RequestModal.requesterror": "Ocorreu um erro ao submeter o pedido.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Não foi possível associar seu pedido automaticamente. Por favor selecione a correspondência correta a partir da lista abaixo.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Sinopse não encontrada para este título.",
|
||||
"components.Login.signinheader": "Iniciar sessão para continuar",
|
||||
"components.Login.signingin": "A Iniciar Sessão…",
|
||||
"components.Login.signin": "Iniciar Sessão",
|
||||
@@ -583,7 +580,6 @@
|
||||
"components.UserProfile.UserSettings.UserPermissions.unauthorizedDescription": "Não pode modificar suas próprias permissões.",
|
||||
"components.NotificationTypeSelector.mediaAutoApprovedDescription": "Enviar notificações quando os utilizadores apresentarem novos pedidos de multimédia que são automaticamente aprovados.",
|
||||
"components.NotificationTypeSelector.mediaAutoApproved": "Multimédia Aprovada Automaticamente",
|
||||
"components.UserProfile.norequests": "Sem pedidos.",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minutos",
|
||||
"components.TvDetails.episodeRuntime": "Duração do Episódio",
|
||||
"components.Settings.Notifications.pgpPrivateKeyTip": "Assinar mensagens de e-mail encriptadas utilizando <OpenPgpLink>OpenPGP</OpenPgpLink>",
|
||||
@@ -733,7 +729,6 @@
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingssaved": "Definições de notificação Discord gravadas com sucesso!",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordsettingsfailed": "Falha ao gravar as definições de notificação Discord.",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Cancelar Pedido",
|
||||
"components.Discover.noRequests": "Sem pedidos.",
|
||||
"components.Settings.serviceSettingsDescription": "Configure o seu(s) servidor(es) {serverType} abaixo. Pode ligar vários servidores {serverType}, mas apenas dois deles podem ser marcados como predefinidos (um não 4K e um 4K). Os administradores podem mudar o servidor usado para processar novos pedidos antes da aprovação.",
|
||||
"components.Settings.noDefaultServer": "Pelo menos um servidor {serverType} deve ser marcado como predefinido para que os pedidos de {mediaType} sejam processados.",
|
||||
"components.Settings.noDefaultNon4kServer": "Se tiver apenas um único servidor {serverType} para conteúdo não 4K e 4K (ou se apenas transfere conteúdo 4K), o seu servidor {serverType} <strong>NÃO</strong> deve ser designado como um servidor 4K.",
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
"components.Discover.discover": "Descoperă",
|
||||
"components.Discover.discovermovies": "Filme populare",
|
||||
"components.Discover.discovertv": "Seriale populare",
|
||||
"components.Discover.noRequests": "Nu există solicitări.",
|
||||
"components.Discover.popularmovies": "Filme populare",
|
||||
"components.Discover.populartv": "Seriale populare",
|
||||
"components.Discover.recentlyAdded": "Adăugate recent",
|
||||
|
||||
@@ -33,13 +33,12 @@
|
||||
"components.RequestModal.cancel": "Отменить запрос",
|
||||
"components.RequestModal.extras": "Дополнительно",
|
||||
"components.RequestModal.numberofepisodes": "# эпизодов",
|
||||
"components.RequestModal.pendingrequest": "В ожидании запрос на {title}",
|
||||
"components.RequestModal.pendingrequest": "",
|
||||
"components.RequestModal.requestCancel": "Запрос на <strong>{title}</strong> отменён.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> успешно запрошен!",
|
||||
"components.RequestModal.requestadmin": "Этот запрос будет одобрен автоматически.",
|
||||
"components.RequestModal.requestfrom": "Запрос пользователя {username} ожидает одобрения.",
|
||||
"components.RequestModal.requestseasons": "Запросить {seasonCount} {seasonCount, plural, one {сезон} other {сезона(ов)}}",
|
||||
"components.RequestModal.requesttitle": "Запросить {title}",
|
||||
"components.RequestModal.season": "Сезон",
|
||||
"components.RequestModal.seasonnumber": "Сезон {number}",
|
||||
"components.RequestModal.selectseason": "Выберите сезон(ы)",
|
||||
@@ -406,7 +405,6 @@
|
||||
"components.Layout.LanguagePicker.displaylanguage": "Язык интерфейса",
|
||||
"components.DownloadBlock.estimatedtime": "Приблизительно {time}",
|
||||
"components.Discover.upcomingtv": "Предстоящие сериалы",
|
||||
"components.Discover.noRequests": "Запросов нет.",
|
||||
"components.Discover.discover": "Найти что-то новое",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Сериалы по жанрам",
|
||||
"components.Discover.TvGenreList.seriesgenres": "Сериалы по жанрам",
|
||||
@@ -568,8 +566,7 @@
|
||||
"components.TvDetails.seasons": "{seasonCount, plural, one {# сезон} other {# сезонов}}",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Этому пользователю необходимо иметь по крайней мере <strong>{seasons}</strong> {seasons, plural, one {запрос на сезоны} other {запроса(ов) на сезоны}} для того, чтобы отправить запрос на этот сериал.",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "Вам необходимо иметь по крайней мере <strong>{seasons}</strong> {seasons, plural, one {запрос на сезоны} other {запроса(ов) на сезоны}} для того, чтобы отправить запрос на этот сериал.",
|
||||
"components.RequestModal.request4ktitle": "Запросить {title} в 4К",
|
||||
"components.RequestModal.pending4krequest": "В ожидании 4К запрос на {title}",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.autoapproval": "Автоматическое одобрение",
|
||||
"i18n.usersettings": "Настройки пользователя",
|
||||
"i18n.showingresults": "Показываются результаты с <strong>{from}</strong> по <strong>{to}</strong> из <strong>{total}</strong>",
|
||||
@@ -583,7 +580,6 @@
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Мы не смогли автоматически выполнить ваш запрос. Пожалуйста, выберите правильное совпадение из списка ниже.",
|
||||
"components.TvDetails.originaltitle": "Название оригинала",
|
||||
"components.Settings.validationApplicationTitle": "Вы должны указать название приложения",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Аннотации для этого названия не найдено.",
|
||||
"i18n.tvshow": "Сериал",
|
||||
"components.Settings.partialRequestsEnabled": "Разрешить частичные запросы сериалов",
|
||||
"components.Settings.mediaTypeSeries": "сериал",
|
||||
@@ -750,7 +746,6 @@
|
||||
"components.UserProfile.pastdays": "{type} (за {days} день(ей))",
|
||||
"components.UserProfile.seriesrequest": "Запросов сериалов",
|
||||
"components.UserProfile.movierequests": "Запросов фильмов",
|
||||
"components.UserProfile.norequests": "Запросов нет.",
|
||||
"components.UserProfile.limit": "{remaining} из {limit}",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "У вас нет разрешения на изменение настроек этого пользователя.",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "У вас нет разрешения на изменение пароля этого пользователя.",
|
||||
@@ -887,7 +882,6 @@
|
||||
"components.IssueModal.CreateIssueModal.episode": "Эпизод {episodeNumber}",
|
||||
"components.ManageSlideOver.mark4kavailable": "Пометить как доступный в 4К",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Дополнительно",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Есть проблема с «{title}»?",
|
||||
"components.IssueModal.CreateIssueModal.problemseason": "Затронутый сезон",
|
||||
"components.ManageSlideOver.downloadstatus": "Загрузки",
|
||||
"components.ManageSlideOver.manageModalIssues": "Открытые проблемы",
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
"components.IssueModal.CreateIssueModal.allepisodes": "Të gjithë Episodet",
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "Të gjithë Sezonet",
|
||||
"components.IssueModal.CreateIssueModal.extras": "Ekstrat",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "A ka ndonjë problem me {title}?",
|
||||
"components.Login.loginerror": "Diçka shkoi keq duke u përpjekur të hyja.",
|
||||
"components.Login.signinheader": "Identifikohu për të vazhduar",
|
||||
"components.MovieDetails.budget": "Buxheti",
|
||||
@@ -56,7 +55,6 @@
|
||||
"components.Discover.discover": "Zbulo",
|
||||
"components.Discover.discovermovies": "Filma Popullorë",
|
||||
"components.Discover.discovertv": "Seriale Popullore",
|
||||
"components.Discover.noRequests": "Asnjë kërkesë.",
|
||||
"components.Discover.popularmovies": "Filma Popullorë",
|
||||
"components.Discover.populartv": "Seriale Popullore",
|
||||
"components.Discover.recentlyAdded": "Shtuar së Fundmi",
|
||||
@@ -287,7 +285,6 @@
|
||||
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Nuk kanë mbetur kërkesa të mjaftueshme për sezonin",
|
||||
"components.RequestModal.QuotaDisplay.quotaLink": "Ju mund të shikoni një përmbledhje të kufizimeve tuaja të kërkesës në <ProfileLink>faqen tuaj të profilit</ProfileLink>.",
|
||||
"components.RequestModal.QuotaDisplay.season": "sezon",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Nuk u gjet asnjë përmbledhje për këtë titull.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Nuk mund të përputheshim automatikisht me kërkesën tënde. Ju lutem zgjidhni ndeshjen e saktë nga lista më poshtë.",
|
||||
"components.RequestModal.alreadyrequested": "E Kërkuar Tashmë",
|
||||
"components.RequestModal.approve": "Mirato Kërkesën",
|
||||
@@ -295,9 +292,8 @@
|
||||
"components.RequestModal.edit": "Ndrysho kërkesën",
|
||||
"components.RequestModal.errorediting": "Diçka shkoi keq duke modifikuar kërkesën.",
|
||||
"components.RequestModal.numberofepisodes": "# i Episodeve",
|
||||
"components.RequestModal.pending4krequest": "Kërkesë 4K në pritje për {title}",
|
||||
"components.RequestModal.pendingrequest": "Kërkesë në pritje për {title}",
|
||||
"components.RequestModal.request4ktitle": "Kërko {title} në 4K",
|
||||
"components.RequestModal.pending4krequest": "",
|
||||
"components.RequestModal.pendingrequest": "Kërkesë në pritje",
|
||||
"components.RequestModal.requestApproved": "Kërkesa për <strong>{title}</strong> u miratua!",
|
||||
"components.RequestModal.requestCancel": "Kërkesa për <strong>{title}</strong> u anullua.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> u kërkua me sukses!",
|
||||
@@ -307,7 +303,6 @@
|
||||
"components.RequestModal.requestfrom": "Kërkesa e {username} është në pritje të miratimit.",
|
||||
"components.RequestModal.requestmovies": "Kërko {count} {count, plural, one {Film} other {Filma}}",
|
||||
"components.RequestModal.requestmovies4k": "Kërko {count} {count, plural, one {Film} other {Filma}} në 4K",
|
||||
"components.RequestModal.requesttitle": "Kërko {title}",
|
||||
"components.RequestModal.season": "Sezoni",
|
||||
"components.RequestModal.seasonnumber": "Sezoni {numri}",
|
||||
"components.RequestModal.selectmovies": "Zgjidh Filmat",
|
||||
@@ -819,7 +814,6 @@
|
||||
"components.UserProfile.UserSettings.menuPermissions": "Lejet",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "Ju nuk keni leje për të modifikuar cilësimet e këtij përdoruesi.",
|
||||
"components.UserProfile.limit": "{remaining} prej {limit}",
|
||||
"components.UserProfile.norequests": "Asnjë kërkesë.",
|
||||
"components.UserProfile.pastdays": "{type} (kaluar {days} ditë)",
|
||||
"components.UserProfile.recentlywatched": "Shikuar së fundmi",
|
||||
"components.UserProfile.totalrequests": "Kërkesat totale",
|
||||
@@ -1035,5 +1029,43 @@
|
||||
"i18n.experimental": "Eksperimentale",
|
||||
"i18n.noresults": "S'ka rezultate.",
|
||||
"i18n.notrequested": "Nuk është Kerkuar",
|
||||
"components.Settings.SettingsAbout.appDataPath": "Direktoria e të dhënave"
|
||||
"components.Settings.SettingsAbout.appDataPath": "Direktoria e të dhënave",
|
||||
"components.MovieDetails.digitalrelease": "Publikimi Dixhital",
|
||||
"components.MovieDetails.physicalrelease": "Lëshimi Fizik",
|
||||
"components.MovieDetails.theatricalrelease": "Publikimi Teatror",
|
||||
"components.PermissionEdit.viewrecent": "Shiko Shtuar së fundi",
|
||||
"components.PermissionEdit.viewrecentDescription": "Jep leje për të parë listën e mediave të shtuara kohët e fundit.",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Lista juaj e shikimit në Plex",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "Jepni lejen për të paraqitur automatikisht kërkesat për mediat jo-4K nëpërmjet Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequestSeries": "Kërkesa Automatike Serialesh",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "Jep leje për të paraqitur automatikisht kërkesat për seri jo-4K nëpërmjet Plex Watchlist.",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Lista e Shikimit Plex",
|
||||
"components.Discover.plexwatchlist": "Lista juaj e shikimit në Plex",
|
||||
"components.MovieDetails.reportissue": "Raportoni një problem",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "Kërkesa u dorëzua automatikisht",
|
||||
"components.PermissionEdit.autorequest": "Auto-Kërkesë",
|
||||
"components.PermissionEdit.autorequestDescription": "Jepni lejen për të paraqitur automatikisht kërkesat për mediat jo-4K nëpërmjet Plex Watchlist.",
|
||||
"components.PermissionEdit.autorequestMovies": "Kërkesë automatike për filma",
|
||||
"components.PermissionEdit.viewwatchlists": "Shiko listat e shikimit të Plex",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "Jep leje për të parë listat e Plex Watchlist të përdoruesve të tjerë.",
|
||||
"components.MovieDetails.managemovie": "Menaxho filmin",
|
||||
"components.AirDateBadge.airedrelative": "Transmetuar {relativeTime}",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Kërkesat e Filmave",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Kërkesat e Serialeve",
|
||||
"components.Layout.UserDropdown.requests": "Kërkesat",
|
||||
"components.MovieDetails.rtaudiencescore": "Rezultati i audiencës së Rotten Tomatoes",
|
||||
"components.MovieDetails.rtcriticsscore": "Tomatometeri i Rotten Tomatoes",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "Njoftohuni kur kërkesat e reja të medias dorëzohen automatikisht për artikujt në Listën tuaj të Plex Watchlist.",
|
||||
"components.RequestBlock.languageprofile": "Profili i gjuhës",
|
||||
"components.AirDateBadge.airsrelative": "Duke u Transmetuar {relativeTime}",
|
||||
"components.Discover.emptywatchlist": "Këtu do të shfaqet media e shtuar në listën tuaj <PlexWatchlistSupportLink>Plex</PlexWatchlistSupportLink>.",
|
||||
"components.RequestBlock.decline": "Refuzo kërkesën",
|
||||
"components.RequestBlock.delete": "Fshije Kërkesën",
|
||||
"components.RequestBlock.edit": "Ndrysho kërkesën",
|
||||
"components.MovieDetails.tmdbuserscore": "Nota e përdoruesve TMDB",
|
||||
"components.RequestBlock.approve": "Mirato Kërkesën",
|
||||
"components.RequestBlock.lastmodifiedby": "Ndryshuar së fundi nga",
|
||||
"components.RequestBlock.requestdate": "Data e Kërkesës",
|
||||
"components.RequestBlock.requestedby": "Kërkuar nga",
|
||||
"components.RequestCard.approverequest": "Mirato Kërkesën"
|
||||
}
|
||||
|
||||
@@ -170,12 +170,11 @@
|
||||
"components.RequestModal.selectseason": "Odaberi sezonu(e)",
|
||||
"components.RequestModal.seasonnumber": "Sezona {number}",
|
||||
"components.RequestModal.season": "Sezona",
|
||||
"components.RequestModal.requesttitle": "Zatraži {title}",
|
||||
"components.RequestModal.requestfrom": "Trenutno postoji zahtev na čekanju od {username}.",
|
||||
"components.RequestModal.requestadmin": "Ovaj zahtev će odmah biti prihvaćen.",
|
||||
"components.RequestModal.requestSuccess": "Poslat zahtev za <strong>{title}</strong> !",
|
||||
"components.RequestModal.requestCancel": "Zahtev za <strong>{title}</strong> otkazan.",
|
||||
"components.RequestModal.pendingrequest": "Zahtev na čekanju za {title}",
|
||||
"components.RequestModal.pendingrequest": "Zahtev na čekanju",
|
||||
"components.RequestModal.numberofepisodes": "# broj epizoda",
|
||||
"components.RequestModal.extras": "Dodaci",
|
||||
"components.RequestModal.cancel": "Otkaži zahtev",
|
||||
@@ -379,7 +378,6 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.generalsettings": "Standardna podešavanja",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Plex korisnik",
|
||||
"components.PermissionEdit.autoapprove4k": "Automatsko odobrenje 4K",
|
||||
"components.Discover.noRequests": "Nema zahteva.",
|
||||
"components.IssueModal.issueSubtitles": "Titl",
|
||||
"components.PermissionEdit.managerequests": "Upravljajte zahtevima",
|
||||
"components.RequestBlock.rootfolder": "Root folder",
|
||||
@@ -511,7 +509,6 @@
|
||||
"components.UserProfile.ProfileHeader.joindate": "Pridružio se {joindate}",
|
||||
"components.Settings.Notifications.botUsername": "Bot korisničko ime",
|
||||
"components.Settings.Notifications.pgpPassword": "PGP lozinka",
|
||||
"components.UserProfile.norequests": "Nema zahteva.",
|
||||
"components.Settings.SettingsLogs.logDetails": "Detalji dnevnika",
|
||||
"components.Settings.scan": "Sinhronizacija biblioteka",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.sendSilently": "Pošalji tiho",
|
||||
@@ -609,5 +606,10 @@
|
||||
"components.PermissionEdit.autoapprove4kSeriesDescription": "Dozvoli automatsko odobravanje zahteva za 4K serije.",
|
||||
"components.ResetPassword.gobacklogin": "Vrati se na stranu za prijavu",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Svaki {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}",
|
||||
"components.Settings.SettingsAbout.uptodate": "Najsvežiji"
|
||||
"components.Settings.SettingsAbout.uptodate": "Najsvežiji",
|
||||
"components.Settings.Notifications.NotificationsWebhook.validationJsonPayloadRequired": "Morate da navedete važeći JSON korisni teret",
|
||||
"components.Settings.Notifications.validationChatIdRequired": "Morate da navedete važeći ID za ćaskanje",
|
||||
"components.StatusBadge.playonplex": "Igrajte na Plex-u",
|
||||
"components.Settings.Notifications.NotificationsPushbullet.validationAccessTokenRequired": "Morate da obezbedite pristupni token",
|
||||
"components.UserList.userssaved": "Korisničke dozvole su uspešno sačuvane!"
|
||||
}
|
||||
|
||||
@@ -127,12 +127,11 @@
|
||||
"components.RequestModal.selectseason": "Välj säsong(er)",
|
||||
"components.RequestModal.seasonnumber": "Säsong {number}",
|
||||
"components.RequestModal.season": "Säsong",
|
||||
"components.RequestModal.requesttitle": "Begär {title}",
|
||||
"components.RequestModal.requestfrom": "{username}'s begäran väntar på godkännande.",
|
||||
"components.RequestModal.requestadmin": "Förfrågan kommer bli godkännas automatiskt.",
|
||||
"components.RequestModal.requestSuccess": "<strong>{title}</strong> begärd!",
|
||||
"components.RequestModal.requestCancel": "Förfrågan för <strong>{title}</strong> avbruten.",
|
||||
"components.RequestModal.pendingrequest": "Väntande Förfrågan för {title}",
|
||||
"components.RequestModal.pendingrequest": "Väntande Förfrågan",
|
||||
"components.RequestModal.numberofepisodes": "Antal Avsnitt",
|
||||
"components.RequestModal.extras": "Extramaterial",
|
||||
"components.RequestModal.cancel": "Avbryt förfrågan",
|
||||
@@ -268,8 +267,7 @@
|
||||
"components.Settings.Notifications.NotificationsPushover.pushoversettingsfailed": "Notifieringsinställningar för Pushover kunde inte sparas.",
|
||||
"components.Settings.Notifications.NotificationsPushover.agentenabled": "Aktiverad",
|
||||
"components.Settings.Notifications.NotificationsPushover.accessToken": "Application API-token",
|
||||
"components.RequestModal.request4ktitle": "Begär {titel} i 4K",
|
||||
"components.RequestModal.pending4krequest": "Väntande 4K-förfrågan för {title]",
|
||||
"components.RequestModal.pending4krequest": "Väntande 4K-förfrågan",
|
||||
"components.RequestList.sortModified": "Senast ändrad",
|
||||
"components.RequestList.sortAdded": "Senaste",
|
||||
"components.RequestList.showallrequests": "Visa alla förfrågningar",
|
||||
@@ -316,7 +314,6 @@
|
||||
"components.PlexLoginButton.signingin": "Loggar in…",
|
||||
"components.RequestModal.requesterror": "Någonting gick fel vid behandling av din begäran.",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Vi kunde inte automatiskt matcha din begäran. Var god välj den korrekta matchningen från listan nedanför.",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "Ingen summering för denna titel hittades.",
|
||||
"i18n.experimental": "Experimentell",
|
||||
"components.Settings.hideAvailable": "Göm Tillgänglig Media",
|
||||
"components.RequestModal.autoapproval": "Automatiskt Godkännande",
|
||||
@@ -518,7 +515,7 @@
|
||||
"components.Settings.scanning": "Synkar…",
|
||||
"components.Settings.scan": "Skanna bibliotek",
|
||||
"components.Settings.regionTip": "Filtrera innehåll efter region tillgänglighet",
|
||||
"components.Settings.region": "Upptäck Region",
|
||||
"components.Settings.region": "Upptäck region",
|
||||
"components.Settings.originallanguageTip": "Filtrera innehåll efter originalspråk",
|
||||
"components.Settings.originallanguage": "Upptäck språk",
|
||||
"components.Settings.notificationAgentSettingsDescription": "Konfigurera och aktivera aviseringsagenter.",
|
||||
@@ -588,7 +585,6 @@
|
||||
"components.Discover.TvGenreList.seriesgenres": "Seriegenrer",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "Seriegenrer",
|
||||
"components.RequestModal.AdvancedRequester.folder": "{path} ({space})",
|
||||
"components.UserProfile.norequests": "Inga förfrågningar.",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minuter",
|
||||
"components.TvDetails.episodeRuntime": "Avsnittets speltid",
|
||||
"components.Settings.partialRequestsEnabled": "Tillåt begäran av ofullständig serie",
|
||||
@@ -679,8 +675,8 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.seriesrequestlimit": "Serieförfrågnings gräns",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.movierequestlimit": "Filmförfrågnings gräns",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.enableOverride": "Överskrid den globala gränsen",
|
||||
"components.Settings.SettingsUsers.tvRequestLimitLabel": "Global serieförfrågnings gräns",
|
||||
"components.Settings.SettingsUsers.movieRequestLimitLabel": "Global filmförfrågnings gräns",
|
||||
"components.Settings.SettingsUsers.tvRequestLimitLabel": "Global serieförfrågningsgräns",
|
||||
"components.Settings.SettingsUsers.movieRequestLimitLabel": "Global filmförfrågningsgräns",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Den här användaren behöver ha minst <strong>{seasons}</strong> {seasons, plural, one {säsongsförfrågan} other {säsongsförfrågningar}} kvar för att skicka in en begäran om denna serie.",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {säsong} other {säsonger}}",
|
||||
"components.RequestModal.QuotaDisplay.season": "säsong",
|
||||
@@ -729,7 +725,6 @@
|
||||
"components.RequestModal.pendingapproval": "Din begäran väntar på godkännande.",
|
||||
"components.RequestList.RequestItem.cancelRequest": "Avbryt begäran",
|
||||
"components.NotificationTypeSelector.notificationTypes": "Notifikationstyper",
|
||||
"components.Discover.noRequests": "Inga förfrågningar.",
|
||||
"components.Layout.VersionStatus.streamstable": "Overseerr Stabil",
|
||||
"components.Layout.VersionStatus.streamdevelop": "Overseerr Utveckling",
|
||||
"components.Layout.VersionStatus.outofdate": "Föråldrad",
|
||||
@@ -958,7 +953,6 @@
|
||||
"components.IssueModal.CreateIssueModal.allepisodes": "Alla avsnitt",
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "Alla säsonger",
|
||||
"components.IssueModal.CreateIssueModal.episode": "Avsnitt {episodeNumber}",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "Är det något problem med {title}?",
|
||||
"components.IssueModal.CreateIssueModal.problemepisode": "Påverkat avsnitt",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "Ge en detaljerad förklaring av det problem du stötte på.",
|
||||
"components.ManageSlideOver.downloadstatus": "Nedladdningar",
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
"components.UserList.email": "电子邮件地址",
|
||||
"components.UserList.edituser": "编辑用户权限",
|
||||
"components.UserList.displayName": "显示名称",
|
||||
"components.UserList.deleteuser": "刪除 {username}",
|
||||
"components.UserList.deleteuser": "刪除用户",
|
||||
"components.UserList.deleteconfirm": "确定要刪除这个用户吗?此用户的所有储存资料将被清除。",
|
||||
"components.UserList.creating": "创建中…",
|
||||
"components.UserList.createlocaluser": "建立本地用户",
|
||||
@@ -159,7 +159,7 @@
|
||||
"components.Settings.csrfProtection": "防止跨站请求伪造(CSRF)攻击",
|
||||
"components.Settings.copied": "应用程序密钥已复制到剪贴板。",
|
||||
"components.Settings.cancelscan": "取消扫描",
|
||||
"components.Settings.cacheImagesTip": "把所有的图像优化和保存到缓存(需要大量的磁碟空间)",
|
||||
"components.Settings.cacheImagesTip": "缓存并提供优化的图像(需要大量磁盘空间)",
|
||||
"components.Settings.cacheImages": "启用图像緩存",
|
||||
"components.Settings.applicationurl": "应用程序网址(URL)",
|
||||
"components.Settings.applicationTitle": "应用程序名",
|
||||
@@ -291,7 +291,6 @@
|
||||
"components.Discover.recentlyAdded": "最新添加",
|
||||
"components.Discover.populartv": "热门电视节目",
|
||||
"components.Discover.popularmovies": "热门电影",
|
||||
"components.Discover.noRequests": "没有请求。",
|
||||
"components.Discover.discovertv": "热门电视节目",
|
||||
"components.Discover.discovermovies": "热门电影",
|
||||
"components.Discover.discover": "探索",
|
||||
@@ -311,7 +310,7 @@
|
||||
"components.CollectionDetails.requestcollection": "提交系列请求",
|
||||
"components.CollectionDetails.overview": "简介",
|
||||
"components.CollectionDetails.numberofmovies": "{count} 部电影",
|
||||
"components.AppDataWarning.dockerVolumeMissingDescription": "必须使用繫結掛载(bind mount)指定某个宿主机器的资料夹跟容器內的 <code>{appDataPath}</code> 资料夹連通,才能保存 Overseerr 的配置和数据。",
|
||||
"components.AppDataWarning.dockerVolumeMissingDescription": "必须使用链接挂载(bind mount)指定某个宿主机器的文件夹跟容器内的 <code>{appDataPath}</code> 文件夹连通,才能保存 Overseerr 的配置和数据。",
|
||||
"components.PersonDetails.ascharacter": "饰演 {character}",
|
||||
"pages.somethingwentwrong": "出了点问题",
|
||||
"pages.serviceunavailable": "服务器无法使用",
|
||||
@@ -373,7 +372,6 @@
|
||||
"components.UserProfile.requestsperdays": "剩余 {limit}",
|
||||
"components.UserProfile.recentrequests": "最新请求",
|
||||
"components.UserProfile.pastdays": "{type}(前 {days} 天)",
|
||||
"components.UserProfile.norequests": "没有请求。",
|
||||
"components.UserProfile.movierequests": "电影请求",
|
||||
"components.UserProfile.limit": "{limit} 之 {remaining}",
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "你无权编辑此用户的设置。",
|
||||
@@ -700,7 +698,6 @@
|
||||
"components.RequestModal.selectseason": "季数选择",
|
||||
"components.RequestModal.seasonnumber": "第 {number} 季",
|
||||
"components.RequestModal.season": "季数",
|
||||
"components.RequestModal.requesttitle": "为 {title} 提交请求",
|
||||
"components.RequestModal.requestseasons": "提交请求",
|
||||
"components.RequestModal.requestfrom": "{username} 的请求待处理。",
|
||||
"components.RequestModal.requesterror": "提交请求中出了点问题。",
|
||||
@@ -709,10 +706,9 @@
|
||||
"components.RequestModal.requestadmin": "此请求将自动被批准。",
|
||||
"components.RequestModal.requestSuccess": "为 <strong>{title}</strong> 提交请求成功!",
|
||||
"components.RequestModal.requestCancel": "<strong>{title}</strong> 的请求已被取消。",
|
||||
"components.RequestModal.request4ktitle": "为 {title} 提交 4K 请求",
|
||||
"components.RequestModal.pendingrequest": "{title} 的请求",
|
||||
"components.RequestModal.pendingrequest": "待处理请求",
|
||||
"components.RequestModal.pendingapproval": "你的请求正在等待管理员批准。",
|
||||
"components.RequestModal.pending4krequest": "{title} 的 4K 请求",
|
||||
"components.RequestModal.pending4krequest": "待处理的 4K 请求",
|
||||
"components.RequestModal.numberofepisodes": "集数",
|
||||
"components.RequestModal.extras": "特輯",
|
||||
"components.RequestModal.errorediting": "编辑请求中出了点问题。",
|
||||
@@ -720,8 +716,7 @@
|
||||
"components.RequestModal.cancel": "取消请求",
|
||||
"components.RequestModal.autoapproval": "自动批准",
|
||||
"components.RequestModal.alreadyrequested": "已经有请求",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "无法自动配對你的请求。请从以下列表中选择正确的媒体项。",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "没有简介。",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "我们无法自动匹配这个连续剧。请选择下方正确的匹配。",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "个季数",
|
||||
"components.RequestModal.QuotaDisplay.season": "电视节目季数",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "此用户的电视节目请求数量必须至少剩余 <strong>{seasons}</strong> 个季数才能为此节目提交请求。",
|
||||
@@ -926,7 +921,6 @@
|
||||
"components.IssueList.sortModified": "最后修改",
|
||||
"components.IssueModal.CreateIssueModal.allepisodes": "所有集数",
|
||||
"components.IssueModal.CreateIssueModal.allseasons": "所有季数",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "{title} 有问题么?",
|
||||
"components.IssueModal.CreateIssueModal.submitissue": "提交问题",
|
||||
"components.IssueModal.CreateIssueModal.toastFailedCreate": "提交问题报告时出了点问题。",
|
||||
"components.IssueModal.CreateIssueModal.toastSuccessCreate": "成功为 <strong>{title}</strong> 报告问题!",
|
||||
@@ -992,7 +986,7 @@
|
||||
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "频道标签",
|
||||
"components.Settings.RadarrModal.announced": "已公布",
|
||||
"components.Settings.RadarrModal.released": "已发布",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "频率",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "新频率",
|
||||
"components.Settings.externalUrl": "外部网址",
|
||||
"components.Settings.tautulliApiKey": "API Key",
|
||||
"components.Settings.toastTautulliSettingsFailure": "保存 Tautulli 设置时出现问题。",
|
||||
@@ -1037,5 +1031,42 @@
|
||||
"i18n.import": "导入",
|
||||
"i18n.importing": "导入中…",
|
||||
"components.RequestBlock.languageprofile": "语言配置文件",
|
||||
"components.TitleCard.mediaerror": "未找到{mediaType}"
|
||||
"components.TitleCard.mediaerror": "未找到{mediaType}",
|
||||
"components.MovieDetails.digitalrelease": "数字发行",
|
||||
"components.MovieDetails.physicalrelease": "物理释放",
|
||||
"components.MovieDetails.theatricalrelease": "剧场版",
|
||||
"components.PermissionEdit.viewrecent": "查看最近添加的内容",
|
||||
"components.PermissionEdit.viewrecentDescription": "授予查看最近添加的媒体列表的权限。",
|
||||
"components.StatusChecker.appUpdated": "{applicationTitle} 已更新",
|
||||
"components.StatusChecker.restartRequired": "需要重启服务器",
|
||||
"components.StatusChecker.appUpdatedDescription": "请点击下面的按钮,重新加载应用程序。",
|
||||
"components.StatusChecker.reloadApp": "重新加载 {applicationTitle}",
|
||||
"i18n.restartRequired": "需要重新启动",
|
||||
"components.Settings.deleteServer": "删除 {serverType} 服务器",
|
||||
"components.StatusChecker.restartRequiredDescription": "请重新启动服务器以应用更新的设置。",
|
||||
"components.RequestList.RequestItem.tmdbid": "TMDB ID",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex 关注列表",
|
||||
"components.MovieDetails.managemovie": "管理电影",
|
||||
"components.MovieDetails.reportissue": "报告问题",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "自动提交的请求",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "授权查看其他用户的Plex关注列表。",
|
||||
"components.RequestList.RequestItem.tvdbid": "TheTVDB ID",
|
||||
"components.Settings.advancedTooltip": "错误配置此设置可能会导致功能不可用",
|
||||
"components.Settings.experimentalTooltip": "启用此设置可能会导致意外的应用程序行为",
|
||||
"components.TvDetails.reportissue": "报告问题",
|
||||
"components.RequestCard.tmdbid": "TMDB ID",
|
||||
"components.Settings.SettingsLogs.viewdetails": "查看详情",
|
||||
"components.Layout.UserDropdown.requests": "请求",
|
||||
"components.Settings.restartrequiredTooltip": "必须重新启动 Overseerr 才能使更改的设置生效",
|
||||
"components.TvDetails.manageseries": "管理电视节目",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "自动请求您的 <PlexWatchlistSupportLink>Plex 关注列表</PlexWatchlistSupportLink>的媒体",
|
||||
"components.AirDateBadge.airedrelative": "播出{relativeTime}",
|
||||
"components.AirDateBadge.airsrelative": "播出{relativeTime}",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "电影请求",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "电视节目请求",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "当 Plex 关注列表中的项目自动提交新媒体请求时,会收到通知。",
|
||||
"components.PermissionEdit.viewwatchlists": "查看 Plex 关注列表",
|
||||
"components.TvDetails.Season.somethingwentwrong": "在检索季元数据时出了问题。",
|
||||
"components.UserProfile.plexwatchlist": "Plex 关注列表",
|
||||
"components.RequestCard.tvdbid": "TheTVDB ID"
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
"components.UserList.creating": "創建中…",
|
||||
"components.UserList.createlocaluser": "建立本地使用者",
|
||||
"components.UserList.autogeneratepassword": "自動生成密碼",
|
||||
"i18n.tvshows": "電視節目",
|
||||
"i18n.tvshows": "影集",
|
||||
"pages.oops": "哎呀",
|
||||
"components.TvDetails.firstAirDate": "原始播出日期",
|
||||
"i18n.delete": "刪除",
|
||||
@@ -133,17 +133,17 @@
|
||||
"components.Layout.Sidebar.users": "使用者",
|
||||
"components.Layout.Sidebar.settings": "設定",
|
||||
"components.Layout.Sidebar.requests": "請求",
|
||||
"components.Layout.SearchInput.searchPlaceholder": "搜尋電影、電視節目、人物…",
|
||||
"components.Layout.SearchInput.searchPlaceholder": "搜尋電影、影集、人物…",
|
||||
"components.Discover.upcomingmovies": "即將上映的電影",
|
||||
"components.Discover.upcoming": "即將上映的電影",
|
||||
"components.Discover.trending": "趨勢",
|
||||
"components.Discover.recentlyAdded": "最近新增",
|
||||
"components.Discover.recentrequests": "最新請求",
|
||||
"components.Discover.populartv": "熱門電視節目",
|
||||
"components.Discover.populartv": "熱門影集",
|
||||
"components.Discover.popularmovies": "熱門電影",
|
||||
"components.Discover.discovertv": "熱門電視節目",
|
||||
"components.Discover.discovertv": "熱門影集",
|
||||
"components.Discover.discovermovies": "熱門電影",
|
||||
"components.CollectionDetails.requestcollection": "提出系列請求",
|
||||
"components.CollectionDetails.requestcollection": "提出電影系列請求",
|
||||
"components.CollectionDetails.overview": "概要",
|
||||
"components.UserList.userdeleteerror": "刪除使用者時出了點問題。",
|
||||
"components.UserList.userdeleted": "使用者刪除成功!",
|
||||
@@ -153,7 +153,7 @@
|
||||
"components.UserList.totalrequests": "請求數",
|
||||
"components.UserList.plexuser": "Plex 使用者",
|
||||
"components.UserList.email": "電子郵件地址",
|
||||
"components.UserList.deleteuser": "刪除 {username}",
|
||||
"components.UserList.deleteuser": "刪除使用者",
|
||||
"components.UserList.role": "角色",
|
||||
"components.UserList.password": "密碼",
|
||||
"i18n.movies": "電影",
|
||||
@@ -220,7 +220,7 @@
|
||||
"components.Settings.Notifications.NotificationsWebhook.resetPayloadSuccess": "JSON 有效負載重設為預設負載成功!",
|
||||
"components.Settings.Notifications.NotificationsPushover.validationUserTokenRequired": "請輸入有效的使用者或群組令牌",
|
||||
"components.Settings.menuJobs": "作業和快取",
|
||||
"components.Settings.toastApiKeyFailure": "生成應用程式密鑰出了點問題。",
|
||||
"components.Settings.toastApiKeyFailure": "生成應用程式密鑰時出了點問題。",
|
||||
"components.Settings.toastSettingsFailure": "儲存設定時出了點問題。",
|
||||
"components.UserList.deleteconfirm": "確定要刪除這個使用者嗎?此使用者的所有儲存資料將被清除。",
|
||||
"components.Settings.SettingsAbout.Releases.releasedataMissing": "無法獲取軟體版本資料。",
|
||||
@@ -246,25 +246,23 @@
|
||||
"components.Settings.SettingsAbout.Releases.currentversion": "目前的版本",
|
||||
"components.Settings.SettingsAbout.timezone": "時區",
|
||||
"components.Settings.SettingsAbout.documentation": "使用說明",
|
||||
"components.RequestModal.pending4krequest": "{title} 的 4K 請求",
|
||||
"components.RequestModal.pendingrequest": "{title} 的請求",
|
||||
"components.RequestModal.pending4krequest": "待處理的 4K 請求",
|
||||
"components.RequestModal.pendingrequest": "待處理的請求",
|
||||
"components.RequestModal.extras": "特輯",
|
||||
"components.Settings.SettingsAbout.Releases.versionChangelog": "{version} 變更日誌",
|
||||
"components.Settings.SettingsAbout.Releases.releases": "軟體版本",
|
||||
"components.Settings.plexsettings": "Plex 設定",
|
||||
"components.RequestModal.selectseason": "請選擇季數",
|
||||
"components.RequestModal.requesttitle": "為 {title} 提出請求",
|
||||
"components.RequestModal.requestseasons": "提出請求",
|
||||
"components.RequestModal.requestadmin": "此請求將自動獲批准。",
|
||||
"components.RequestModal.requestSuccess": "為 <strong>{title}</strong> 提出請求成功!",
|
||||
"components.RequestModal.requestCancel": "<strong>{title}</strong> 的請求已被取消。",
|
||||
"components.RequestModal.request4ktitle": "為 {title} 提出 4K 請求",
|
||||
"components.PersonDetails.appearsin": "演出",
|
||||
"components.PersonDetails.ascharacter": "飾演 {character}",
|
||||
"components.TvDetails.overviewunavailable": "沒有概要。",
|
||||
"components.MovieDetails.overviewunavailable": "沒有概要。",
|
||||
"components.TvDetails.watchtrailer": "觀看預告片",
|
||||
"components.TvDetails.showtype": "節目類型",
|
||||
"components.TvDetails.showtype": "影集類型",
|
||||
"components.TvDetails.similar": "類似",
|
||||
"components.RequestModal.requestfrom": "{username} 的請求待處理。",
|
||||
"components.Settings.toastApiKeySuccess": "生成新應用程式密鑰成功!",
|
||||
@@ -308,7 +306,7 @@
|
||||
"components.Settings.RadarrModal.add": "新增伺服器",
|
||||
"components.RequestModal.requestcancelled": "<strong>{title}</strong> 的請求已被取消。",
|
||||
"components.RequestModal.AdvancedRequester.qualityprofile": "品質設定",
|
||||
"components.RequestModal.AdvancedRequester.animenote": "※這是個動漫節目。",
|
||||
"components.RequestModal.AdvancedRequester.animenote": "※這是個動漫影集。",
|
||||
"components.RequestModal.AdvancedRequester.advancedoptions": "進階選項",
|
||||
"components.RequestModal.AdvancedRequester.default": "{name}(預設)",
|
||||
"components.RequestModal.AdvancedRequester.destinationserver": "目標伺服器",
|
||||
@@ -323,7 +321,7 @@
|
||||
"components.Settings.SonarrModal.toastSonarrTestFailure": "Sonarr 伺服器連線失敗。",
|
||||
"components.Settings.serverpreset": "伺服器",
|
||||
"components.RequestModal.autoapproval": "自動批准",
|
||||
"components.PermissionEdit.autoapproveSeries": "電視節目自動批准",
|
||||
"components.PermissionEdit.autoapproveSeries": "影集自動批准",
|
||||
"components.PermissionEdit.autoapproveMovies": "電影自動批准",
|
||||
"components.PermissionEdit.autoapprove": "自動批准",
|
||||
"components.PermissionEdit.admin": "管理員",
|
||||
@@ -332,7 +330,7 @@
|
||||
"components.Settings.serverpresetRefreshing": "載入中…",
|
||||
"components.Settings.SonarrModal.syncEnabled": "啟用掃描",
|
||||
"components.UserList.userssaved": "使用者權限儲存成功!",
|
||||
"components.Settings.hideAvailable": "隱藏可觀看的電影和電視節目",
|
||||
"components.Settings.hideAvailable": "隱藏可觀看的電影和影集",
|
||||
"components.Settings.SonarrModal.externalUrl": "外部網址",
|
||||
"components.Settings.RadarrModal.externalUrl": "外部網址",
|
||||
"components.Settings.csrfProtection": "防止跨站請求偽造(CSRF)攻擊",
|
||||
@@ -355,7 +353,7 @@
|
||||
"components.PlexLoginButton.signinwithplex": "登入",
|
||||
"components.PlexLoginButton.signingin": "登入中…",
|
||||
"components.PermissionEdit.users": "管理使用者",
|
||||
"components.PermissionEdit.request4kTv": "提出 4K 電視節目請求",
|
||||
"components.PermissionEdit.request4kTv": "提出 4K 影集請求",
|
||||
"components.PermissionEdit.request4kMovies": "提出 4K 電影請求",
|
||||
"components.PermissionEdit.request4k": "提出 4K 請求",
|
||||
"components.PermissionEdit.request": "提出請求",
|
||||
@@ -434,7 +432,7 @@
|
||||
"components.NotificationTypeSelector.mediadeclinedDescription": "當請求拒被絕時發送通知。",
|
||||
"components.PermissionEdit.request4kDescription": "授予提出 4K 媒體請求的權限。",
|
||||
"components.PermissionEdit.request4kMoviesDescription": "授予提出 4K 電影請求的權限。",
|
||||
"components.PermissionEdit.request4kTvDescription": "授予提出 4K 電視節目請求的權限。",
|
||||
"components.PermissionEdit.request4kTvDescription": "授予提出 4K 影集請求的權限。",
|
||||
"components.PermissionEdit.requestDescription": "授予提出非 4K 媒體請求的權限。",
|
||||
"components.PermissionEdit.viewrequestsDescription": "授予查看其他使用者提出的媒體請求的權限。",
|
||||
"components.Settings.SonarrModal.validationLanguageProfileRequired": "請設定語言",
|
||||
@@ -445,7 +443,7 @@
|
||||
"components.Settings.SonarrModal.animelanguageprofile": "動漫語言設定",
|
||||
"components.RequestModal.AdvancedRequester.languageprofile": "語言設定",
|
||||
"components.PermissionEdit.usersDescription": "授予管理使用者的權限。有此權限的使用者不能編輯管理員或授予管理員權限。",
|
||||
"components.PermissionEdit.autoapproveSeriesDescription": "自動批准非 4K 電視節目請求。",
|
||||
"components.PermissionEdit.autoapproveSeriesDescription": "自動批准非 4K 影集請求。",
|
||||
"components.PermissionEdit.autoapproveMoviesDescription": "自動批准非 4K 電影請求。",
|
||||
"components.PermissionEdit.autoapproveDescription": "自動批准所有非 4K 媒體請求。",
|
||||
"components.PermissionEdit.advancedrequestDescription": "授予使用進階媒體請求選項的權限。",
|
||||
@@ -458,8 +456,8 @@
|
||||
"components.UserList.sortCreated": "加入日期",
|
||||
"components.UserList.sortDisplayName": "顯示名稱",
|
||||
"components.UserList.sortRequests": "請求數",
|
||||
"components.PermissionEdit.autoapprove4kSeriesDescription": "自動批准 4K 電視節目請求。",
|
||||
"components.PermissionEdit.autoapprove4kSeries": "4K 電視節目自動批准",
|
||||
"components.PermissionEdit.autoapprove4kSeriesDescription": "自動批准 4K 影集請求。",
|
||||
"components.PermissionEdit.autoapprove4kSeries": "4K 影集自動批准",
|
||||
"components.PermissionEdit.autoapprove4kMoviesDescription": "自動批准 4K 電影請求。",
|
||||
"components.PermissionEdit.autoapprove4kMovies": "4K 電影自動批准",
|
||||
"components.PermissionEdit.autoapprove4kDescription": "自動批准所有 4K 媒體請求。",
|
||||
@@ -501,12 +499,11 @@
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.validationCurrentPassword": "請輸入當前的密碼",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.validationNewPassword": "請輸入新密碼",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsSuccess": "密碼設定成功!",
|
||||
"components.RequestModal.SearchByNameModal.nosummary": "沒有概要。",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.validationDiscordId": "請輸入有效的使用者 ID",
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.discordIdTip": "您的<FindDiscordIdLink>使用者 ID 號碼</FindDiscordIdLink>",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.toastSettingsFailure": "重設密碼時出了點問題。",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "無法自動配對您的請求。請從以下列表中選擇正確的媒體項。",
|
||||
"components.CollectionDetails.requestcollection4k": "提出 4K 系列請求",
|
||||
"components.RequestModal.SearchByNameModal.notvdbiddescription": "無法自動配對此影集的數據。 請在以下選擇正確的媒體項。",
|
||||
"components.CollectionDetails.requestcollection4k": "提出 4K 電影系列請求",
|
||||
"components.Settings.trustProxyTip": "使用代理伺服器時,允許 Overseerr 註冊客戶端的正確 IP 位址",
|
||||
"components.Settings.csrfProtectionTip": "設定外部訪問權限為只讀(需要 HTTPS)",
|
||||
"components.ResetPassword.requestresetlinksuccessmessage": "通過電子郵件發送了密碼重設鏈接。",
|
||||
@@ -516,7 +513,7 @@
|
||||
"components.Settings.region": "「探索」地區",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguage": "「探索」語言",
|
||||
"components.Settings.originallanguage": "「探索」語言",
|
||||
"components.Discover.upcomingtv": "即將上映的電視節目",
|
||||
"components.Discover.upcomingtv": "即將上映的影集",
|
||||
"components.Settings.webhook": "Webhook",
|
||||
"components.Settings.email": "電子郵件",
|
||||
"components.Settings.generalsettingsDescription": "Overseerr 的全域和預設設定。",
|
||||
@@ -543,8 +540,8 @@
|
||||
"components.Settings.SettingsJobsCache.download-sync": "下載狀態同步",
|
||||
"components.Settings.SettingsJobsCache.unknownJob": "未知作業",
|
||||
"components.TvDetails.seasons": "{seasonCount} 季",
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre}電視節目",
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "{network} 電視節目",
|
||||
"components.Discover.DiscoverTvGenre.genreSeries": "{genre}影集",
|
||||
"components.Discover.DiscoverNetwork.networkSeries": "{network} 影集",
|
||||
"components.Discover.DiscoverStudio.studioMovies": "{studio} 電影",
|
||||
"components.Discover.DiscoverMovieGenre.genreMovies": "{genre}電影",
|
||||
"i18n.loading": "載入中…",
|
||||
@@ -568,7 +565,7 @@
|
||||
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr 掃描",
|
||||
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Plex 最近新增掃描",
|
||||
"components.Settings.SettingsJobsCache.plex-full-scan": "Plex 媒體庫掃描",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "{language}電視節目",
|
||||
"components.Discover.DiscoverTvLanguage.languageSeries": "{language}影集",
|
||||
"components.Discover.DiscoverMovieLanguage.languageMovies": "{language}電影",
|
||||
"components.UserProfile.ProfileHeader.userid": "使用者 ID:{userid}",
|
||||
"components.UserProfile.ProfileHeader.joindate": "加入日期:{joindate}",
|
||||
@@ -585,17 +582,16 @@
|
||||
"components.UserProfile.UserSettings.unauthorizedDescription": "您無權編輯此使用者的設定。",
|
||||
"components.Settings.Notifications.pgpPrivateKeyTip": "使用 <OpenPgpLink>OpenPGP</OpenPgpLink> 電子郵件加密與簽章",
|
||||
"components.Settings.Notifications.pgpPasswordTip": "使用 <OpenPgpLink>OpenPGP</OpenPgpLink> 電子郵件加密與簽章",
|
||||
"components.UserProfile.norequests": "沒有請求。",
|
||||
"components.Settings.Notifications.pgpPassword": "PGP 解密密碼",
|
||||
"components.Settings.Notifications.pgpPrivateKey": "PGP 私鑰",
|
||||
"components.TvDetails.episodeRuntime": "劇集片長",
|
||||
"components.TvDetails.episodeRuntimeMinutes": "{runtime} 分鐘",
|
||||
"components.RequestModal.AdvancedRequester.folder": "{path}({space})",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "電視節目類型",
|
||||
"components.Discover.TvGenreSlider.tvgenres": "影集類型",
|
||||
"components.Discover.MovieGenreSlider.moviegenres": "電影類型",
|
||||
"components.Discover.MovieGenreList.moviegenres": "電影類型",
|
||||
"components.Discover.TvGenreList.seriesgenres": "電視節目類型",
|
||||
"components.Settings.partialRequestsEnabled": "允許不完整的電視節目請求",
|
||||
"components.Discover.TvGenreList.seriesgenres": "影集類型",
|
||||
"components.Settings.partialRequestsEnabled": "允許不完整的影集請求",
|
||||
"components.RequestModal.alreadyrequested": "已經有請求",
|
||||
"components.Settings.SettingsLogs.time": "時間戳",
|
||||
"components.Settings.SettingsLogs.resumeLogs": "恢復",
|
||||
@@ -627,9 +623,9 @@
|
||||
"components.Settings.SettingsLogs.message": "訊息",
|
||||
"components.Settings.SettingsJobsCache.jobsandcache": "作業和快取",
|
||||
"components.Settings.SettingsAbout.about": "關於 Overseerr",
|
||||
"components.Settings.cacheImages": "啟用圖像緩存",
|
||||
"components.Settings.cacheImages": "啟用圖像檔案快取",
|
||||
"components.Settings.SettingsLogs.logsDescription": "您也能直接查看 <code>stdout</code> 數據流或位置於 <code>{appDataPath}/logs/overseerr.log</code> 的日誌檔案。",
|
||||
"components.Settings.cacheImagesTip": "把所有的圖像優化和儲存到快取記憶體(需要大量的磁碟空間)",
|
||||
"components.Settings.cacheImagesTip": "處理和提供優化的圖像檔案(需要大量的磁碟空間)",
|
||||
"components.Settings.SettingsLogs.logDetails": "日誌詳細信息",
|
||||
"components.Settings.SettingsLogs.extraData": "附加數據",
|
||||
"components.Settings.SettingsLogs.copyToClipboard": "複製到剪貼板",
|
||||
@@ -640,16 +636,16 @@
|
||||
"components.PersonDetails.lifespan": "{birthdate}-{deathdate}",
|
||||
"components.PersonDetails.alsoknownas": "別名:{names}",
|
||||
"i18n.delimitedlist": "{a}、{b}",
|
||||
"components.Settings.SettingsUsers.tvRequestLimitLabel": "電視節目請求全域限制",
|
||||
"components.Settings.SettingsUsers.tvRequestLimitLabel": "影集請求全域限制",
|
||||
"components.Settings.SettingsUsers.movieRequestLimitLabel": "電影請求全域限制",
|
||||
"components.RequestModal.QuotaDisplay.seasonlimit": "季數",
|
||||
"components.RequestModal.QuotaDisplay.season": "電視節目季數",
|
||||
"components.RequestModal.QuotaDisplay.season": "影集季數",
|
||||
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {電影請求剩餘數不足} other {剩餘 <strong>#</strong> 個{type}請求}}",
|
||||
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "請求剩餘數不足",
|
||||
"components.RequestModal.QuotaDisplay.movielimit": "電影",
|
||||
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "此使用者每 <strong>{days}</strong> 天能提出 <strong>{limit}</strong> 個{type}請求。",
|
||||
"components.RequestModal.QuotaDisplay.allowedRequests": "您每 <strong>{days}</strong> 天能提出 <strong>{limit}</strong> 個{type}請求。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.seriesrequestlimit": "電視節目請求限制",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.seriesrequestlimit": "影集請求限制",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.movierequestlimit": "電影請求限制",
|
||||
"components.UserProfile.movierequests": "電影請求",
|
||||
"components.UserProfile.limit": "{limit} 之 {remaining}",
|
||||
@@ -660,9 +656,9 @@
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.enableOverride": "覆寫全域限制",
|
||||
"components.UserProfile.unlimited": "無限",
|
||||
"components.UserProfile.totalrequests": "請求總數",
|
||||
"components.UserProfile.seriesrequest": "電視節目請求",
|
||||
"components.UserProfile.seriesrequest": "影集請求",
|
||||
"i18n.view": "檢視",
|
||||
"i18n.tvshow": "電視節目",
|
||||
"i18n.tvshow": "影集",
|
||||
"i18n.testing": "測試中…",
|
||||
"i18n.test": "測試",
|
||||
"i18n.status": "狀態",
|
||||
@@ -681,8 +677,8 @@
|
||||
"i18n.back": "返回",
|
||||
"i18n.all": "所有",
|
||||
"i18n.areyousure": "確定嗎?",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "此使用者的電視節目請求數量必須至少剩餘 <strong>{seasons}</strong> 個季數才能提出此節目請求。",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "您的電視節目請求數量必須至少剩餘 <strong>{seasons}</strong> 個季數才能提出此節目請求。",
|
||||
"components.RequestModal.QuotaDisplay.requiredquotaUser": "此使用者的影集請求數量必須至少剩餘 <strong>{seasons}</strong> 個季數才能提出此影集請求。",
|
||||
"components.RequestModal.QuotaDisplay.requiredquota": "您的影集請求數量必須至少剩餘 <strong>{seasons}</strong> 個季數才能提出此影集請求。",
|
||||
"components.TvDetails.originaltitle": "原始標題",
|
||||
"components.MovieDetails.originaltitle": "原始標題",
|
||||
"components.RequestModal.QuotaDisplay.quotaLinkUser": "訪問此使用者的<ProfileLink>個人資料頁面</ProfileLink>以查看使用者的請求限制 。",
|
||||
@@ -729,7 +725,6 @@
|
||||
"components.UserProfile.UserSettings.UserNotificationSettings.pgpPublicKey": "PGP 公鑰",
|
||||
"components.RequestList.RequestItem.cancelRequest": "取消請求",
|
||||
"components.NotificationTypeSelector.notificationTypes": "通知類型",
|
||||
"components.Discover.noRequests": "沒有請求。",
|
||||
"components.Layout.VersionStatus.commitsbehind": "落後 {commitsBehind} 個提交",
|
||||
"components.Layout.VersionStatus.outofdate": "非最新版本",
|
||||
"components.Layout.VersionStatus.streamstable": "Overseerr 穩定版",
|
||||
@@ -739,7 +734,7 @@
|
||||
"components.Settings.noDefaultNon4kServer": "如果您只有一個 {serverType} 伺服器,請勿把它設定為 4K 伺服器。",
|
||||
"components.Settings.noDefaultServer": "您必須至少指定一個預設 {serverType} 伺服器,才能處理{mediaType}請求。",
|
||||
"components.Settings.serviceSettingsDescription": "關於 {serverType} 伺服器的設定。{serverType} 伺服器數沒有最大值限制,但您只能指定兩個預設伺服器(一個非 4K、一個 4K)。",
|
||||
"components.Settings.mediaTypeSeries": "電視節目",
|
||||
"components.Settings.mediaTypeSeries": "影集",
|
||||
"components.Settings.mediaTypeMovie": "電影",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "此使用者的帳戶目前沒有設密碼。若在以下設定密碼,此使用者就能使用「本地登入」。",
|
||||
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "您的帳戶目前沒有設密碼。若在以下設定密碼,您就能使用「本地登入」。",
|
||||
@@ -797,10 +792,10 @@
|
||||
"components.Settings.Notifications.NotificationsWebhook.toastWebhookTestSuccess": "Webhook 測試通知已發送!",
|
||||
"components.Settings.SettingsUsers.newPlexLoginTip": "讓還沒匯入的 Plex 使用者登入",
|
||||
"components.Settings.SettingsUsers.newPlexLogin": "允許新的 Plex 登入",
|
||||
"components.PermissionEdit.requestTv": "提出電視節目請求",
|
||||
"components.PermissionEdit.requestTv": "提出影集請求",
|
||||
"components.PermissionEdit.requestMovies": "提出電影請求",
|
||||
"components.PermissionEdit.requestMoviesDescription": "授予提出非 4K 電影請求的權限。",
|
||||
"components.PermissionEdit.requestTvDescription": "授予提出非 4K 電視節目請求的權限。",
|
||||
"components.PermissionEdit.requestTvDescription": "授予提出非 4K 影集請求的權限。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "預設設定({language})",
|
||||
"components.Settings.locale": "顯示語言",
|
||||
"components.DownloadBlock.estimatedtime": "預計:{time}",
|
||||
@@ -852,7 +847,7 @@
|
||||
"components.MovieDetails.streamingproviders": "目前的流媒體服務",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedule": "編輯作業",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "每 {jobScheduleHours} 小時",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "頻率",
|
||||
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "新的頻率",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "每 {jobScheduleMinutes} 分鐘",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "儲存作業設定時出了點問題。",
|
||||
"components.Settings.SettingsJobsCache.jobScheduleEditSaved": "作業編輯成功!",
|
||||
@@ -884,16 +879,16 @@
|
||||
"components.ManageSlideOver.manageModalNoRequests": "沒有請求。",
|
||||
"components.ManageSlideOver.openarr": "開啟 {arr} 伺服器",
|
||||
"components.ManageSlideOver.openarr4k": "開啟 4K {arr} 伺服器",
|
||||
"components.ManageSlideOver.movie": "部電影",
|
||||
"components.ManageSlideOver.movie": "電影",
|
||||
"components.ManageSlideOver.markavailable": "標記為可觀看",
|
||||
"components.IssueModal.issueAudio": "音訊",
|
||||
"components.ManageSlideOver.downloadstatus": "下載狀態",
|
||||
"components.IssueModal.CreateIssueModal.allepisodes": "所有集數",
|
||||
"components.ManageSlideOver.manageModalClearMediaWarning": "※這將會刪除包括使用者請求在內所有有關這{mediaType}的資料。如果這{mediaType}存在於您的 Plex 伺服器,資料將會在媒體庫掃描時重新建立。",
|
||||
"components.ManageSlideOver.manageModalClearMediaWarning": "※這將會刪除包括使用者請求在內所有有關此{mediaType}的資料。如果這{mediaType}存在於您的 Plex 伺服器,資料將會在媒體庫掃描時重新建立。",
|
||||
"components.ManageSlideOver.mark4kavailable": "標記 4K 版為可觀看",
|
||||
"components.IssueModal.issueSubtitles": "字幕",
|
||||
"components.IssueModal.issueOther": "其他",
|
||||
"components.ManageSlideOver.tvshow": "個電視節目",
|
||||
"components.ManageSlideOver.tvshow": "影集",
|
||||
"components.ManageSlideOver.manageModalTitle": "管理{mediaType}",
|
||||
"components.IssueModal.issueVideo": "影片",
|
||||
"components.IssueList.IssueItem.issuetype": "類型",
|
||||
@@ -914,7 +909,6 @@
|
||||
"components.IssueDetails.toaststatusupdated": "問題狀態編輯成功!",
|
||||
"components.IssueDetails.toastissuedeletefailed": "刪除問題狀態時出了點問題。",
|
||||
"components.IssueList.IssueItem.openeduserdate": "{user}({date})",
|
||||
"components.IssueModal.CreateIssueModal.issomethingwrong": "{title} 有問題嗎?",
|
||||
"components.IssueModal.CreateIssueModal.providedetail": "請詳細解釋您遇到的問題。",
|
||||
"components.IssueModal.CreateIssueModal.submitissue": "報告問題",
|
||||
"components.IssueModal.CreateIssueModal.toastFailedCreate": "提出問題報告時出了點問題。",
|
||||
@@ -1057,29 +1051,71 @@
|
||||
"components.TitleCard.tmdbid": "TMDB ID",
|
||||
"components.RequestCard.tmdbid": "TMDB ID",
|
||||
"components.RequestList.RequestItem.tvdbid": "TheTVDB ID",
|
||||
"components.Discover.plexwatchlist": "您的 Plex Watchlist",
|
||||
"components.Discover.plexwatchlist": "您的 Plex 關注列表",
|
||||
"components.PermissionEdit.autorequestMovies": "自動提出電影請求",
|
||||
"components.PermissionEdit.autorequestSeries": "自動提出電視節目請求",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex Watchlist 同步",
|
||||
"components.PermissionEdit.autorequestSeries": "自動提出影集請求",
|
||||
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex 關注列表同步",
|
||||
"components.PermissionEdit.autorequest": "自動提出請求",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "您的 Plex Watchlist",
|
||||
"components.Discover.DiscoverWatchlist.discoverwatchlist": "您的 Plex 關注列表",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "自動提出電影請求",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "自動提出電視節目請求",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "自動提出影集請求",
|
||||
"components.NotificationTypeSelector.mediaautorequested": "請求自動提出",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "授予從 Plex Watchlist 中自動提出非 4K 電影請求的權限。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "從您的 <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> 中自動提出電影請求",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "當您的 Plex Watchlist 中的媒體自動提出請求時取得通知。",
|
||||
"components.PermissionEdit.autorequestDescription": "授予從 Plex Watchlist 中自動提出非 4K 媒體請求的權限。",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "授予從 Plex Watchlist 中自動提出非 4K 電視節目請求的權限。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "從您的 <PlexWatchlistSupportLink>Plex Watchlist</PlexWatchlistSupportLink> 中自動提出電視節目請求",
|
||||
"components.PermissionEdit.autorequestMoviesDescription": "授予從 Plex 關注列表中自動提出非 4K 電影請求的權限。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "從您的 <PlexWatchlistSupportLink>Plex 關注列表</PlexWatchlistSupportLink>中自動提出電影請求",
|
||||
"components.NotificationTypeSelector.mediaautorequestedDescription": "當您的 Plex 關注列表中的媒體自動提出請求時取得通知。",
|
||||
"components.PermissionEdit.autorequestDescription": "授予從 Plex 關注列表中自動提出非 4K 媒體請求的權限。",
|
||||
"components.PermissionEdit.autorequestSeriesDescription": "授予從 Plex 關注列表中自動提出非 4K 影集請求的權限。",
|
||||
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "從您的 <PlexWatchlistSupportLink>Plex 關注列表</PlexWatchlistSupportLink>中自動提出影集請求",
|
||||
"components.Settings.SettingsLogs.viewdetails": "查看詳細信息",
|
||||
"components.TvDetails.reportissue": "報告問題",
|
||||
"components.MovieDetails.managemovie": "管理電影",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex Watchlist",
|
||||
"components.UserProfile.plexwatchlist": "Plex Watchlist",
|
||||
"components.Discover.DiscoverWatchlist.watchlist": "Plex 關注列表",
|
||||
"components.UserProfile.plexwatchlist": "Plex 關注列表",
|
||||
"components.MovieDetails.reportissue": "報告問題",
|
||||
"components.PermissionEdit.viewwatchlists": "查看 Plex Watchlists",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "授予查看其他使用者的 Plex Watchlists 的權限。",
|
||||
"components.TvDetails.manageseries": "管理電視節目",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr 必須重新啟動才能應用設定的變更"
|
||||
"components.PermissionEdit.viewwatchlists": "查看 Plex 關注列表",
|
||||
"components.PermissionEdit.viewwatchlistsDescription": "授予查看其他使用者的 Plex 關注列表的權限。",
|
||||
"components.TvDetails.manageseries": "管理影集",
|
||||
"components.Settings.restartrequiredTooltip": "Overseerr 必須重新啟動才能應用設定的變更",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "電影請求",
|
||||
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "影集請求",
|
||||
"components.Layout.UserDropdown.requests": "請求",
|
||||
"components.TvDetails.seasonstitle": "季數",
|
||||
"components.RequestBlock.decline": "拒絕請求",
|
||||
"components.RequestBlock.edit": "編輯請求",
|
||||
"components.RequestBlock.lastmodifiedby": "最後修改者",
|
||||
"components.RequestBlock.requestdate": "請求日期",
|
||||
"components.RequestCard.approverequest": "批准請求",
|
||||
"components.RequestCard.cancelrequest": "取消請求",
|
||||
"components.RequestCard.declinerequest": "拒絕請求",
|
||||
"components.TvDetails.seasonnumber": "第 {seasonNumber} 季",
|
||||
"components.RequestBlock.approve": "批准請求",
|
||||
"components.RequestBlock.delete": "刪除請求",
|
||||
"components.RequestCard.editrequest": "編輯請求",
|
||||
"components.RequestBlock.requestedby": "請求者",
|
||||
"components.StatusBadge.playonplex": "在 Plex 上觀看",
|
||||
"components.StatusBadge.managemedia": "管理{mediaType}",
|
||||
"components.StatusBadge.openinarr": "開啟 {arr} 伺服器",
|
||||
"components.TvDetails.status4k": "4K 版{status}",
|
||||
"components.TvDetails.episodeCount": "{episodeCount} 集",
|
||||
"components.AirDateBadge.airedrelative": "{relativeTime}播出",
|
||||
"components.MovieDetails.rtaudiencescore": "爛番茄觀眾評分",
|
||||
"components.TvDetails.Season.somethingwentwrong": "檢索數據時出了點問題。",
|
||||
"components.TvDetails.tmdbuserscore": "TMDB 使用者評分",
|
||||
"components.TvDetails.rtcriticsscore": "爛番茄專業評分",
|
||||
"components.AirDateBadge.airsrelative": "{relativeTime}播出",
|
||||
"components.MovieDetails.tmdbuserscore": "TMDB 使用者評分",
|
||||
"components.MovieDetails.rtcriticsscore": "爛番茄專業評分",
|
||||
"components.TvDetails.rtaudiencescore": "爛番茄觀眾評分",
|
||||
"components.RequestModal.requestmovietitle": "提出電影請求",
|
||||
"components.RequestModal.requestmovie4ktitle": "提出 4K 電影請求",
|
||||
"components.RequestModal.requestcollection4ktitle": "提出 4K 電影系列請求",
|
||||
"components.RequestModal.requestseriestitle": "提出影集請求",
|
||||
"components.RequestModal.requestseries4ktitle": "提出 4K 影集請求",
|
||||
"components.RequestModal.requestcollectiontitle": "提出電影系列請求",
|
||||
"components.RequestModal.SearchByNameModal.nomatches": "找不到此影集的數據。",
|
||||
"components.UserProfile.emptywatchlist": "您的 <PlexWatchlistSupportLink>Plex 關注列表</PlexWatchlistSupportLink>中的媒體會顯示在這裡。",
|
||||
"components.Discover.emptywatchlist": "您的 <PlexWatchlistSupportLink>Plex 關注列表</PlexWatchlistSupportLink>中的媒體會顯示在這裡。",
|
||||
"components.Settings.advancedTooltip": "錯誤的設定可能會破壞應用程式功能",
|
||||
"components.Settings.experimentalTooltip": "啟用此設定可能會出現意外的應用程式行為",
|
||||
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "目前的頻率"
|
||||
}
|
||||
|
||||
@@ -42,6 +42,8 @@ const loadLocaleData = (locale: AvailableLocale): Promise<any> => {
|
||||
return import('../i18n/locale/es.json');
|
||||
case 'fr':
|
||||
return import('../i18n/locale/fr.json');
|
||||
case 'hr':
|
||||
return import('../i18n/locale/hr.json');
|
||||
case 'hu':
|
||||
return import('../i18n/locale/hu.json');
|
||||
case 'it':
|
||||
|
||||
8
src/pages/profile/requests.tsx
Normal file
8
src/pages/profile/requests.tsx
Normal file
@@ -0,0 +1,8 @@
|
||||
import RequestList from '@app/components/RequestList';
|
||||
import type { NextPage } from 'next';
|
||||
|
||||
const UserRequestsPage: NextPage = () => {
|
||||
return <RequestList />;
|
||||
};
|
||||
|
||||
export default UserRequestsPage;
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
body {
|
||||
@apply bg-gray-900;
|
||||
overscroll-behavior-y: contain;
|
||||
}
|
||||
|
||||
code {
|
||||
@@ -453,3 +454,22 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ptr--ptr {
|
||||
box-shadow: initial !important;
|
||||
position: absolute !important;
|
||||
z-index: 30 !important;
|
||||
}
|
||||
|
||||
.ptr--refresh {
|
||||
overflow: visible !important;
|
||||
z-index: 30 !important;
|
||||
}
|
||||
|
||||
.ptr--pull {
|
||||
z-index: 30 !important;
|
||||
}
|
||||
|
||||
.ptr--box {
|
||||
margin-bottom: -13px !important;
|
||||
}
|
||||
|
||||
22
yarn.lock
22
yarn.lock
@@ -1809,7 +1809,7 @@
|
||||
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb"
|
||||
integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==
|
||||
|
||||
"@headlessui/react@^0.0.0-insiders.b301f04":
|
||||
"@headlessui/react@0.0.0-insiders.b301f04":
|
||||
version "0.0.0-insiders.b301f04"
|
||||
resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-0.0.0-insiders.b301f04.tgz#12f209097f987cddbba72de40240a12648ebe12b"
|
||||
integrity sha512-I+UUEUkdYp+AgKU1teWUZaICEg//OWl0R1UxCB50Jzfi3APu7aSY0Y+ABrgfEWDhBYTG9hNgXvMVTNCnFu49yA==
|
||||
@@ -3047,6 +3047,11 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
|
||||
integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
|
||||
|
||||
"@types/pulltorefreshjs@0.1.5":
|
||||
version "0.1.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/pulltorefreshjs/-/pulltorefreshjs-0.1.5.tgz#f15c9dbc91b8fdd8135093d81ece9e9d4d2324d7"
|
||||
integrity sha512-/VRTgBettvBg1KI8mGnA9oeWs359tTXQ7qsxLuXnksL88jvK6ZNMStG5T9x9vUO9O7jLsgREB0cElz/BWFfdew==
|
||||
|
||||
"@types/qs@*":
|
||||
version "6.9.7"
|
||||
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
|
||||
@@ -4847,6 +4852,11 @@ cron-parser@^3.5.0:
|
||||
is-nan "^1.3.2"
|
||||
luxon "^1.26.0"
|
||||
|
||||
cronstrue@2.11.0:
|
||||
version "2.11.0"
|
||||
resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-2.11.0.tgz#18ff1b95a836b9b4e06854f796db2dc8fa98ce41"
|
||||
integrity sha512-iIBCSis5yqtFYWtJAmNOiwDveFWWIn+8uV5UYuPHYu/Aeu5CSSJepSbaHMyfc+pPFgnsCcGzfPQEo7LSGmWbTg==
|
||||
|
||||
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
@@ -4937,6 +4947,11 @@ csurf@1.11.0:
|
||||
csrf "3.1.0"
|
||||
http-errors "~1.7.3"
|
||||
|
||||
cy-mobile-commands@0.3.0:
|
||||
version "0.3.0"
|
||||
resolved "https://registry.yarnpkg.com/cy-mobile-commands/-/cy-mobile-commands-0.3.0.tgz#2bf242093149154d846b755977da197b4730429e"
|
||||
integrity sha512-Bj5P2ylw88hPqolLu68xWB6euVH5uNt8zyh+Ju8sBukGv39mWZxpjp6LtnUX/LK/YMthwvILYHhvr9SG1TP+4w==
|
||||
|
||||
cypress@10.6.0:
|
||||
version "10.6.0"
|
||||
resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.6.0.tgz#13f46867febf2c3715874ed5dce9c2e946b175fe"
|
||||
@@ -10152,6 +10167,11 @@ pug@3.0.2, pug@^3.0.2:
|
||||
pug-runtime "^3.0.1"
|
||||
pug-strip-comments "^2.0.0"
|
||||
|
||||
pulltorefreshjs@0.1.22:
|
||||
version "0.1.22"
|
||||
resolved "https://registry.yarnpkg.com/pulltorefreshjs/-/pulltorefreshjs-0.1.22.tgz#ddb5e3feee0b2a49fd46e1b18e84fffef2c47ac0"
|
||||
integrity sha512-haxNVEHnS4NCQA7NeG7TSV69z4uqy/N7nfPRuc4dPWe8H6ygUrMjdNeohE+6v0lVVX/ukSjbLYwPUGUYtFKfvQ==
|
||||
|
||||
pump@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
|
||||
|
||||
Reference in New Issue
Block a user