Compare commits

...

22 Commits

Author SHA1 Message Date
Gauthier
dd2c752cf7 fix: redirect the setup page when Jellyseerr is already setup 2024-08-20 17:07:17 +02:00
gauthier-th
dc34d6c1f6 fix: move "scanning in background" tip next to the scanning section 2024-08-19 19:48:58 +02:00
gauthier-th
d868082b56 fix: go back to the last step when refresh the setup page 2024-08-19 19:38:15 +02:00
gauthier-th
e531765dac fix: remove old references to JELLYFIN_TYPE environment variable 2024-08-19 19:24:43 +02:00
gauthier-th
58eb91530b chore: merge develop 2024-08-19 19:23:01 +02:00
Gauthier
80f63017ac fix: handle status badge for season packs (#927)
* fix: handle status badge for season packs

When a series is downloaded with a season pack, the status tooltip displays only the name of the
first episode as a title, and displays a list of all episodes as a description, with the same file
being repeated for each episode. This PR fixes this, using the season number as the tooltip title
and showing only the season pack file currently being downloaded.

* fix: add missing i18n translation
2024-08-19 09:02:52 +05:00
jellyseerr-weblate
0c7e652672 refactor(i18n): merge weblate (#934)
* Added translation using Weblate (Slovenian)

* Translated using Weblate (German)
Currently translated at 93.1% (1216 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/de/

* Translated using Weblate (Slovenian)
Currently translated at 4.1% (54 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/sl/

* Translated using Weblate (Dutch)
Currently translated at 99.4% (1299 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/nl/

* Added translation using Weblate (Turkish)

* Translated using Weblate (Turkish)
Currently translated at 7.2% (95 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/tr/

* Translated using Weblate (German)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/de/

* Translated using Weblate (Romanian)
Currently translated at 33.5% (438 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/ro/

* Translated using Weblate (Russian)
Currently translated at 96.6% (1262 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/ru/

* Translated using Weblate (Russian)
Currently translated at 97.4% (1273 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/ru/

* Translated using Weblate (Russian)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/ru/

* Translated using Weblate (Dutch)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/nl/

* Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/zh_Hans/

* Translated using Weblate (Spanish)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/es/

* Translated using Weblate (French)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/fr/

* Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.0% (1254 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/pt_BR/

* Translated using Weblate (Hebrew)
Currently translated at 15.2% (199 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/he/

* Translated using Weblate (Polish)
Currently translated at 82.6% (1079 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/pl/

* Translated using Weblate (Polish)
Currently translated at 83.9% (1096 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/pl/

* Translated using Weblate (Spanish)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/es/

* Translated using Weblate (Ukrainian)
Currently translated at 93.7% (1225 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/uk/

* Translated using Weblate (Ukrainian)
Currently translated at 94.3% (1232 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/uk/

* Translated using Weblate (Ukrainian)
Currently translated at 94.3% (1232 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/uk/

* Translated using Weblate (Polish)
Currently translated at 84.1% (1099 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/pl/

* Translated using Weblate (Ukrainian)
Currently translated at 99.8% (1304 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/uk/

* Translated using Weblate (Ukrainian)
Currently translated at 99.8% (1304 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/uk/

* Translated using Weblate (Ukrainian)
Currently translated at 99.8% (1304 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/uk/

* Translated using Weblate (Catalan)
Currently translated at 94.1% (1230 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/ca/

* Translated using Weblate (Ukrainian)
Currently translated at 99.8% (1304 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/uk/

* Translated using Weblate (Hebrew)
Currently translated at 23.0% (301 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/he/

* Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/zh_Hans/

* Translated using Weblate (Hebrew)
Currently translated at 26.4% (346 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/he/

* Translated using Weblate (German)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/de/

* Translated using Weblate (Polish)
Currently translated at 94.4% (1233 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/pl/

* Translated using Weblate (Turkish)
Currently translated at 19.2% (252 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/tr/

* Translated using Weblate (Slovenian)
Currently translated at 4.2% (56 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/sl/

* Translated using Weblate (Turkish)
Currently translated at 42.7% (558 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/tr/

* Translated using Weblate (Turkish)
Currently translated at 44.6% (583 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/tr/

* Translated using Weblate (Turkish)
Currently translated at 75.6% (988 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/tr/

* Translated using Weblate (Turkish)
Currently translated at 85.0% (1111 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/tr/

* Translated using Weblate (Turkish)
Currently translated at 100.0% (1306 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/tr/

* Translated using Weblate (Swedish)
Currently translated at 99.7% (1303 of 1306 strings)
Translate-URL: http://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/sv/

* style(i18n): ran prettier

* style(i18n): ran prettier

---------

Co-authored-by: Boštjan KOLAR <civywl@users.noreply.jellyseerr.borgcube.de>
Co-authored-by: Alex F <weblate@xathon.de>
Co-authored-by: Bas <910100490+weblate@proton.me>
Co-authored-by: N/A <me@puffin.icu>
Co-authored-by: Ramon Stohr <ramonstohr@gmail.com>
Co-authored-by: Cosmin Mocan <cosmin_mocan@hotmail.com>
Co-authored-by: Aleksandr <AlexZagric@users.noreply.jellyseerr.borgcube.de>
Co-authored-by: Aleksandr <alexzag2004@gmail.com>
Co-authored-by: Bas Muldder <bas.d.mulder@gmail.com>
Co-authored-by: 宿命 <331874545@qq.com>
Co-authored-by: Eduard Perez Mendez <eduardperezmendez@gmail.com>
Co-authored-by: Quack6765 <weblate@po-mail.com>
Co-authored-by: grayair <grayair@proton.me>
Co-authored-by: osh <osh@osh.cc>
Co-authored-by: uqlel <jellyseer.borgcube.de@uqlel.ovh>
Co-authored-by: Flashk <mevengar@gmail.com>
Co-authored-by: michael <michaelvelosk@gmail.com>
Co-authored-by: A a <arnau2106@gmail.com>
Co-authored-by: Albert Einstien <dbig350@gmail.com>
Co-authored-by: C W <the-eggs@163.com>
Co-authored-by: Nir Israel Hen <nirisraelh@gmail.com>
Co-authored-by: Adrian Konopczynski <adrikonop@anomalie.ga>
Co-authored-by: Wiktor Kowalski <a1opnxgtr@mozmail.com>
Co-authored-by: Jakob Števanec <jakolin98.windowslive@gmail.com>
Co-authored-by: Mattias Magnusson <mattish.91@gmail.com>
Co-authored-by: fallenbagel <98979876+Fallenbagel@users.noreply.github.com>
2024-08-16 23:02:16 +05:00
Gauthier
bd4da6d5fc feat(jellyfinapi): switch to API tokens instead of auth tokens (#868)
* feat(jellyfinapi): create Jellyfin API key from admin user

* fix(jellyfinapi): add migration script for Jellyfin API key

* feat(jellyfinapi): use Jellyfin API key instead of admin auth token

* fix(jellyfinapi): fix api key migration

* feat(jellyfinapi): add API key field to Jellyfin settings

* fix: move the API key field in the Jellyfin settings
2024-08-13 19:01:45 +05:00
Gauthier
12f908de7f fix(tmdb): fallback movie/show overview to English when none is available in requested locale (#928)
This PR adds a second call to TMDB to retried the overview in English if no overview is available in
the requested locale

fix #925
2024-08-13 10:41:59 +02:00
Gauthier
61dcd8e487 fix: update the filter removing existing users from Jellyfin import modal (#924)
Currently import button sometimes shows already imported users and this would break it if an admin
tries to import an already imported user.
2024-08-11 19:25:17 +02:00
Gauthier
9aee8887d3 fix: rewrite request from axios to Fetch (#920) 2024-08-07 14:33:44 +02:00
Joaquin Olivero
2348f23f43 feat: Option on item's page to add/remove from watchlist (#781)
* feat: adds button on the page of a media item to add or remove it from a user's watchlist

re #730

* fix: whitespace and i18n key

* style: fix code format to the required standards

* refactor: change axios for the fetch api

---------

Co-authored-by: JoaquinOlivero <joaquin.olivero@hotmail.com>
2024-08-07 13:46:57 +02:00
Gauthier
74a2d25f15 fix(api): handle non-existent ratings on IMDb (#822) 2024-08-05 14:30:27 +02:00
Fallenbagel
a2c2d261fc docs(windows): add win-node-env instructions to develop build from source (#918) 2024-08-05 17:19:06 +05:00
Fallenbagel
71acfb1b1f docs(windows): add missing win-node-env dependency in the installation steps (#912) 2024-08-05 17:13:22 +05:00
allcontributors[bot]
29a32d0391 docs: add myselfolli as a contributor for code (#917)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-08-05 17:08:21 +05:00
allcontributors[bot]
f7be4789a2 docs: add franciscofsales as a contributor for code (#916)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-08-05 17:07:29 +05:00
allcontributors[bot]
181cb19048 docs: add XDark187 as a contributor for code (#915)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-08-05 17:06:58 +05:00
allcontributors[bot]
32c77f9e94 docs: add mobihen as a contributor for translation (#913)
* docs: update README.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2024-08-05 17:05:26 +05:00
fallenbagel
b43c1e350e chore(codeowners): add gauthier-th as a codeowner 2024-08-05 16:46:08 +05:00
Oliver Laing
64453320d3 feat: show quality profile on request (#847)
* feat: backend fetch and return quality profile

* feat: show request profile name

* fix: wrong backend types

* feat: i18n keys

* fix: don't display quality profile if not set

* fix: remove development artifact

* fix: reduce parent div padding
2024-08-01 14:59:45 +02:00
Gauthier
36d98a2681 fix: add missing parameter to delete requests from ExternalAPI (#904)
fix #903
2024-07-30 00:43:40 +02:00
53 changed files with 4573 additions and 3057 deletions

View File

@@ -403,6 +403,42 @@
"contributions": [
"doc"
]
},
{
"login": "mobihen",
"name": "Nir Israel Hen",
"avatar_url": "https://avatars.githubusercontent.com/u/35529491?v=4",
"profile": "https://mobihen.com",
"contributions": [
"translation"
]
},
{
"login": "XDark187",
"name": "Baraa",
"avatar_url": "https://avatars.githubusercontent.com/u/39034192?v=4",
"profile": "https://github.com/XDark187",
"contributions": [
"code"
]
},
{
"login": "franciscofsales",
"name": "Francisco Sales",
"avatar_url": "https://avatars.githubusercontent.com/u/7977645?v=4",
"profile": "https://github.com/franciscofsales",
"contributions": [
"code"
]
},
{
"login": "myselfolli",
"name": "Oliver Laing",
"avatar_url": "https://avatars.githubusercontent.com/u/37535998?v=4",
"profile": "https://github.com/myselfolli",
"contributions": [
"code"
]
}
]
}

2
.github/CODEOWNERS vendored
View File

@@ -1,2 +1,2 @@
# Global code ownership
* @Fallenbagel
* @Fallenbagel @gauthier-th

View File

@@ -11,7 +11,7 @@
<a href="http://jellyseerr.borgcube.de/engage/jellyseerr/"><img src="http://jellyseerr.borgcube.de/widget/jellyseerr/jellyseerr-frontend/svg-badge.svg" alt="Translation status" /></a>
<a href="https://github.com/fallenbagel/jellyseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/fallenbagel/jellyseerr"></a>
<!-- 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-40-orange.svg"/></a>
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-47-orange.svg"/></a>
<!-- ALL-CONTRIBUTORS-BADGE:END -->
**Jellyseerr** is a free and open source software application for managing requests for your media library.
@@ -137,6 +137,15 @@ Thanks goes to these wonderful people from Overseerr ([emoji key](https://allcon
<td align="center" valign="top" width="14.28%"><a href="https://joaquinolivero.com"><img src="https://avatars.githubusercontent.com/u/66050823?v=4?s=100" width="100px;" alt="Joaquin Olivero"/><br /><sub><b>Joaquin Olivero</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=JoaquinOlivero" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bretterteig"><img src="https://avatars.githubusercontent.com/u/47298401?v=4?s=100" width="100px;" alt="Julian Behr"/><br /><sub><b>Julian Behr</b></sub></a><br /><a href="#translation-Bretterteig" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ThowZzy"><img src="https://avatars.githubusercontent.com/u/61882536?v=4?s=100" width="100px;" alt="ThowZzy"/><br /><sub><b>ThowZzy</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=ThowZzy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://josephrisk.com"><img src="https://avatars.githubusercontent.com/u/18372584?v=4?s=100" width="100px;" alt="Joseph Risk"/><br /><sub><b>Joseph Risk</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=j0srisk" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Loetwiek"><img src="https://avatars.githubusercontent.com/u/79059734?v=4?s=100" width="100px;" alt="Loetwiek"/><br /><sub><b>Loetwiek</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Loetwiek" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fuochi"><img src="https://avatars.githubusercontent.com/u/4720478?v=4?s=100" width="100px;" alt="Fuochi"/><br /><sub><b>Fuochi</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=Fuochi" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mobihen.com"><img src="https://avatars.githubusercontent.com/u/35529491?v=4?s=100" width="100px;" alt="Nir Israel Hen"/><br /><sub><b>Nir Israel Hen</b></sub></a><br /><a href="#translation-mobihen" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XDark187"><img src="https://avatars.githubusercontent.com/u/39034192?v=4?s=100" width="100px;" alt="Baraa"/><br /><sub><b>Baraa</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=XDark187" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/franciscofsales"><img src="https://avatars.githubusercontent.com/u/7977645?v=4?s=100" width="100px;" alt="Francisco Sales"/><br /><sub><b>Francisco Sales</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=franciscofsales" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/myselfolli"><img src="https://avatars.githubusercontent.com/u/37535998?v=4?s=100" width="100px;" alt="Oliver Laing"/><br /><sub><b>Oliver Laing</b></sub></a><br /><a href="https://github.com/Fallenbagel/jellyseerr/commits?author=myselfolli" title="Code">💻</a></td>
</tr>
</tbody>
</table>

View File

@@ -248,6 +248,7 @@ git checkout main
```
3. Install the dependencies:
```powershell
npm install -g win-node-env
set CYPRESS_INSTALL_BINARY=0 && yarn install --frozen-lockfile --network-timeout 1000000
```
4. Build the project:
@@ -272,6 +273,7 @@ git checkout develop # by default, you are on the develop branch so this step is
```
3. Install the dependencies:
```powershell
npm install -g win-node-env
set CYPRESS_INSTALL_BINARY=0 && pnpm install --frozen-lockfile
```
4. Build the project:

View File

@@ -6,10 +6,6 @@ module.exports = {
commitTag: process.env.COMMIT_TAG || 'local',
forceIpv4First: process.env.FORCE_IPV4_FIRST === 'true' ? 'true' : 'false',
},
publicRuntimeConfig: {
// Will be available on both server and client
JELLYFIN_TYPE: process.env.JELLYFIN_TYPE,
},
images: {
remotePatterns: [
{ hostname: 'gravatar.com' },

View File

@@ -85,7 +85,7 @@ class ExternalAPI {
protected async post<T>(
endpoint: string,
data: Record<string, unknown>,
data?: Record<string, unknown>,
params?: Record<string, string>,
ttl?: number,
config?: RequestInit
@@ -107,7 +107,7 @@ class ExternalAPI {
...this.defaultHeaders,
...config?.headers,
},
body: JSON.stringify(data),
body: data ? JSON.stringify(data) : undefined,
});
if (!response.ok) {
const text = await response.text();
@@ -178,6 +178,7 @@ class ExternalAPI {
): Promise<T> {
const url = this.formatUrl(endpoint, params);
const response = await this.fetch(url, {
method: 'DELETE',
...config,
headers: {
...this.defaultHeaders,
@@ -285,7 +286,12 @@ class ExternalAPI {
...this.params,
...params,
});
return `${href}?${searchParams.toString()}`;
return (
href +
(searchParams.toString().length
? '?' + searchParams.toString()
: searchParams.toString())
);
}
private serializeCacheKey(
@@ -313,7 +319,11 @@ class ExternalAPI {
try {
return await response.json();
} catch {
return await response.blob();
try {
return await response.blob();
} catch {
return null;
}
}
}
}

View File

@@ -93,9 +93,7 @@ export interface JellyfinLibraryItemExtended extends JellyfinLibraryItem {
}
class JellyfinAPI extends ExternalAPI {
private authToken?: string;
private userId?: string;
private jellyfinHost: string;
constructor(jellyfinHost: string, authToken?: string, deviceId?: string) {
let authHeaderVal: string;
@@ -114,9 +112,6 @@ class JellyfinAPI extends ExternalAPI {
},
}
);
this.jellyfinHost = jellyfinHost;
this.authToken = authToken;
}
public async login(
@@ -405,6 +400,23 @@ class JellyfinAPI extends ExternalAPI {
throw new ApiError(e.cause?.status, ApiErrorCode.InvalidAuthToken);
}
}
public async createApiToken(appName: string): Promise<string> {
try {
await this.post(`/Auth/Keys?App=${appName}`);
const apiKeys = await this.get<any>(`/Auth/Keys`);
return apiKeys.Items.reverse().find(
(item: any) => item.AppName === appName
).AccessToken;
} catch (e) {
logger.error(
`Something went wrong while creating an API key the Jellyfin server: ${e.message}`,
{ label: 'Jellyfin API' }
);
throw new ApiError(e.response?.status, ApiErrorCode.InvalidAuthToken);
}
}
}
export default JellyfinAPI;

View File

@@ -175,7 +175,11 @@ class IMDBRadarrProxy extends ExternalAPI {
`/movie/imdb/${IMDBid}`
);
if (!data?.length || data[0].ImdbId !== IMDBid) {
if (
!data?.length ||
data[0].ImdbId !== IMDBid ||
!data[0].MovieRatings.Imdb
) {
return null;
}

View File

@@ -63,7 +63,7 @@ app
}
// Load Settings
const settings = getSettings();
const settings = await getSettings().load();
restartFlag.initializeSettings(settings.main);
// Migrate library types

View File

@@ -8,3 +8,16 @@ interface PageInfo {
export interface PaginatedResponse {
pageInfo: PageInfo;
}
/**
* Get the keys of an object that are not functions
*/
type NonFunctionPropertyNames<T> = {
// eslint-disable-next-line @typescript-eslint/ban-types
[K in keyof T]: T[K] extends Function ? never : K;
}[keyof T];
/**
* Get the properties of an object that are not functions
*/
export type NonFunctionProperties<T> = Pick<T, NonFunctionPropertyNames<T>>;

View File

@@ -1,9 +1,9 @@
import type { MediaType } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest';
import type { PaginatedResponse } from './common';
import type { NonFunctionProperties, PaginatedResponse } from './common';
export interface RequestResultsResponse extends PaginatedResponse {
results: MediaRequest[];
results: NonFunctionProperties<MediaRequest>[];
}
export type MediaRequestBody = {
@@ -14,6 +14,7 @@ export type MediaRequestBody = {
is4k?: boolean;
serverId?: number;
profileId?: number;
profileName?: string;
rootFolder?: string;
languageProfileId?: number;
userId?: number;

View File

@@ -63,12 +63,7 @@ class AvailabilitySync {
) {
admin = await userRepository.findOne({
where: { id: 1 },
select: [
'id',
'jellyfinAuthToken',
'jellyfinUserId',
'jellyfinDeviceId',
],
select: ['id', 'jellyfinUserId', 'jellyfinDeviceId'],
order: { id: 'ASC' },
});
}
@@ -86,7 +81,7 @@ class AvailabilitySync {
if (admin) {
this.jellyfinClient = new JellyfinAPI(
getHostname(),
admin.jellyfinAuthToken,
settings.jellyfin.apiKey,
admin.jellyfinDeviceId
);

View File

@@ -20,6 +20,7 @@ export interface DownloadingItem {
timeLeft: string;
estimatedCompletionTime: Date;
title: string;
downloadId: string;
episode?: EpisodeNumberResult;
}
@@ -95,6 +96,7 @@ class DownloadTracker {
status: item.status,
timeLeft: item.timeleft,
title: item.title,
downloadId: item.downloadId,
}));
if (queueItems.length > 0) {
@@ -172,6 +174,7 @@ class DownloadTracker {
timeLeft: item.timeleft,
title: item.title,
episode: item.episode,
downloadId: item.downloadId,
}));
if (queueItems.length > 0) {

View File

@@ -585,12 +585,7 @@ class JellyfinScanner {
const userRepository = getRepository(User);
const admin = await userRepository.findOne({
where: { id: 1 },
select: [
'id',
'jellyfinAuthToken',
'jellyfinUserId',
'jellyfinDeviceId',
],
select: ['id', 'jellyfinUserId', 'jellyfinDeviceId'],
order: { id: 'ASC' },
});
@@ -600,7 +595,7 @@ class JellyfinScanner {
this.jfClient = new JellyfinAPI(
getHostname(),
admin.jellyfinAuthToken,
settings.jellyfin.apiKey,
admin.jellyfinDeviceId
);

View File

@@ -47,6 +47,7 @@ export interface JellyfinSettings {
jellyfinForgotPasswordUrl?: string;
libraries: Library[];
serverId: string;
apiKey: string;
}
export interface TautulliSettings {
hostname?: string;
@@ -342,6 +343,7 @@ class Settings {
jellyfinForgotPasswordUrl: '',
libraries: [],
serverId: '',
apiKey: '',
},
tautulli: {},
radarr: [],
@@ -629,7 +631,7 @@ class Settings {
* @param overrideSettings If passed in, will override all existing settings with these
* values
*/
public load(overrideSettings?: AllSettings): Settings {
public async load(overrideSettings?: AllSettings): Promise<Settings> {
if (overrideSettings) {
this.data = overrideSettings;
return this;
@@ -642,7 +644,7 @@ class Settings {
if (data) {
const parsedJson = JSON.parse(data);
this.data = runMigrations(parsedJson);
this.data = await runMigrations(parsedJson);
this.data = merge(this.data, parsedJson);
@@ -656,7 +658,6 @@ class Settings {
}
}
let loaded = false;
let settings: Settings | undefined;
export const getSettings = (initialSettings?: AllSettings): Settings => {
@@ -664,11 +665,6 @@ export const getSettings = (initialSettings?: AllSettings): Settings => {
settings = new Settings(initialSettings);
}
if (!loaded) {
settings.load();
loaded = true;
}
return settings;
};

View File

@@ -0,0 +1,36 @@
import JellyfinAPI from '@server/api/jellyfin';
import { MediaServerType } from '@server/constants/server';
import { getRepository } from '@server/datasource';
import { User } from '@server/entity/User';
import type { AllSettings } from '@server/lib/settings';
import { getHostname } from '@server/utils/getHostname';
const migrateApiTokens = async (settings: any): Promise<AllSettings> => {
const mediaServerType = settings.main.mediaServerType;
if (
!settings.jellyfin.apiKey &&
(mediaServerType === MediaServerType.JELLYFIN ||
mediaServerType === MediaServerType.EMBY)
) {
const userRepository = getRepository(User);
const admin = await userRepository.findOne({
where: { id: 1 },
select: ['id', 'jellyfinAuthToken', 'jellyfinUserId', 'jellyfinDeviceId'],
order: { id: 'ASC' },
});
if (!admin) {
return settings;
}
const jellyfinClient = new JellyfinAPI(
getHostname(settings.jellyfin),
admin.jellyfinAuthToken,
admin.jellyfinDeviceId
);
jellyfinClient.setUserId(admin.jellyfinUserId ?? '');
const apiKey = await jellyfinClient.createApiToken('Jellyseerr');
settings.jellyfin.apiKey = apiKey;
}
return settings;
};
export default migrateApiTokens;

View File

@@ -1,10 +1,13 @@
import type { AllSettings } from '@server/lib/settings';
import logger from '@server/logger';
import fs from 'fs';
import path from 'path';
const migrationsDir = path.join(__dirname, 'migrations');
export const runMigrations = (settings: AllSettings): AllSettings => {
export const runMigrations = async (
settings: AllSettings
): Promise<AllSettings> => {
const migrations = fs
.readdirSync(migrationsDir)
.filter((file) => file.endsWith('.js') || file.endsWith('.ts'))
@@ -13,8 +16,15 @@ export const runMigrations = (settings: AllSettings): AllSettings => {
let migrated = settings;
for (const migration of migrations) {
migrated = migration(migrated);
try {
for (const migration of migrations) {
migrated = await migration(migrated);
}
} catch (e) {
logger.error(
`Something went wrong while running settings migrations: ${e.message}`,
{ label: 'Settings Migrator' }
);
}
return migrated;

View File

@@ -85,6 +85,7 @@ export interface MovieDetails {
mediaUrl?: string;
watchProviders?: WatchProviders[];
keywords: Keyword[];
onUserWatchlist?: boolean;
}
export const mapProductionCompany = (
@@ -101,7 +102,8 @@ export const mapProductionCompany = (
export const mapMovieDetails = (
movie: TmdbMovieDetails,
media?: Media
media?: Media,
userWatchlist?: boolean
): MovieDetails => ({
id: movie.id,
adult: movie.adult,
@@ -148,4 +150,5 @@ export const mapMovieDetails = (
id: keyword.id,
name: keyword.name,
})),
onUserWatchlist: userWatchlist,
});

View File

@@ -111,6 +111,7 @@ export interface TvDetails {
keywords: Keyword[];
mediaInfo?: Media;
watchProviders?: WatchProviders[];
onUserWatchlist?: boolean;
}
const mapEpisodeResult = (episode: TmdbTvEpisodeResult): Episode => ({
@@ -161,7 +162,8 @@ export const mapNetwork = (network: TmdbNetwork): TvNetwork => ({
export const mapTvDetails = (
show: TmdbTvDetails,
media?: Media
media?: Media,
userWatchlist?: boolean
): TvDetails => ({
createdBy: show.created_by,
episodeRunTime: show.episode_run_time,
@@ -223,4 +225,5 @@ export const mapTvDetails = (
})),
mediaInfo: media,
watchProviders: mapWatchProviders(show['watch/providers']?.results ?? {}),
onUserWatchlist: userWatchlist,
});

View File

@@ -365,6 +365,14 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
throw new Error('select_server_type');
}
// Create an API key on Jellyfin from this admin user
const jellyfinClient = new JellyfinAPI(
hostname,
account.AccessToken,
deviceId
);
const apiKey = await jellyfinClient.createApiToken('Jellyseerr');
const serverName = await jellyfinserver.getServerName();
settings.jellyfin.name = serverName;
@@ -373,6 +381,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
settings.jellyfin.port = body.port ?? 8096;
settings.jellyfin.urlBase = body.urlBase ?? '';
settings.jellyfin.useSsl = body.useSsl ?? false;
settings.jellyfin.apiKey = apiKey;
settings.save();
startJobs();
@@ -396,10 +405,6 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
jellyfinUsername: account.User.Name,
}
);
// Let's check if their authtoken is up to date
if (user.jellyfinAuthToken !== account.AccessToken) {
user.jellyfinAuthToken = account.AccessToken;
}
// Update the users avatar with their jellyfin profile pic (incase it changed)
if (account.User.PrimaryImageTag) {
user.avatar = `${jellyfinHost}/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`;
@@ -415,12 +420,6 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
user.username = '';
}
// TODO: If JELLYFIN_TYPE is set to 'emby' then set mediaServerType to EMBY
// if (process.env.JELLYFIN_TYPE === 'emby') {
// settings.main.mediaServerType = MediaServerType.EMBY;
// settings.save();
// }
await userRepository.save(user);
} else if (!settings.main.newPlexLogin) {
logger.warn(
@@ -451,7 +450,6 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
jellyfinUsername: account.User.Name,
jellyfinUserId: account.User.Id,
jellyfinDeviceId: deviceId,
jellyfinAuthToken: account.AccessToken,
permissions: settings.main.defaultPermissions,
avatar: account.User.PrimaryImageTag
? `${jellyfinHost}/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`

View File

@@ -3,7 +3,9 @@ import RottenTomatoes from '@server/api/rating/rottentomatoes';
import { type RatingResponse } from '@server/api/ratings';
import TheMovieDb from '@server/api/themoviedb';
import { MediaType } from '@server/constants/media';
import { getRepository } from '@server/datasource';
import Media from '@server/entity/Media';
import { Watchlist } from '@server/entity/Watchlist';
import logger from '@server/logger';
import { mapMovieDetails } from '@server/models/Movie';
import { mapMovieResult } from '@server/models/Search';
@@ -22,7 +24,24 @@ movieRoutes.get('/:id', async (req, res, next) => {
const media = await Media.getMedia(tmdbMovie.id, MediaType.MOVIE);
return res.status(200).json(mapMovieDetails(tmdbMovie, media));
const onUserWatchlist = await getRepository(Watchlist).exist({
where: {
tmdbId: Number(req.params.id),
requestedBy: {
id: req.user?.id,
},
},
});
const data = mapMovieDetails(tmdbMovie, media, onUserWatchlist);
// TMDB issue where it doesnt fallback to English when no overview is available in requested locale.
if (!data.overview) {
const tvEnglish = await tmdb.getMovie({ movieId: Number(req.params.id) });
data.overview = tvEnglish.overview;
}
return res.status(200).json(data);
} catch (e) {
logger.debug('Something went wrong retrieving movie', {
label: 'API',

View File

@@ -1,3 +1,5 @@
import RadarrAPI from '@server/api/servarr/radarr';
import SonarrAPI from '@server/api/servarr/sonarr';
import {
MediaRequestStatus,
MediaStatus,
@@ -19,6 +21,7 @@ import type {
RequestResultsResponse,
} from '@server/interfaces/api/requestInterfaces';
import { Permission } from '@server/lib/permissions';
import { getSettings } from '@server/lib/settings';
import logger from '@server/logger';
import { isAuthenticated } from '@server/middleware/auth';
import { Router } from 'express';
@@ -143,6 +146,62 @@ requestRoutes.get<Record<string, unknown>, RequestResultsResponse>(
.skip(skip)
.getManyAndCount();
const settings = getSettings();
// get all quality profiles for every configured sonarr server
const sonarrServers = await Promise.all(
settings.sonarr.map(async (sonarrSetting) => {
const sonarr = new SonarrAPI({
apiKey: sonarrSetting.apiKey,
url: SonarrAPI.buildUrl(sonarrSetting, '/api/v3'),
});
return {
id: sonarrSetting.id,
profiles: await sonarr.getProfiles(),
};
})
);
// get all quality profiles for every configured radarr server
const radarrServers = await Promise.all(
settings.radarr.map(async (radarrSetting) => {
const radarr = new RadarrAPI({
apiKey: radarrSetting.apiKey,
url: RadarrAPI.buildUrl(radarrSetting, '/api/v3'),
});
return {
id: radarrSetting.id,
profiles: await radarr.getProfiles(),
};
})
);
// add profile names to the media requests, with undefined if not found
const requestsWithProfileNames = requests.map((r) => {
switch (r.type) {
case MediaType.MOVIE: {
const profileName = radarrServers
.find((serverr) => serverr.id === r.serverId)
?.profiles.find((profile) => profile.id === r.profileId)?.name;
return {
...r,
profileName,
};
}
case MediaType.TV: {
return {
...r,
profileName: sonarrServers
.find((serverr) => serverr.id === r.serverId)
?.profiles.find((profile) => profile.id === r.profileId)?.name,
};
}
}
});
return res.status(200).json({
pageInfo: {
pages: Math.ceil(requestCount / pageSize),
@@ -150,7 +209,7 @@ requestRoutes.get<Record<string, unknown>, RequestResultsResponse>(
results: requestCount,
page: Math.ceil(skip / pageSize) + 1,
},
results: requests,
results: requestsWithProfileNames,
});
} catch (e) {
next({ status: 500, message: e.message });

View File

@@ -262,7 +262,7 @@ settingsRoutes.post('/jellyfin', async (req, res, next) => {
try {
const admin = await userRepository.findOneOrFail({
where: { id: 1 },
select: ['id', 'jellyfinAuthToken', 'jellyfinUserId', 'jellyfinDeviceId'],
select: ['id', 'jellyfinUserId', 'jellyfinDeviceId'],
order: { id: 'ASC' },
});
@@ -270,7 +270,7 @@ settingsRoutes.post('/jellyfin', async (req, res, next) => {
const jellyfinClient = new JellyfinAPI(
getHostname(tempJellyfinSettings),
admin.jellyfinAuthToken ?? '',
tempJellyfinSettings.apiKey,
admin.jellyfinDeviceId ?? ''
);
@@ -318,13 +318,13 @@ settingsRoutes.get('/jellyfin/library', async (req, res, next) => {
if (req.query.sync) {
const userRepository = getRepository(User);
const admin = await userRepository.findOneOrFail({
select: ['id', 'jellyfinAuthToken', 'jellyfinDeviceId', 'jellyfinUserId'],
select: ['id', 'jellyfinDeviceId', 'jellyfinUserId'],
where: { id: 1 },
order: { id: 'ASC' },
});
const jellyfinClient = new JellyfinAPI(
getHostname(),
admin.jellyfinAuthToken ?? '',
settings.jellyfin.apiKey,
admin.jellyfinDeviceId ?? ''
);
@@ -376,7 +376,8 @@ settingsRoutes.get('/jellyfin/library', async (req, res, next) => {
});
settingsRoutes.get('/jellyfin/users', async (req, res) => {
const { externalHostname } = getSettings().jellyfin;
const settings = getSettings();
const { externalHostname } = settings.jellyfin;
const jellyfinHost =
externalHostname && externalHostname.length > 0
? externalHostname
@@ -384,13 +385,13 @@ settingsRoutes.get('/jellyfin/users', async (req, res) => {
const userRepository = getRepository(User);
const admin = await userRepository.findOneOrFail({
select: ['id', 'jellyfinAuthToken', 'jellyfinDeviceId', 'jellyfinUserId'],
select: ['id', 'jellyfinDeviceId', 'jellyfinUserId'],
where: { id: 1 },
order: { id: 'ASC' },
});
const jellyfinClient = new JellyfinAPI(
getHostname(),
admin.jellyfinAuthToken ?? '',
settings.jellyfin.apiKey,
admin.jellyfinDeviceId ?? ''
);

View File

@@ -1,7 +1,9 @@
import RottenTomatoes from '@server/api/rating/rottentomatoes';
import TheMovieDb from '@server/api/themoviedb';
import { MediaType } from '@server/constants/media';
import { getRepository } from '@server/datasource';
import Media from '@server/entity/Media';
import { Watchlist } from '@server/entity/Watchlist';
import logger from '@server/logger';
import { mapTvResult } from '@server/models/Search';
import { mapSeasonWithEpisodes, mapTvDetails } from '@server/models/Tv';
@@ -19,7 +21,24 @@ tvRoutes.get('/:id', async (req, res, next) => {
const media = await Media.getMedia(tv.id, MediaType.TV);
return res.status(200).json(mapTvDetails(tv, media));
const onUserWatchlist = await getRepository(Watchlist).exist({
where: {
tmdbId: Number(req.params.id),
requestedBy: {
id: req.user?.id,
},
},
});
const data = mapTvDetails(tv, media, onUserWatchlist);
// TMDB issue where it doesnt fallback to English when no overview is available in requested locale.
if (!data.overview) {
const tvEnglish = await tmdb.getTvShow({ tvId: Number(req.params.id) });
data.overview = tvEnglish.overview;
}
return res.status(200).json(data);
} catch (e) {
logger.debug('Something went wrong retrieving series', {
label: 'API',

View File

@@ -501,17 +501,14 @@ router.post(
// taken from auth.ts
const admin = await userRepository.findOneOrFail({
where: { id: 1 },
select: [
'id',
'jellyfinAuthToken',
'jellyfinDeviceId',
'jellyfinUserId',
],
select: ['id', 'jellyfinDeviceId', 'jellyfinUserId'],
order: { id: 'ASC' },
});
const hostname = getHostname();
const jellyfinClient = new JellyfinAPI(
getHostname(),
admin.jellyfinAuthToken ?? '',
hostname,
settings.jellyfin.apiKey,
admin.jellyfinDeviceId ?? ''
);
jellyfinClient.setUserId(admin.jellyfinUserId ?? '');
@@ -519,7 +516,6 @@ router.post(
//const jellyfinUsersResponse = await jellyfinClient.getUsers();
const createdUsers: User[] = [];
const { externalHostname } = getSettings().jellyfin;
const hostname = getHostname();
const jellyfinHost =
externalHostname && externalHostname.length > 0

View File

@@ -3,6 +3,7 @@ import RTAudRotten from '@app/assets/rt_aud_rotten.svg';
import RTFresh from '@app/assets/rt_fresh.svg';
import RTRotten from '@app/assets/rt_rotten.svg';
import ImdbLogo from '@app/assets/services/imdb.svg';
import Spinner from '@app/assets/spinner.svg';
import TmdbLogo from '@app/assets/tmdb_logo.svg';
import Button from '@app/components/Common/Button';
import CachedImage from '@app/components/Common/CachedImage';
@@ -25,7 +26,7 @@ import useLocale from '@app/hooks/useLocale';
import useSettings from '@app/hooks/useSettings';
import { Permission, useUser } from '@app/hooks/useUser';
import globalMessages from '@app/i18n/globalMessages';
import Error from '@app/pages/_error';
import ErrorPage from '@app/pages/_error';
import { sortCrewPriority } from '@app/utils/creditHelpers';
import defineMessages from '@app/utils/defineMessages';
import { refreshIntervalHelper } from '@app/utils/refreshIntervalHelper';
@@ -41,10 +42,12 @@ import {
import {
ChevronDoubleDownIcon,
ChevronDoubleUpIcon,
MinusCircleIcon,
StarIcon,
} from '@heroicons/react/24/solid';
import { type RatingResponse } from '@server/api/ratings';
import { IssueStatus } from '@server/constants/issue';
import { MediaStatus } from '@server/constants/media';
import { MediaStatus, MediaType } from '@server/constants/media';
import { MediaServerType } from '@server/constants/server';
import type { MovieDetails as MovieDetailsType } from '@server/models/Movie';
import { countries } from 'country-flag-icons';
@@ -54,6 +57,7 @@ import Link from 'next/link';
import { useRouter } from 'next/router';
import { useEffect, useMemo, useState } from 'react';
import { useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
import useSWR from 'swr';
const messages = defineMessages('components.MovieDetails', {
@@ -93,6 +97,12 @@ const messages = defineMessages('components.MovieDetails', {
rtaudiencescore: 'Rotten Tomatoes Audience Score',
tmdbuserscore: 'TMDB User Score',
imdbuserscore: 'IMDB User Score',
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
watchlistDeleted:
'<strong>{title}</strong> Removed from watchlist successfully!',
watchlistError: 'Something went wrong try again.',
removefromwatchlist: 'Remove From Watchlist',
addtowatchlist: 'Add To Watchlist',
});
interface MovieDetailsProps {
@@ -111,6 +121,11 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
const minStudios = 3;
const [showMoreStudios, setShowMoreStudios] = useState(false);
const [showIssueModal, setShowIssueModal] = useState(false);
const [isUpdating, setIsUpdating] = useState<boolean>(false);
const [toggleWatchlist, setToggleWatchlist] = useState<boolean>(
!movie?.onUserWatchlist
);
const { addToast } = useToasts();
const {
data,
@@ -152,7 +167,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
}
if (!data) {
return <Error statusCode={404} />;
return <ErrorPage statusCode={404} />;
}
const showAllStudios = data.productionCompanies.length <= minStudios + 1;
@@ -285,6 +300,80 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
return intl.formatMessage(messages.play4k, { mediaServerName: 'Jellyfin' });
}
const onClickWatchlistBtn = async (): Promise<void> => {
setIsUpdating(true);
const res = await fetch('/api/v1/watchlist', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tmdbId: movie?.id,
mediaType: MediaType.MOVIE,
title: movie?.title,
}),
});
if (!res.ok) {
addToast(intl.formatMessage(messages.watchlistError), {
appearance: 'error',
autoDismiss: true,
});
setIsUpdating(false);
return;
}
const data = await res.json();
if (data) {
addToast(
<span>
{intl.formatMessage(messages.watchlistSuccess, {
title: movie?.title,
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
})}
</span>,
{ appearance: 'success', autoDismiss: true }
);
}
setIsUpdating(false);
setToggleWatchlist((prevState) => !prevState);
};
const onClickDeleteWatchlistBtn = async (): Promise<void> => {
setIsUpdating(true);
try {
const res = await fetch(`/api/v1/watchlist/${movie?.id}`, {
method: 'DELETE',
});
if (!res.ok) throw new Error();
if (res.status === 204) {
addToast(
<span>
{intl.formatMessage(messages.watchlistDeleted, {
title: movie?.title,
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
})}
</span>,
{ appearance: 'info', autoDismiss: true }
);
}
} catch (e) {
addToast(intl.formatMessage(messages.watchlistError), {
appearance: 'error',
autoDismiss: true,
});
} finally {
setIsUpdating(false);
setToggleWatchlist((prevState) => !prevState);
}
};
return (
<div
className="media-page"
@@ -406,6 +495,40 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
</span>
</div>
<div className="media-actions">
<>
{toggleWatchlist ? (
<Tooltip content={intl.formatMessage(messages.addtowatchlist)}>
<Button
buttonType={'ghost'}
className="z-40 mr-2"
buttonSize={'md'}
onClick={onClickWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
) : (
<StarIcon className={'h-3 text-amber-300'} />
)}
</Button>
</Tooltip>
) : (
<Tooltip
content={intl.formatMessage(messages.removefromwatchlist)}
>
<Button
className="z-40 mr-2"
buttonSize={'md'}
onClick={onClickDeleteWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
) : (
<MinusCircleIcon className={'h-3'} />
)}
</Button>
</Tooltip>
)}
</>
<PlayButton links={mediaLinks} />
<RequestButton
mediaType="movie"

View File

@@ -19,6 +19,7 @@ import {
} from '@heroicons/react/24/solid';
import { MediaRequestStatus } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest';
import type { NonFunctionProperties } from '@server/interfaces/api/common';
import type { MovieDetails } from '@server/models/Movie';
import type { TvDetails } from '@server/models/Tv';
import Image from 'next/image';
@@ -58,7 +59,7 @@ const RequestCardPlaceholder = () => {
};
interface RequestCardErrorProps {
requestData?: MediaRequest;
requestData?: NonFunctionProperties<MediaRequest>;
}
const RequestCardError = ({ requestData }: RequestCardErrorProps) => {
@@ -213,7 +214,7 @@ const RequestCardError = ({ requestData }: RequestCardErrorProps) => {
};
interface RequestCardProps {
request: MediaRequest;
request: NonFunctionProperties<MediaRequest>;
onTitleData?: (requestId: number, title: MovieDetails | TvDetails) => void;
}
@@ -238,16 +239,19 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
data: requestData,
error: requestError,
mutate: revalidate,
} = useSWR<MediaRequest>(`/api/v1/request/${request.id}`, {
fallbackData: request,
refreshInterval: refreshIntervalHelper(
{
downloadStatus: request.media.downloadStatus,
downloadStatus4k: request.media.downloadStatus4k,
},
15000
),
});
} = useSWR<NonFunctionProperties<MediaRequest>>(
`/api/v1/request/${request.id}`,
{
fallbackData: request,
refreshInterval: refreshIntervalHelper(
{
downloadStatus: request.media.downloadStatus,
downloadStatus4k: request.media.downloadStatus4k,
},
15000
),
}
);
const { mediaUrl: plexUrl, mediaUrl4k: plexUrl4k } = useDeepLinks({
mediaUrl: requestData?.media?.mediaUrl,

View File

@@ -18,6 +18,7 @@ import {
} from '@heroicons/react/24/solid';
import { MediaRequestStatus } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest';
import type { NonFunctionProperties } from '@server/interfaces/api/common';
import type { MovieDetails } from '@server/models/Movie';
import type { TvDetails } from '@server/models/Tv';
import Image from 'next/image';
@@ -42,6 +43,7 @@ const messages = defineMessages('components.RequestList.RequestItem', {
tmdbid: 'TMDB ID',
tvdbid: 'TheTVDB ID',
unknowntitle: 'Unknown Title',
profileName: 'Profile',
});
const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
@@ -49,7 +51,7 @@ const isMovie = (movie: MovieDetails | TvDetails): movie is MovieDetails => {
};
interface RequestItemErrorProps {
requestData?: MediaRequest;
requestData?: NonFunctionProperties<MediaRequest>;
revalidateList: () => void;
}
@@ -285,7 +287,7 @@ const RequestItemError = ({
};
interface RequestItemProps {
request: MediaRequest;
request: NonFunctionProperties<MediaRequest> & { profileName?: string };
revalidateList: () => void;
}
@@ -304,19 +306,18 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
const { data: title, error } = useSWR<MovieDetails | TvDetails>(
inView ? url : null
);
const { data: requestData, mutate: revalidate } = useSWR<MediaRequest>(
`/api/v1/request/${request.id}`,
{
fallbackData: request,
refreshInterval: refreshIntervalHelper(
{
downloadStatus: request.media.downloadStatus,
downloadStatus4k: request.media.downloadStatus4k,
},
15000
),
}
);
const { data: requestData, mutate: revalidate } = useSWR<
NonFunctionProperties<MediaRequest>
>(`/api/v1/request/${request.id}`, {
fallbackData: request,
refreshInterval: refreshIntervalHelper(
{
downloadStatus: request.media.downloadStatus,
downloadStatus4k: request.media.downloadStatus4k,
},
15000
),
});
const [isRetrying, setRetrying] = useState(false);
@@ -401,7 +402,7 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
setShowEditModal(false);
}}
/>
<div className="relative flex w-full flex-col justify-between overflow-hidden rounded-xl bg-gray-800 py-4 text-gray-400 shadow-md ring-1 ring-gray-700 xl:h-28 xl:flex-row">
<div className="relative flex w-full flex-col justify-between overflow-hidden rounded-xl bg-gray-800 py-2 text-gray-400 shadow-md ring-1 ring-gray-700 xl:h-28 xl:flex-row">
{title.backdropPath && (
<div className="absolute inset-0 z-0 w-full bg-cover bg-center xl:w-2/3">
<CachedImage
@@ -482,7 +483,7 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
)}
</div>
</div>
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
<div className="z-10 mt-4 ml-4 flex w-full flex-col justify-center gap-1 overflow-hidden pr-4 text-sm sm:ml-2 sm:mt-0 xl:flex-1 xl:pr-0">
<div className="card-field">
<span className="card-field-name">
{intl.formatMessage(globalMessages.status)}
@@ -632,6 +633,16 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
</span>
</div>
)}
{request.profileName && (
<div className="card-field">
<span className="card-field-name">
{intl.formatMessage(messages.profileName)}
</span>
<span className="flex truncate text-sm text-gray-300">
{request.profileName}
</span>
</div>
)}
</div>
</div>
<div className="z-10 mt-4 flex w-full flex-col justify-center space-y-2 pl-4 pr-4 xl:mt-0 xl:w-96 xl:items-end xl:pl-0">

View File

@@ -8,6 +8,7 @@ import globalMessages from '@app/i18n/globalMessages';
import defineMessages from '@app/utils/defineMessages';
import { MediaStatus } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest';
import type { NonFunctionProperties } from '@server/interfaces/api/common';
import type { QuotaResponse } from '@server/interfaces/api/userInterfaces';
import { Permission } from '@server/lib/permissions';
import type { MovieDetails } from '@server/models/Movie';
@@ -38,7 +39,7 @@ const messages = defineMessages('components.RequestModal', {
interface RequestModalProps extends React.HTMLAttributes<HTMLDivElement> {
tmdbId: number;
is4k?: boolean;
editRequest?: MediaRequest;
editRequest?: NonFunctionProperties<MediaRequest>;
onCancel?: () => void;
onComplete?: (newStatus: MediaStatus) => void;
onUpdating?: (isUpdating: boolean) => void;

View File

@@ -13,6 +13,7 @@ import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
import { MediaRequestStatus, MediaStatus } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest';
import type SeasonRequest from '@server/entity/SeasonRequest';
import type { NonFunctionProperties } from '@server/interfaces/api/common';
import type { QuotaResponse } from '@server/interfaces/api/userInterfaces';
import { Permission } from '@server/lib/permissions';
import type { TvDetails } from '@server/models/Tv';
@@ -57,7 +58,7 @@ interface RequestModalProps extends React.HTMLAttributes<HTMLDivElement> {
onComplete?: (newStatus: MediaStatus) => void;
onUpdating?: (isUpdating: boolean) => void;
is4k?: boolean;
editRequest?: MediaRequest;
editRequest?: NonFunctionProperties<MediaRequest>;
}
const TvRequestModal = ({

View File

@@ -4,13 +4,14 @@ import TvRequestModal from '@app/components/RequestModal/TvRequestModal';
import { Transition } from '@headlessui/react';
import type { MediaStatus } from '@server/constants/media';
import type { MediaRequest } from '@server/entity/MediaRequest';
import type { NonFunctionProperties } from '@server/interfaces/api/common';
interface RequestModalProps {
show: boolean;
type: 'movie' | 'tv' | 'collection';
tmdbId: number;
is4k?: boolean;
editRequest?: MediaRequest;
editRequest?: NonFunctionProperties<MediaRequest>;
onComplete?: (newStatus: MediaStatus) => void;
onCancel?: () => void;
onUpdating?: (isUpdating: boolean) => void;

View File

@@ -1,6 +1,7 @@
import Badge from '@app/components/Common/Badge';
import Button from '@app/components/Common/Button';
import LoadingSpinner from '@app/components/Common/LoadingSpinner';
import SensitiveInput from '@app/components/Common/SensitiveInput';
import LibraryItem from '@app/components/Settings/LibraryItem';
import useSettings from '@app/hooks/useSettings';
import globalMessages from '@app/i18n/globalMessages';
@@ -31,13 +32,14 @@ const messages = defineMessages('components.Settings', {
jellyfinSettingsSuccess: '{mediaServerName} settings saved successfully!',
jellyfinSettings: '{mediaServerName} Settings',
jellyfinSettingsDescription:
'Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page.',
'Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page. You can also change the Jellyfin API key, which was automatically generated previously.',
externalUrl: 'External URL',
hostname: 'Hostname or IP Address',
port: 'Port',
enablessl: 'Use SSL',
urlBase: 'URL Base',
jellyfinForgotPasswordUrl: 'Forgot Password URL',
apiKey: 'API key',
jellyfinSyncFailedNoLibrariesFound: 'No libraries were found',
jellyfinSyncFailedAutomaticGroupedFolders:
'Custom authentication with Automatic Library Grouping not supported',
@@ -60,6 +62,9 @@ const messages = defineMessages('components.Settings', {
validationUrlTrailingSlash: 'URL must not end in a trailing slash',
validationUrlBaseLeadingSlash: 'URL base must have a leading slash',
validationUrlBaseTrailingSlash: 'URL base must not end in a trailing slash',
tip: 'Tip',
scanbackground:
'Scanning will run in the background. You can continue the setup process in the meantime.',
});
interface Library {
@@ -77,13 +82,13 @@ interface SyncStatus {
}
interface SettingsJellyfinProps {
showAdvancedSettings?: boolean;
isSetupSettings?: boolean;
onComplete?: () => void;
}
const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
onComplete,
showAdvancedSettings,
isSetupSettings,
}) => {
const [isSyncing, setIsSyncing] = useState(false);
const toasts = useToasts();
@@ -445,110 +450,117 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
</div>
</div>
</div>
{showAdvancedSettings && (
<>
<div className="mt-10 mb-6">
<h3 className="heading">
{intl.formatMessage(
messages.jellyfinSettings,
mediaServerFormatValues
)}
</h3>
<p className="description">
{intl.formatMessage(
messages.jellyfinSettingsDescription,
mediaServerFormatValues
)}
</p>
</div>
<Formik
initialValues={{
hostname: data?.ip,
port: data?.port ?? 8096,
useSsl: data?.useSsl,
urlBase: data?.urlBase || '',
jellyfinExternalUrl: data?.externalHostname || '',
jellyfinForgotPasswordUrl: data?.jellyfinForgotPasswordUrl || '',
}}
validationSchema={JellyfinSettingsSchema}
onSubmit={async (values) => {
try {
const res = await fetch('/api/v1/settings/jellyfin', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
ip: values.hostname,
port: Number(values.port),
useSsl: values.useSsl,
urlBase: values.urlBase,
externalHostname: values.jellyfinExternalUrl,
jellyfinForgotPasswordUrl: values.jellyfinForgotPasswordUrl,
} as JellyfinSettings),
});
if (!res.ok) throw new Error(res.statusText, { cause: res });
{isSetupSettings && (
<div className="text-sm text-gray-500">
<span className="mr-2">
<Badge>{intl.formatMessage(messages.tip)}</Badge>
</span>
{intl.formatMessage(messages.scanbackground)}
</div>
)}
<div className="mt-10 mb-6">
<h3 className="heading">
{intl.formatMessage(
messages.jellyfinSettings,
mediaServerFormatValues
)}
</h3>
<p className="description">
{intl.formatMessage(
messages.jellyfinSettingsDescription,
mediaServerFormatValues
)}
</p>
</div>
<Formik
initialValues={{
hostname: data?.ip,
port: data?.port ?? 8096,
useSsl: data?.useSsl,
urlBase: data?.urlBase || '',
jellyfinExternalUrl: data?.externalHostname || '',
jellyfinForgotPasswordUrl: data?.jellyfinForgotPasswordUrl || '',
apiKey: data?.apiKey,
}}
validationSchema={JellyfinSettingsSchema}
onSubmit={async (values) => {
try {
const res = await fetch('/api/v1/settings/jellyfin', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
ip: values.hostname,
port: Number(values.port),
useSsl: values.useSsl,
urlBase: values.urlBase,
externalHostname: values.jellyfinExternalUrl,
jellyfinForgotPasswordUrl: values.jellyfinForgotPasswordUrl,
apiKey: values.apiKey,
} as JellyfinSettings),
});
if (!res.ok) throw new Error(res.statusText, { cause: res });
addToast(
intl.formatMessage(messages.jellyfinSettingsSuccess, {
mediaServerName:
settings.currentSettings.mediaServerType ===
MediaServerType.EMBY
? 'Emby'
: 'Jellyfin',
}),
{
autoDismiss: true,
appearance: 'success',
}
);
} catch (e) {
let errorData;
try {
errorData = await e.cause?.text();
errorData = JSON.parse(errorData);
} catch {
/* empty */
}
if (errorData?.message === ApiErrorCode.InvalidUrl) {
addToast(
intl.formatMessage(
messages.invalidurlerror,
mediaServerFormatValues
),
{
autoDismiss: true,
appearance: 'error',
}
);
} else {
addToast(
intl.formatMessage(
messages.jellyfinSettingsFailure,
mediaServerFormatValues
),
{
autoDismiss: true,
appearance: 'error',
}
);
}
} finally {
revalidate();
addToast(
intl.formatMessage(
messages.jellyfinSettingsSuccess,
mediaServerFormatValues
),
{
autoDismiss: true,
appearance: 'success',
}
}}
>
{({
errors,
touched,
values,
setFieldValue,
handleSubmit,
isSubmitting,
isValid,
}) => {
return (
<form className="section" onSubmit={handleSubmit}>
);
} catch (e) {
let errorData;
try {
errorData = await e.cause?.text();
errorData = JSON.parse(errorData);
} catch {
/* empty */
}
if (errorData?.message === ApiErrorCode.InvalidUrl) {
addToast(
intl.formatMessage(
messages.invalidurlerror,
mediaServerFormatValues
),
{
autoDismiss: true,
appearance: 'error',
}
);
} else {
addToast(
intl.formatMessage(
messages.jellyfinSettingsFailure,
mediaServerFormatValues
),
{
autoDismiss: true,
appearance: 'error',
}
);
}
} finally {
revalidate();
}
}}
>
{({
errors,
touched,
values,
setFieldValue,
handleSubmit,
isSubmitting,
isValid,
}) => {
return (
<form className="section" onSubmit={handleSubmit}>
{!isSetupSettings && (
<>
<div className="form-row">
<label htmlFor="hostname" className="text-label">
{intl.formatMessage(messages.hostname)}
@@ -610,6 +622,29 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
/>
</div>
</div>
</>
)}
<div className="form-row">
<label htmlFor="apiKey" className="text-label">
{intl.formatMessage(messages.apiKey)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<SensitiveInput
as="field"
type="text"
inputMode="url"
id="apiKey"
name="apiKey"
/>
</div>
{errors.apiKey && touched.apiKey && (
<div className="error">{errors.apiKey}</div>
)}
</div>
</div>
{!isSetupSettings && (
<>
<div className="form-row">
<label htmlFor="urlBase" className="text-label">
{intl.formatMessage(messages.urlBase)}
@@ -630,75 +665,75 @@ const SettingsJellyfin: React.FC<SettingsJellyfinProps> = ({
)}
</div>
</div>
<div className="form-row">
<label htmlFor="jellyfinExternalUrl" className="text-label">
{intl.formatMessage(messages.externalUrl)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field
type="text"
inputMode="url"
id="jellyfinExternalUrl"
name="jellyfinExternalUrl"
/>
</div>
{errors.jellyfinExternalUrl &&
touched.jellyfinExternalUrl && (
<div className="error">
{errors.jellyfinExternalUrl}
</div>
)}
</div>
</>
)}
<div className="form-row">
<label htmlFor="jellyfinExternalUrl" className="text-label">
{intl.formatMessage(messages.externalUrl)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field
type="text"
inputMode="url"
id="jellyfinExternalUrl"
name="jellyfinExternalUrl"
/>
</div>
<div className="form-row">
<label
htmlFor="jellyfinForgotPasswordUrl"
className="text-label"
{errors.jellyfinExternalUrl &&
touched.jellyfinExternalUrl && (
<div className="error">{errors.jellyfinExternalUrl}</div>
)}
</div>
</div>
<div className="form-row">
<label
htmlFor="jellyfinForgotPasswordUrl"
className="text-label"
>
{intl.formatMessage(messages.jellyfinForgotPasswordUrl)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field
type="text"
inputMode="url"
id="jellyfinForgotPasswordUrl"
name="jellyfinForgotPasswordUrl"
/>
</div>
{errors.jellyfinForgotPasswordUrl &&
touched.jellyfinForgotPasswordUrl && (
<div className="error">
{errors.jellyfinForgotPasswordUrl}
</div>
)}
</div>
</div>
<div
className={`actions ${isSetupSettings ? 'mt-0 border-0' : ''}`}
>
<div className="flex justify-end">
<span className="ml-3 inline-flex rounded-md shadow-sm">
<Button
buttonType="primary"
type="submit"
disabled={isSubmitting || !isValid}
>
{intl.formatMessage(messages.jellyfinForgotPasswordUrl)}
</label>
<div className="form-input-area">
<div className="form-input-field">
<Field
type="text"
inputMode="url"
id="jellyfinForgotPasswordUrl"
name="jellyfinForgotPasswordUrl"
/>
</div>
{errors.jellyfinForgotPasswordUrl &&
touched.jellyfinForgotPasswordUrl && (
<div className="error">
{errors.jellyfinForgotPasswordUrl}
</div>
)}
</div>
</div>
<div className="actions">
<div className="flex justify-end">
<span className="ml-3 inline-flex rounded-md shadow-sm">
<Button
buttonType="primary"
type="submit"
disabled={isSubmitting || !isValid}
>
<ArrowDownOnSquareIcon />
<span>
{isSubmitting
? intl.formatMessage(globalMessages.saving)
: intl.formatMessage(globalMessages.save)}
</span>
</Button>
<ArrowDownOnSquareIcon />
<span>
{isSubmitting
? intl.formatMessage(globalMessages.saving)
: intl.formatMessage(globalMessages.save)}
</span>
</div>
</div>
</form>
);
}}
</Formik>
</>
)}
</Button>
</span>
</div>
</div>
</form>
);
}}
</Formik>
</>
);
};

View File

@@ -2,7 +2,6 @@ import EmbyLogo from '@app/assets/services/emby.svg';
import JellyfinLogo from '@app/assets/services/jellyfin.svg';
import PlexLogo from '@app/assets/services/plex.svg';
import AppDataWarning from '@app/components/AppDataWarning';
import Badge from '@app/components/Common/Badge';
import Button from '@app/components/Common/Button';
import ImageFader from '@app/components/Common/ImageFader';
import PageTitle from '@app/components/Common/PageTitle';
@@ -12,11 +11,12 @@ import SettingsPlex from '@app/components/Settings/SettingsPlex';
import SettingsServices from '@app/components/Settings/SettingsServices';
import SetupSteps from '@app/components/Setup/SetupSteps';
import useLocale from '@app/hooks/useLocale';
import useSettings from '@app/hooks/useSettings';
import defineMessages from '@app/utils/defineMessages';
import { MediaServerType } from '@server/constants/server';
import Image from 'next/image';
import { useRouter } from 'next/router';
import { useState } from 'react';
import { useEffect, useState } from 'react';
import { useIntl } from 'react-intl';
import useSWR, { mutate } from 'swr';
import SetupLogin from './SetupLogin';
@@ -35,9 +35,6 @@ const messages = defineMessages('components.Setup', {
signin: 'Sign In',
configuremediaserver: 'Configure Media Server',
configureservices: 'Configure Services',
tip: 'Tip',
scanbackground:
'Scanning will run in the background. You can continue the setup process in the meantime.',
});
const Setup = () => {
@@ -51,6 +48,7 @@ const Setup = () => {
);
const router = useRouter();
const { locale } = useLocale();
const settings = useSettings();
const finishSetup = async () => {
setIsUpdating(true);
@@ -85,6 +83,23 @@ const Setup = () => {
revalidateOnFocus: false,
});
useEffect(() => {
if (settings.currentSettings.initialized) {
router.push('/');
}
if (
settings.currentSettings.mediaServerType !==
MediaServerType.NOT_CONFIGURED
) {
setCurrentStep(3);
setMediaServerType(settings.currentSettings.mediaServerType);
}
}, [
settings.currentSettings.mediaServerType,
settings.currentSettings.initialized,
router,
]);
return (
<div className="relative flex min-h-screen flex-col justify-center bg-gray-900 py-12">
<PageTitle title={intl.formatMessage(messages.setup)} />
@@ -213,16 +228,10 @@ const Setup = () => {
/>
) : (
<SettingsJellyfin
showAdvancedSettings={false}
isSetupSettings
onComplete={() => setMediaServerSettingsComplete(true)}
/>
)}
<div className="mt-4 text-sm text-gray-500">
<span className="mr-2">
<Badge>{intl.formatMessage(messages.tip)}</Badge>
</span>
{intl.formatMessage(messages.scanbackground)}
</div>
<div className="actions">
<div className="flex justify-end">
<span className="ml-3 inline-flex rounded-md shadow-sm">

View File

@@ -17,6 +17,7 @@ const messages = defineMessages('components.StatusBadge', {
playonplex: 'Play on {mediaServerName}',
openinarr: 'Open in {arr}',
managemedia: 'Manage {mediaType}',
seasonnumber: 'S{seasonNumber}',
seasonepisodenumber: 'S{seasonNumber}E{episodeNumber}',
});
@@ -105,22 +106,34 @@ const StatusBadge = ({
}
}
const tooltipContent = (
<ul>
{downloadItem.map((status, index) => (
<li
key={`dl-status-${status.externalId}-${index}`}
className="border-b border-gray-700 last:border-b-0"
>
<DownloadBlock
downloadItem={status}
title={Array.isArray(title) ? title[index] : title}
is4k={is4k}
/>
</li>
))}
</ul>
);
const tooltipContent =
mediaType === 'tv' &&
downloadItem.length > 1 &&
downloadItem.every(
(item) =>
item.downloadId && item.downloadId === downloadItem[0].downloadId
) ? (
<DownloadBlock
downloadItem={downloadItem[0]}
title={Array.isArray(title) ? title[0] : title}
is4k={is4k}
/>
) : (
<ul>
{downloadItem.map((status, index) => (
<li
key={`dl-status-${status.externalId}-${index}`}
className="border-b border-gray-700 last:border-b-0"
>
<DownloadBlock
downloadItem={status}
title={Array.isArray(title) ? title[index] : title}
is4k={is4k}
/>
</li>
))}
</ul>
);
const badgeDownloadProgress = (
<div
@@ -175,14 +188,27 @@ const StatusBadge = ({
</span>
{inProgress && (
<>
{mediaType === 'tv' && downloadItem[0].episode && (
<span className="ml-1">
{intl.formatMessage(messages.seasonepisodenumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
episodeNumber: downloadItem[0].episode.episodeNumber,
})}
</span>
)}
{mediaType === 'tv' &&
downloadItem[0].episode &&
(downloadItem.length > 1 &&
downloadItem.every(
(item) =>
item.downloadId &&
item.downloadId === downloadItem[0].downloadId
) ? (
<span className="ml-1">
{intl.formatMessage(messages.seasonnumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
})}
</span>
) : (
<span className="ml-1">
{intl.formatMessage(messages.seasonepisodenumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
episodeNumber: downloadItem[0].episode.episodeNumber,
})}
</span>
))}
<Spinner className="ml-1 h-3 w-3" />
</>
)}
@@ -228,14 +254,27 @@ const StatusBadge = ({
</span>
{inProgress && (
<>
{mediaType === 'tv' && downloadItem[0].episode && (
<span className="ml-1">
{intl.formatMessage(messages.seasonepisodenumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
episodeNumber: downloadItem[0].episode.episodeNumber,
})}
</span>
)}
{mediaType === 'tv' &&
downloadItem[0].episode &&
(downloadItem.length > 1 &&
downloadItem.every(
(item) =>
item.downloadId &&
item.downloadId === downloadItem[0].downloadId
) ? (
<span className="ml-1">
{intl.formatMessage(messages.seasonnumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
})}
</span>
) : (
<span className="ml-1">
{intl.formatMessage(messages.seasonepisodenumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
episodeNumber: downloadItem[0].episode.episodeNumber,
})}
</span>
))}
<Spinner className="ml-1 h-3 w-3" />
</>
)}
@@ -281,14 +320,27 @@ const StatusBadge = ({
</span>
{inProgress && (
<>
{mediaType === 'tv' && downloadItem[0].episode && (
<span className="ml-1">
{intl.formatMessage(messages.seasonepisodenumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
episodeNumber: downloadItem[0].episode.episodeNumber,
})}
</span>
)}
{mediaType === 'tv' &&
downloadItem[0].episode &&
(downloadItem.length > 1 &&
downloadItem.every(
(item) =>
item.downloadId &&
item.downloadId === downloadItem[0].downloadId
) ? (
<span className="ml-1">
{intl.formatMessage(messages.seasonnumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
})}
</span>
) : (
<span className="ml-1">
{intl.formatMessage(messages.seasonepisodenumber, {
seasonNumber: downloadItem[0].episode.seasonNumber,
episodeNumber: downloadItem[0].episode.episodeNumber,
})}
</span>
))}
<Spinner className="ml-1 h-3 w-3" />
</>
)}

View File

@@ -2,6 +2,7 @@ import RTAudFresh from '@app/assets/rt_aud_fresh.svg';
import RTAudRotten from '@app/assets/rt_aud_rotten.svg';
import RTFresh from '@app/assets/rt_fresh.svg';
import RTRotten from '@app/assets/rt_rotten.svg';
import Spinner from '@app/assets/spinner.svg';
import TmdbLogo from '@app/assets/tmdb_logo.svg';
import Badge from '@app/components/Common/Badge';
import Button from '@app/components/Common/Button';
@@ -40,11 +41,19 @@ import {
FilmIcon,
PlayIcon,
} from '@heroicons/react/24/outline';
import { ChevronDownIcon } from '@heroicons/react/24/solid';
import {
ChevronDownIcon,
MinusCircleIcon,
StarIcon,
} from '@heroicons/react/24/solid';
import type { RTRating } from '@server/api/rating/rottentomatoes';
import { ANIME_KEYWORD_ID } from '@server/api/themoviedb/constants';
import { IssueStatus } from '@server/constants/issue';
import { MediaRequestStatus, MediaStatus } from '@server/constants/media';
import {
MediaRequestStatus,
MediaStatus,
MediaType,
} from '@server/constants/media';
import { MediaServerType } from '@server/constants/server';
import type { Crew } from '@server/models/common';
import type { TvDetails as TvDetailsType } from '@server/models/Tv';
@@ -54,6 +63,7 @@ import Link from 'next/link';
import { useRouter } from 'next/router';
import { useEffect, useMemo, useState } from 'react';
import { useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
import useSWR from 'swr';
const messages = defineMessages('components.TvDetails', {
@@ -88,6 +98,12 @@ const messages = defineMessages('components.TvDetails', {
rtcriticsscore: 'Rotten Tomatoes Tomatometer',
rtaudiencescore: 'Rotten Tomatoes Audience Score',
tmdbuserscore: 'TMDB User Score',
watchlistSuccess: '<strong>{title}</strong> added to watchlist successfully!',
watchlistDeleted:
'<strong>{title}</strong> Removed from watchlist successfully!',
watchlistError: 'Something went wrong try again.',
removefromwatchlist: 'Remove From Watchlist',
addtowatchlist: 'Add To Watchlist',
});
interface TvDetailsProps {
@@ -105,6 +121,11 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
router.query.manage == '1' ? true : false
);
const [showIssueModal, setShowIssueModal] = useState(false);
const [isUpdating, setIsUpdating] = useState<boolean>(false);
const [toggleWatchlist, setToggleWatchlist] = useState<boolean>(
!tv?.onUserWatchlist
);
const { addToast } = useToasts();
const {
data,
@@ -300,6 +321,82 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
return intl.formatMessage(messages.play, { mediaServerName: 'Jellyfin' });
}
const onClickWatchlistBtn = async (): Promise<void> => {
setIsUpdating(true);
const res = await fetch('/api/v1/watchlist', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
tmdbId: tv?.id,
mediaType: MediaType.TV,
title: tv?.name,
}),
});
if (!res.ok) {
addToast(intl.formatMessage(messages.watchlistError), {
appearance: 'error',
autoDismiss: true,
});
setIsUpdating(false);
return;
}
const data = await res.json();
if (data) {
addToast(
<span>
{intl.formatMessage(messages.watchlistSuccess, {
title: tv?.name,
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
})}
</span>,
{ appearance: 'success', autoDismiss: true }
);
}
setIsUpdating(false);
setToggleWatchlist((prevState) => !prevState);
};
const onClickDeleteWatchlistBtn = async (): Promise<void> => {
setIsUpdating(true);
const res = await fetch('/api/v1/watchlist/' + tv?.id, {
method: 'DELETE',
});
if (!res.ok) {
addToast(intl.formatMessage(messages.watchlistError), {
appearance: 'error',
autoDismiss: true,
});
setIsUpdating(false);
return;
}
if (res.status === 204) {
addToast(
<span>
{intl.formatMessage(messages.watchlistDeleted, {
title: tv?.name,
strong: (msg: React.ReactNode) => <strong>{msg}</strong>,
})}
</span>,
{ appearance: 'info', autoDismiss: true }
);
setIsUpdating(false);
setToggleWatchlist((prevState) => !prevState);
}
};
return (
<div
className="media-page"
@@ -431,6 +528,40 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
</span>
</div>
<div className="media-actions">
<>
{toggleWatchlist ? (
<Tooltip content={intl.formatMessage(messages.addtowatchlist)}>
<Button
buttonType={'ghost'}
className="z-40 mr-2"
buttonSize={'md'}
onClick={onClickWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
) : (
<StarIcon className={'h-3 text-amber-300'} />
)}
</Button>
</Tooltip>
) : (
<Tooltip
content={intl.formatMessage(messages.removefromwatchlist)}
>
<Button
className="z-40 mr-2"
buttonSize={'md'}
onClick={onClickDeleteWatchlistBtn}
>
{isUpdating ? (
<Spinner className="h-3" />
) : (
<MinusCircleIcon className={'h-3'} />
)}
</Button>
</Tooltip>
)}
</>
<PlayButton links={mediaLinks} />
<RequestButton
mediaType="tv"

View File

@@ -55,14 +55,6 @@ const JellyfinImportModal: React.FC<JellyfinImportProps> = ({
`/api/v1/user?take=${children}`
);
data?.forEach((user, pos) => {
if (
existingUsers?.results.some((data) => data.jellyfinUserId === user.id)
) {
data?.splice(pos, 1);
}
});
const importUsers = async () => {
setImporting(true);
@@ -215,64 +207,71 @@ const JellyfinImportModal: React.FC<JellyfinImportProps> = ({
</tr>
</thead>
<tbody className="divide-y divide-gray-700 bg-gray-600">
{data?.map((user) => (
<tr key={`user-${user.id}`}>
<td className="whitespace-nowrap px-4 py-4 text-sm font-medium leading-5 text-gray-100">
<span
role="checkbox"
tabIndex={0}
aria-checked={isSelectedUser(user.id)}
onClick={() => toggleUser(user.id)}
onKeyDown={(e) => {
if (e.key === 'Enter' || e.key === 'Space') {
toggleUser(user.id);
}
}}
className="relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center pt-2 focus:outline-none"
>
{data
?.filter(
(user) =>
!existingUsers?.results.some(
(u) => u.jellyfinUserId === user.id
)
)
.map((user) => (
<tr key={`user-${user.id}`}>
<td className="whitespace-nowrap px-4 py-4 text-sm font-medium leading-5 text-gray-100">
<span
aria-hidden="true"
className={`${
isSelectedUser(user.id)
? 'bg-indigo-500'
: 'bg-gray-800'
} absolute mx-auto h-4 w-9 rounded-full transition-colors duration-200 ease-in-out`}
></span>
<span
aria-hidden="true"
className={`${
isSelectedUser(user.id)
? 'translate-x-5'
: 'translate-x-0'
} absolute left-0 inline-block h-5 w-5 transform rounded-full border border-gray-200 bg-white shadow transition-transform duration-200 ease-in-out group-focus:border-blue-300 group-focus:ring`}
></span>
</span>
</td>
<td className="whitespace-nowrap px-1 py-4 text-sm font-medium leading-5 text-gray-100 md:px-6">
<div className="flex items-center">
<Image
className="h-10 w-10 flex-shrink-0 rounded-full"
src={user.thumb}
alt=""
width={40}
height={40}
/>
<div className="ml-4">
<div className="text-base font-bold leading-5">
{user.username}
</div>
{/* {user.username &&
role="checkbox"
tabIndex={0}
aria-checked={isSelectedUser(user.id)}
onClick={() => toggleUser(user.id)}
onKeyDown={(e) => {
if (e.key === 'Enter' || e.key === 'Space') {
toggleUser(user.id);
}
}}
className="relative inline-flex h-5 w-10 flex-shrink-0 cursor-pointer items-center justify-center pt-2 focus:outline-none"
>
<span
aria-hidden="true"
className={`${
isSelectedUser(user.id)
? 'bg-indigo-500'
: 'bg-gray-800'
} absolute mx-auto h-4 w-9 rounded-full transition-colors duration-200 ease-in-out`}
></span>
<span
aria-hidden="true"
className={`${
isSelectedUser(user.id)
? 'translate-x-5'
: 'translate-x-0'
} absolute left-0 inline-block h-5 w-5 transform rounded-full border border-gray-200 bg-white shadow transition-transform duration-200 ease-in-out group-focus:border-blue-300 group-focus:ring`}
></span>
</span>
</td>
<td className="whitespace-nowrap px-1 py-4 text-sm font-medium leading-5 text-gray-100 md:px-6">
<div className="flex items-center">
<Image
className="h-10 w-10 flex-shrink-0 rounded-full"
src={user.thumb}
alt=""
width={40}
height={40}
/>
<div className="ml-4">
<div className="text-base font-bold leading-5">
{user.username}
</div>
{/* {user.username &&
user.username.toLowerCase() !==
user.email && (
<div className="text-sm leading-5 text-gray-300">
{user.email}
</div>
)} */}
</div>
</div>
</div>
</td>
</tr>
))}
</td>
</tr>
))}
</tbody>
</table>
</div>

View File

@@ -191,7 +191,7 @@
"components.Discover.TvGenreSlider.tvgenres": "Gèneres de Sèries",
"components.Discover.TvGenreList.seriesgenres": "Gèneres de Sèries",
"components.Discover.StudioSlider.studios": "Estudis",
"components.Discover.NetworkSlider.networks": "Plataformes",
"components.Discover.NetworkSlider.networks": "Emissors",
"components.Discover.MovieGenreSlider.moviegenres": "Gèneres de Pel·lícules",
"components.Discover.MovieGenreList.moviegenres": "Gèneres de Pel·lícules",
"components.Discover.DiscoverTvLanguage.languageSeries": "Sèries en {language}",
@@ -397,7 +397,7 @@
"components.TvDetails.originaltitle": "Títol original",
"components.TvDetails.originallanguage": "Idioma original",
"components.TvDetails.nextAirDate": "Pròxima data d'emissió",
"components.TvDetails.network": "{networkCount, plural, one {Plataforma} other {Plataformes}}",
"components.TvDetails.network": "{networkCount, plural, one {Emissor} other {Emissors}}",
"components.TvDetails.firstAirDate": "Primera data d'emissió",
"components.TvDetails.episodeRuntimeMinutes": "{runtime} minuts",
"components.TvDetails.episodeRuntime": "Duració de l'episodi",
@@ -494,7 +494,7 @@
"components.Settings.SonarrModal.validationNameRequired": "Heu de proporcionar un nom de servidor",
"components.Settings.SonarrModal.validationLanguageProfileRequired": "Heu de seleccionar un perfil d'idioma",
"components.Settings.SonarrModal.validationHostnameRequired": "Heu de proporcionar un nom damfitrió o una adreça IP vàlides",
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL base no ha d'acabar amb una barra inclinada final",
"components.Settings.SonarrModal.validationBaseUrlTrailingSlash": "L'URL base no pot acabar amb una barra inclinada final",
"components.Settings.SonarrModal.validationBaseUrlLeadingSlash": "L'URL base ha de tenir una barra inclinada",
"components.Settings.SonarrModal.validationApplicationUrlTrailingSlash": "L'URL no pot acabar amb una barra inclinada final",
"components.Settings.SonarrModal.validationApplicationUrl": "Heu de proporcionar un URL vàlid",
@@ -1135,7 +1135,7 @@
"components.Discover.CreateSlider.needresults": "Cal tenir almenys 1 resultat.",
"components.Discover.CreateSlider.nooptions": "Sense resultats.",
"components.Discover.CreateSlider.providetmdbgenreid": "Proporciona un ID de categoria TMDB",
"components.Discover.CreateSlider.providetmdbnetwork": "Proporciona l'ID de la plataforma TMDB",
"components.Discover.CreateSlider.providetmdbnetwork": "Proporciona l'ID d'emissor TMDB",
"components.Discover.CreateSlider.providetmdbstudio": "Proporciona l'ID d'estudi TMDB",
"components.Discover.CreateSlider.searchGenres": "Cercar per gènere…",
"components.Discover.CreateSlider.searchKeywords": "Cercar per paraules clau…",
@@ -1167,7 +1167,7 @@
"components.Discover.networks": "Emissors",
"components.Discover.resetwarning": "Restablir tots els controls lliscants al valor predeterminat. Això també suprimirà els controls lliscants personalitzats!",
"components.Discover.tmdbmoviekeyword": "Paraula clau de pel·lícula TMDB",
"components.Discover.tmdbnetwork": "Plataformes TMDB",
"components.Discover.tmdbnetwork": "Emissors TMDB",
"components.Discover.FilterSlideover.tmdbuserscore": "Puntuació d'usuaris TMDB",
"components.Discover.tvgenres": "Gèneres de sèries",
"components.Discover.DiscoverTvKeyword.keywordSeries": "Sèries {keywordTitle}",
@@ -1241,18 +1241,11 @@
"components.Settings.SettingsJobsCache.availability-sync": "Sincronització de disponibilitat de contingut",
"components.Discover.tmdbmoviestreamingservices": "Serveis de transmissió de pel·lícules TMDB",
"components.Discover.tmdbtvstreamingservices": "Serveis de transmissió de TV TMDB",
"components.Discover.FilterSlideover.tmdbuservotecount": "Recompte de vots dels usuaris de TMDB",
"components.Discover.FilterSlideover.voteCount": "Número de vots entre {minValue} i {maxValue}",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "So per a les notificacions",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Dispositiu per defecte",
"components.Settings.Notifications.NotificationsPushover.sound": "So per a les notificacions",
"components.Settings.SonarrModal.animeSeriesType": "Tipus d'Anime",
"components.Settings.SonarrModal.seriesType": "Tipus de sèrie",
"components.Settings.SonarrModal.tagRequests": "Sol·licituds d'etiquetes",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Dispositiu per defecte",
"i18n.collection": "Col·lecció",
"components.MovieDetails.imdbuserscore": "Puntuació dels usuaris de IMDB",
"components.Settings.RadarrModal.tagRequests": "Sol·licituds d'etiqueta",
"components.Settings.RadarrModal.tagRequestsInfo": "Automàticament afegeix una etiqueta addicional amb el nom d'usuari i nom complet del sol·licitant",
"components.Settings.SonarrModal.tagRequestsInfo": "Automàticament afegeix una etiqueta addicional amb el nom d'usuari i nom complet del sol·licitant"
"components.Layout.UserWarnings.emailRequired": "És requereix un n correu electrònic.",
"components.Layout.UserWarnings.passwordRequired": "Es requereix una contrasenya.",
"components.Login.description": "Com que és la primera vegada que inicieu sessió a {applicationName}, es necessita afegir un correu electrònic vàlid.",
"components.Discover.FilterSlideover.tmdbuservotecount": "Recompte de vots d'usuaris de TMDB",
"components.Discover.FilterSlideover.voteCount": "Nombre de vots entre {minValue} i {maxValue}",
"components.Layout.UserWarnings.emailInvalid": "El correu electrònic no és vàlid.",
"components.Login.credentialerror": "El nom d'usuari o la contrasenya són incorrectes."
}

File diff suppressed because it is too large Load Diff

View File

@@ -289,6 +289,7 @@
"components.MediaSlider.ShowMoreCard.seemore": "See More",
"components.MovieDetails.MovieCast.fullcast": "Full Cast",
"components.MovieDetails.MovieCrew.fullcrew": "Full Crew",
"components.MovieDetails.addtowatchlist": "Add To Watchlist",
"components.MovieDetails.budget": "Budget",
"components.MovieDetails.cast": "Cast",
"components.MovieDetails.digitalrelease": "Digital Release",
@@ -309,6 +310,7 @@
"components.MovieDetails.productioncountries": "Production {countryCount, plural, one {Country} other {Countries}}",
"components.MovieDetails.recommendations": "Recommendations",
"components.MovieDetails.releasedate": "{releaseCount, plural, one {Release Date} other {Release Dates}}",
"components.MovieDetails.removefromwatchlist": "Remove From Watchlist",
"components.MovieDetails.reportissue": "Report an Issue",
"components.MovieDetails.revenue": "Revenue",
"components.MovieDetails.rtaudiencescore": "Rotten Tomatoes Audience Score",
@@ -322,6 +324,9 @@
"components.MovieDetails.theatricalrelease": "Theatrical Release",
"components.MovieDetails.tmdbuserscore": "TMDB User Score",
"components.MovieDetails.viewfullcrew": "View Full Crew",
"components.MovieDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
"components.MovieDetails.watchlistError": "Something went wrong try again.",
"components.MovieDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
"components.MovieDetails.watchtrailer": "Watch Trailer",
"components.NotificationTypeSelector.adminissuecommentDescription": "Get notified when other users comment on issues.",
"components.NotificationTypeSelector.adminissuereopenedDescription": "Get notified when issues are reopened by other users.",
@@ -468,6 +473,7 @@
"components.RequestList.RequestItem.mediaerror": "{mediaType} Not Found",
"components.RequestList.RequestItem.modified": "Modified",
"components.RequestList.RequestItem.modifieduserdate": "{date} by {user}",
"components.RequestList.RequestItem.profileName": "Profile",
"components.RequestList.RequestItem.requested": "Requested",
"components.RequestList.RequestItem.requesteddate": "Requested",
"components.RequestList.RequestItem.seasons": "{seasonCount, plural, one {Season} other {Seasons}}",
@@ -952,7 +958,7 @@
"components.Settings.is4k": "4K",
"components.Settings.jellyfinForgotPasswordUrl": "Forgot Password URL",
"components.Settings.jellyfinSettings": "{mediaServerName} Settings",
"components.Settings.jellyfinSettingsDescription": "Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page.",
"components.Settings.jellyfinSettingsDescription": "Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page. You can also change the Jellyfin API key, which was automatically generated previously.",
"components.Settings.jellyfinSettingsFailure": "Something went wrong while saving {mediaServerName} settings.",
"components.Settings.jellyfinSettingsSuccess": "{mediaServerName} settings saved successfully!",
"components.Settings.jellyfinSyncFailedAutomaticGroupedFolders": "Custom authentication with Automatic Library Grouping not supported",
@@ -1060,6 +1066,7 @@
"components.StatusBadge.openinarr": "Open in {arr}",
"components.StatusBadge.playonplex": "Play on {mediaServerName}",
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
"components.StatusBadge.seasonnumber": "S{seasonNumber}",
"components.StatusBadge.status": "{status}",
"components.StatusBadge.status4k": "4K {status}",
"components.StatusChecker.appUpdated": "{applicationTitle} Updated",
@@ -1080,6 +1087,7 @@
"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",
"components.TvDetails.addtowatchlist": "Add To Watchlist",
"components.TvDetails.anime": "Anime",
"components.TvDetails.cast": "Cast",
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Episode} other {# Episodes}}",
@@ -1097,6 +1105,7 @@
"components.TvDetails.play4k": "Play 4K on {mediaServerName}",
"components.TvDetails.productioncountries": "Production {countryCount, plural, one {Country} other {Countries}}",
"components.TvDetails.recommendations": "Recommendations",
"components.TvDetails.removefromwatchlist": "Remove From Watchlist",
"components.TvDetails.reportissue": "Report an Issue",
"components.TvDetails.rtaudiencescore": "Rotten Tomatoes Audience Score",
"components.TvDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer",
@@ -1109,6 +1118,9 @@
"components.TvDetails.streamingproviders": "Currently Streaming On",
"components.TvDetails.tmdbuserscore": "TMDB User Score",
"components.TvDetails.viewfullcrew": "View Full Crew",
"components.TvDetails.watchlistDeleted": "<strong>{title}</strong> Removed from watchlist successfully!",
"components.TvDetails.watchlistError": "Something went wrong try again.",
"components.TvDetails.watchlistSuccess": "<strong>{title}</strong> added to watchlist successfully!",
"components.TvDetails.watchtrailer": "Watch Trailer",
"components.UserList.accounttype": "Type",
"components.UserList.admin": "Admin",

View File

@@ -201,7 +201,7 @@
"components.Settings.SonarrModal.animerootfolder": "Carpeta raíz de anime",
"components.Settings.SonarrModal.animequalityprofile": "Perfil de calidad de anime",
"components.Settings.SettingsAbout.timezone": "Zona horaria",
"components.Settings.SettingsAbout.supportoverseerr": "Apoya a Jellyseerr",
"components.Settings.SettingsAbout.supportoverseerr": "Apoya a Overseerr",
"components.Settings.SettingsAbout.helppaycoffee": "Ayúdame invitándome a un café",
"components.Settings.SettingsAbout.Releases.viewongithub": "Ver en GitHub",
"components.Settings.SettingsAbout.Releases.viewchangelog": "Ver registro de cambios",
@@ -299,14 +299,14 @@
"components.RequestButton.viewrequest": "Ver Solicitud",
"components.RequestButton.requestmore4k": "Solicitar más en 4K",
"components.RequestButton.requestmore": "Solicitar más",
"components.RequestButton.declinerequests": "Rechazar {requestCount, plural, one {solicitud} other {{requestCount} solicitudes}}",
"components.RequestButton.declinerequests": "Rechazar {requestCount, plural, one {Request} other {{requestCount} Requests}}",
"components.RequestButton.declinerequest4k": "Rechazar Solicitud 4K",
"components.RequestButton.declinerequest": "Rechazar Solicitud",
"components.RequestButton.decline4krequests": "Rechazar {requestCount, plural, one {solicitud en 4K} other {{requestCount} solicitudes en 4K}}",
"components.RequestButton.approverequests": "Aprobar {requestCount, plural, one {solicitud} other {{requestCount} solicitudes}}",
"components.RequestButton.decline4krequests": "Rechazar {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
"components.RequestButton.approverequests": "Aprobar {requestCount, plural, one {Request} other {{requestCount} Requests}}",
"components.RequestButton.approverequest4k": "Aprobar Solicitud 4K",
"components.RequestButton.approverequest": "Aprobar Solicitud",
"components.RequestButton.approve4krequests": "Aprobar {requestCount, plural, one {petición en 4K} other {requestCount} peticiones en 4K}}",
"components.RequestButton.approve4krequests": "Aprobar {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
"components.RequestBlock.server": "Servidor de Destino",
"components.RequestBlock.rootfolder": "Carpeta Raíz",
"components.RequestBlock.profilechanged": "Perfil de Calidad",
@@ -656,7 +656,7 @@
"components.QuotaSelector.unlimited": "Ilimitadas",
"components.MovieDetails.originaltitle": "Título Original",
"components.LanguageSelector.originalLanguageDefault": "Todos los Idiomas",
"components.LanguageSelector.languageServerDefault": "({Language}) por defecto",
"components.LanguageSelector.languageServerDefault": "({language}) por defecto",
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {cambio} other {cambios}} por detrás",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "Tu cuenta no tiene configurada una contraseña actualmente. Configure una contraseña a continuación para habilitar el acceso como \"usuario local\" utilizando tu dirección de email.",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "Esta cuenta de usuario no tiene configurada una contraseña actualmente. Configure una contraseña a continuación para habilitar el acceso como \"usuario local\"",
@@ -784,7 +784,7 @@
"components.DownloadBlock.estimatedtime": "Estimación de {time}",
"components.Settings.Notifications.encryptionOpportunisticTls": "Usa siempre STARTTLS",
"components.TvDetails.streamingproviders": "Emisión Actual en",
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "{{Language}} por defecto",
"components.UserProfile.UserSettings.UserGeneralSettings.languageDefault": "({language}) por defecto",
"components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "Para recibir notificaciones web push, Jellyseerr debe servirse mediante HTTPS.",
"components.Settings.Notifications.NotificationsWebhook.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
"components.Settings.Notifications.validationTypes": "Debes seleccionar, al menos, un tipo de notificación",
@@ -816,10 +816,10 @@
"components.Settings.Notifications.encryptionTip": "Normalmente, TLS Implícito usa el puerto 465 y STARTTLS usa el puerto 587",
"components.UserList.localLoginDisabled": "El ajuste para <strong>Habilitar el Inicio de Sesión Local</strong> está actualmente deshabilitado.",
"components.Settings.SettingsUsers.defaultPermissionsTip": "Permisos iniciales asignados a nuevos usuarios",
"components.Settings.SettingsAbout.runningDevelop": "Estás utilizando la rama de <code>develop</code> de Jellyseerr, la cual solo se recomienda para aquellos que contribuyen al desarrollo o al soporte de las pruebas de nuevos desarrollos.",
"components.Settings.SettingsAbout.runningDevelop": "Estás utilizando la rama de <code>desarrollo</code> de Jellyseerr, la cual solo se recomienda para aquellos que contribuyen al desarrollo o al soporte de las pruebas de nuevos desarrollos.",
"components.StatusBadge.status": "{status}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Cada {jobScheduleMinutes, plural, one {minuto} other {{jobScheduleMinutes} minutos}}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Cada {jobScheduleHours, plural, one {hora} other {{jobScheduleHours} horas}}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Cada {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Cada {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}",
"components.Settings.SettingsJobsCache.jobScheduleEditFailed": "Algo fue mal al guardar la tarea programada.",
"components.Settings.SettingsJobsCache.editJobSchedule": "Modificar tarea programada",
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Nueva frecuencia",
@@ -848,7 +848,7 @@
"components.IssueDetails.nocomments": "Sin comentarios.",
"components.IssueDetails.openedby": "#{issueId} abierta {relativeTime} por {username}",
"components.IssueDetails.openin4karr": "Abrir en {arr} 4K",
"components.IssueDetails.openinarr": "Abierta en {arr}",
"components.IssueDetails.openinarr": "Abrir en {arr}",
"components.IssueDetails.play4konplex": "Ver en 4K en {mediaServerName}",
"components.IssueDetails.playonplex": "Ver en {mediaServerName}",
"components.IssueDetails.problemepisode": "Episodio Afectado",
@@ -1193,7 +1193,7 @@
"components.RequestList.RequestItem.tvdbid": "Identificador de TheTVDB",
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Limpieza de la caché de imágenes",
"components.Settings.SettingsJobsCache.imagecache": "Caché de imágenes",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Cada {jobScheduleSeconds, plural, one {segundo} other {{jobScheduleSeconds} segundos}}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Cada {jobScheduleSeconds, plural, one {second} other {{jobScheduleSeconds} seconds}}",
"components.Settings.SettingsJobsCache.availability-sync": "Sincronización de la disponibilidad de medios",
"components.Discover.tmdbmoviestreamingservices": "Servicios de streaming de películas TMDB",
"components.Discover.tmdbtvstreamingservices": "Servicios de TV en streaming TMDB",
@@ -1205,10 +1205,110 @@
"components.Settings.RadarrModal.tagRequestsInfo": "Añadir automáticamente una etiqueta adicional con el nombre de usuario y el nombre para mostrar del solicitante",
"components.Settings.SonarrModal.tagRequestsInfo": "Añadir automáticamente una etiqueta adicional con el nombre de usuario y el nombre para mostrar del solicitante",
"components.MovieDetails.imdbuserscore": "Puntuación de los usuarios de IMDB",
"components.Settings.SonarrModal.animeSeriesType": "Tipo de anime",
"components.Settings.SonarrModal.seriesType": "Tipo de series",
"components.Settings.Notifications.NotificationsPushover.sound": "Sonido para las notificaciones",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Dispositivo predeterminado",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Sonido para las notificaciones",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Dispositivo predeterminado"
"components.Layout.UserWarnings.passwordRequired": "Se requiere una contraseña.",
"components.Login.credentialerror": "El usuario o contraseña es incorrecto.",
"components.Login.host": "{mediaServerName} URL",
"components.Login.initialsignin": "Conectar",
"components.Login.initialsigningin": "Conectando…",
"components.Login.emailtooltip": "No es necesario asociar la dirección con su instancia de {mediaServerName}.",
"components.Login.saving": "Añadiendo…",
"components.Login.title": "Añadir Email",
"components.Login.username": "Nombre de usuario",
"components.Login.validationEmailFormat": "El email es inválido",
"components.Login.validationEmailRequired": "Debes proporcional un email",
"components.Login.validationemailformat": "Se requiere de un email válido",
"components.Login.validationhostformat": "Se requiere de una URL válida",
"components.Login.validationusernamerequired": "Se requiere un nombre de usuario",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Esto eliminará de manera irreversible esta {mediaType} de {arr}, incluyendo todos los archivos.",
"i18n.open": "Abierto",
"components.MovieDetails.downloadstatus": "Estado de la descarga",
"components.MovieDetails.openradarr": "Abrir Película en Radarr",
"components.MovieDetails.openradarr4k": "Abrir Película 4K en Radarr",
"components.MovieDetails.play": "Reproducir en {mediaServerName}",
"components.MovieDetails.play4k": "Reproducir 4K en {mediaServerName}",
"components.NotificationTypeSelector.issueresolved": "Incidencia Resuelta",
"components.NotificationTypeSelector.userissuecommentDescription": "Notificame cuando haya nuevos comentarios en incidencias que haya abierto.",
"components.NotificationTypeSelector.userissuecreatedDescription": "Notificame cuando otros usuarios reporten incidencias.",
"components.PermissionEdit.viewissues": "Ver incidencias",
"components.PermissionEdit.manageissuesDescription": "Dar permiso para administrar incidencias.",
"components.PermissionEdit.viewissuesDescription": "Dar permiso para ver incidencias reportadas por otros usuarios.",
"components.Settings.Notifications.NotificationsPushover.sound": "Sonido de Notificacion",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Escanear Añadidos Recientemente de Jellyfin",
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Escaneo Completo de la libreria de Jellyfin",
"components.Settings.jellyfinSettings": "Ajustes de {mediaServerName}",
"components.Settings.jellyfinsettings": "Ajustes de {mediaServerName}",
"components.Settings.jellyfinSettingsFailure": "Algo salió mal al guardar la configuración de {mediaServerName}.",
"components.Settings.jellyfinSettingsSuccess": "¡La configuración de {mediaServerName} se guardó correctamente!",
"components.Settings.jellyfinlibraries": "Bibliotecas {mediaServerName}",
"components.Settings.jellyfinlibrariesDescription": "La biblioteca {mediaServerName} busca títulos. Haga clic en el botón a continuación si no aparece ninguna biblioteca.",
"components.Settings.manualscanDescriptionJellyfin": "Normalmente, esto sólo se ejecutará una vez cada 24 horas. Jellyseerr comprobará de forma más agresiva los añadidos recientemente de su servidor {mediaServerName}. ¡Si es la primera vez que configura Jellyseerr, se recomienda un escaneo manual completo de la biblioteca!",
"components.Settings.save": "Guardar Cambios",
"components.Settings.saving": "Guardando…",
"components.Settings.syncing": "Sincronizando",
"components.Settings.timeout": "Tiempo agotado",
"components.Setup.signinWithPlex": "Usa tu cuenta de Plex",
"components.Setup.configuremediaserver": "Configurar servidor multimedia",
"components.TitleCard.addToWatchList": "Añadir a lista de seguimiento",
"components.TitleCard.watchlistCancel": "Lista de seguimiento para <strong>{title}</strong> cancelada.",
"components.TitleCard.watchlistError": "Algo salió mal, intenta de nuevo.",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> añadido correctamente a la lista de seguimiento!",
"components.TvDetails.play": "Reproducir en {mediaServerName}",
"components.UserList.importfromJellyfin": "Importar Usuarios de {mediaServerName}",
"components.UserList.mediaServerUser": "Usuario de {mediaServerName}",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} importado correctamente!",
"components.UserList.importfromJellyfinerror": "Se produjo un error al importar usuarios de {mediaServerName}.",
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Guardar Cambios",
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Email",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Dispositivo Predeterminado",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Sonido de Notificacion",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingsfailed": "Fallo al guardar los ajustes de la notificación Pushbullet.",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingssaved": "¡Los ajustes de notificación Pushbullet se han guardado con éxito!",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationToken": "Token de aplicación API",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverUserKey": "Clave de usuario o grupo",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverUserKeyTip": "Tu <UsersGroupsLink>identificador de usuario o grupo</UsersGroupsLink> de 30 caracteres",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingssaved": "¡Se han guardado los ajustes de notificación de Pushover!",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationTokenTip": "<ApplicationRegistrationLink>Registrar una aplicación</ApplicationRegistrationLink> para usar con {applicationTitle}",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Debes proporcionar una clave de usuario o grupo válida",
"components.Login.validationhostrequired": "{mediaServerName} URL requerida",
"i18n.resolved": "Resuelto",
"components.UserList.importfrommediaserver": "Importar Usuarios de {mediaServerName}",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Dispositivo Predeterminado",
"components.ManageSlideOver.removearr": "Eliminar de {arr}",
"components.NotificationTypeSelector.issuereopenedDescription": "Enviar notificación cuando se reabran incidencias.",
"components.Layout.UserWarnings.emailRequired": "Se requiere una dirección de email.",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessToken": "Token de Acceso",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverApplicationToken": "Debes proporcionar un token de aplicación válido",
"components.Settings.syncJellyfin": "Sincronizar Bibliotecas",
"components.Layout.UserWarnings.emailInvalid": "La dirección de correo es inválida.",
"components.Login.description": "Como es la primera vez que inicias sesión en {applicationName}, es necesario añadir una dirección de email válida.",
"components.Login.save": "Añadir",
"components.NotificationTypeSelector.issueresolvedDescription": "Enviar notificación cuando se resuelvan incidencias.",
"components.PermissionEdit.manageissues": "Administrar incidencias",
"components.PermissionEdit.createissues": "Notificar incidencia",
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Guardando…",
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushbulletAccessToken": "Debes indicar un token de acceso",
"components.Login.signinwithjellyfin": "Utiliza tu cuenta de {mediaServerName}",
"components.ManageSlideOver.removearr4k": "Eliminar de {arr} 4K",
"components.Settings.internalUrl": "URL Interna",
"components.TvDetails.play4k": "Reproducir 4K en {mediaServerName}",
"components.Setup.signin": "Iniciar Sesión",
"components.Setup.signinWithJellyfin": "Utiliza tu cuenta de {mediaServerName}",
"components.UserList.noJellyfinuserstoimport": "No hay usuarios de {mediaServerName} que importar.",
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Usuario de {mediaServerName}",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "Crea un token desde tu <PushbulletSettingsLink>Opciones de Cuenta</PushbulletSettingsLink>",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingsfailed": "No se pudo guardar la configuración de notificaciones de Pushover.",
"components.NotificationTypeSelector.userissuereopenedDescription": "Recibir notificaciones cuando se vuelvan a abrir incidencias que haya reportado.",
"components.NotificationTypeSelector.userissueresolvedDescription": "Reciba notificaciones cuando se resuelvan las incidencias que haya reportado.",
"components.PermissionEdit.createissuesDescription": "Dar permiso para informar incidencias.",
"components.Settings.SettingsAbout.supportjellyseerr": "Apoya a Jellyseerr",
"components.Settings.Notifications.userEmailRequired": "Requerir email de usuario",
"components.Settings.SonarrModal.animeSeriesType": "Tipo de Serie Anime",
"components.Settings.SonarrModal.seriesType": "Tipo Serie",
"components.Settings.jellyfinSettingsDescription": "Opcionalmente, configure los puntos finales internos y externos para su servidor {mediaServerName}. En la mayoría de los casos, la URL externa es diferente a la URL interna. También se puede configurar una URL de restablecimiento de contraseña personalizada para el inicio de sesión de {mediaServerName}, en caso de que desee redirigir a una página de restablecimiento de contraseña diferente.",
"components.Settings.jellyfinsettingsDescription": "Configure los ajustes para su servidor {mediaServerName}. {mediaServerName} escanea sus bibliotecas de {mediaServerName} para ver qué contenido está disponible.",
"components.Settings.manualscanJellyfin": "Escanear Libreria Manualmente",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Eliminado correctamente de la lista de seguimiento!",
"components.UserList.newJellyfinsigninenabled": "La configuración <strong>Habilitar nuevo inicio de sesión de {mediaServerName}</strong> está actualmente habilitada. Los usuarios de {mediaServerName} con acceso a la biblioteca no necesitan ser importados para poder iniciar sesión.",
"components.UserProfile.localWatchlist": "Lista de seguimiento de {username}"
}

View File

@@ -59,7 +59,7 @@
"components.Discover.DiscoverTvGenre.genreSeries": "Séries {genre}",
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Séries",
"components.Discover.DiscoverTvLanguage.languageSeries": "Séries en {language}",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Votre watchlist Plex",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Votre watchlist",
"components.Discover.DiscoverWatchlist.watchlist": "Watchlist Plex",
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Filtre actif} other {# Filtres actifs}}",
"components.Discover.FilterSlideover.clearfilters": "Effacer les filtres actifs",
@@ -176,7 +176,7 @@
"components.Settings.RadarrModal.port": "Port",
"components.Settings.RadarrModal.qualityprofile": "Profil de qualité",
"components.Settings.RadarrModal.rootfolder": "Dossier racine",
"components.Settings.RadarrModal.selectMinimumAvailability": "Sélectionner une disponibilité minimale",
"components.Settings.RadarrModal.selectMinimumAvailability": "Sélectionner une disponibilté minimale",
"components.Settings.RadarrModal.selectQualityProfile": "Sélectionner un profil qualité",
"components.Settings.RadarrModal.selectRootFolder": "Sélectionner un dossier racine",
"components.Settings.RadarrModal.server4k": "Serveur 4K",
@@ -277,7 +277,7 @@
"i18n.tvshows": "Séries",
"i18n.unavailable": "Indisponible",
"pages.oops": "Oups",
"pages.returnHome": "Retourner à l'accueil",
"pages.returnHome": "Retourner à l'acceuil",
"components.TvDetails.TvCast.fullseriescast": "Casting complet de la série",
"components.MovieDetails.MovieCast.fullcast": "Casting complet",
"components.Settings.Notifications.emailsettingssaved": "Paramètres de notification par e-mail enregistrés avec succès !",
@@ -323,7 +323,7 @@
"components.Settings.SettingsAbout.Releases.viewchangelog": "Voir le journal des modifications",
"components.Settings.SettingsAbout.Releases.versionChangelog": "Journal des modifications de la version {version}",
"components.Settings.SettingsAbout.Releases.releases": "Versions",
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Les données de version sont actuellement indisponibles.",
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Les données de version sont actuellement indisponible.",
"components.Settings.SettingsAbout.Releases.latestversion": "Dernière version",
"components.Settings.SettingsAbout.Releases.currentversion": "Actuelle",
"components.UserList.importfromplexerror": "Une erreur s'est produite durant l'importation des utilisateurs de Plex.",
@@ -1071,7 +1071,7 @@
"components.ManageSlideOver.manageModalMedia4k": "Média(s) 4K",
"components.ManageSlideOver.markallseasons4kavailable": "Marquer toutes les saisons comme disponibles en 4K",
"components.ManageSlideOver.playedby": "Joué par",
"components.Settings.validationUrlTrailingSlash": "L'URL ne doit pas se terminer par un slash",
"components.Settings.validationUrlTrailingSlash": "L'URL ne doit pas ce terminer par un slash",
"components.Settings.externalUrl": "URL externe",
"components.Settings.tautulliApiKey": "Clé API",
"components.Settings.tautulliSettings": "Paramètres Tautulli",
@@ -1252,10 +1252,70 @@
"components.Settings.SonarrModal.tagRequestsInfo": "Ajouter automatiquement un tag supplémentaire avec l'ID utilisateur et le nom d'affichage du demandeur",
"i18n.collection": "Collection",
"components.Settings.RadarrModal.tagRequestsInfo": "Ajouter automatiquement un tag supplémentaire avec l'ID utilisateur et le nom d'affichage du demandeur",
"components.Settings.SonarrModal.seriesType": "Type de série",
"components.Settings.SonarrModal.animeSeriesType": "Types d'anime",
"components.IssueModal.issueVideo": "Vidéo",
"components.Settings.Notifications.NotificationsPushover.sound": "Son de notification",
"components.Settings.jellyfinSettings": "Paramètres pour {mediaServerName}",
"components.Settings.jellyfinSettingsFailure": "Une erreur est survenue lors de l'enregistrement des paramètres pour {mediaServerName}.",
"components.Settings.jellyfinSettingsSuccess": "Les paramètres pour {mediaServerName} ont été enregistrés avec succès!",
"components.Settings.jellyfinlibraries": "Bibliothèques {mediaServerName}",
"components.Settings.jellyfinlibrariesDescription": "Les bibliothèques de {mediaServerName} sont en cours d'analyze. Cliquez sur le bouton ci-dessous si aucune bibliothèque n'est répertoriée.",
"components.Settings.jellyfinsettings": "Paramètres pour {mediaServerName}",
"components.Settings.manualscanJellyfin": "Analyse manuelle de la bibliothèque",
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
"components.Settings.save": "Enregistrer les modifications",
"components.Settings.saving": "Sauvegarde en cours…",
"components.Settings.syncing": "Synchronisation en cours",
"components.Setup.signin": "Se connecter",
"components.Setup.signinWithPlex": "Utilisez votre compte Plex",
"components.StatusBadge.managemedia": "Gérer {mediaType}",
"components.StatusBadge.openinarr": "Ouvrir dans {arr}",
"components.StatusBadge.playonplex": "Lire sur {mediaServerName}",
"components.TitleCard.addToWatchList": "Ajouter à votre watchlist",
"components.TitleCard.watchlistCancel": "Watchlist pour <strong>{title}</strong> annulée.",
"components.TitleCard.watchlistError": "Une erreur est survenue. Veuillez réessayer.",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> a été ajouté à votre watchlist avec succès !",
"components.TvDetails.Season.somethingwentwrong": "Une erreur est survenue lors de la récupération des données de la saison.",
"components.TvDetails.manageseries": "Gérer les séries",
"components.TvDetails.play": "Jouer sur {mediaServerName}",
"components.TvDetails.play4k": "Jouer en 4K sur {mediaServerName}",
"components.TvDetails.rtcriticsscore": "Tomatometer sur Rotten Tomatoes",
"components.TvDetails.seasonnumber": "Saison {seasonNumber}",
"components.TvDetails.seasonstitle": "Saisons",
"components.TvDetails.status4k": "{status} 4K",
"components.TvDetails.tmdbuserscore": "Score utilisateur sur TMDB",
"components.UserList.importfromJellyfin": "Importer les utilisateurs de {mediaServerName}",
"components.UserList.importfromJellyfinerror": "Une erreur est survenue lors de l'importation des utilisateurs de {mediaServerName}.",
"components.UserList.importfrommediaserver": "Importer les utilisateurs de {mediaServerName}",
"components.UserList.noJellyfinuserstoimport": "Il n'y a aucun utilisateur à importer pour {mediaServerName}.",
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Sauvegarde en cours…",
"components.UserProfile.plexwatchlist": "Watchlist Plex",
"components.Settings.syncJellyfin": "Synchroniser les bibliothèques",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> a été retiré de votre watchlist avec succès !",
"components.IssueModal.issueSubtitles": "Sous-titre",
"components.Login.emailtooltip": "L'adresse ne nécessite pas d'être associée avec votre instance {mediaServerName}.",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Appareil par défaut",
"components.Settings.Notifications.userEmailRequired": "E-mail utilisateur requis",
"components.Settings.SettingsAbout.supportjellyseerr": "Soutenez Jellyseerr",
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Scan complet des bibliothèques Jellyfin",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan des ajouts récents aux bibliothèques Jellyfin",
"components.Settings.SonarrModal.animeSeriesType": "Type de série anime",
"components.Settings.SonarrModal.seriesType": "Type de série",
"components.Settings.internalUrl": "URL interne",
"components.Settings.jellyfinsettingsDescription": "Configurez les paramètres de votre serveur {mediaServerName}. {mediaServerName} analyse vos bibliothèques {mediaServerName} pour voir quel contenu est disponible.",
"components.Settings.jellyfinSettingsDescription": "Configurez facultativement les URL internes et externes pour votre serveur {mediaServerName}. Dans la plupart des cas, l'URL externe est différente de l'URL interne. Vous pouvez également définir une URL de réinitialisation de mot de passe personnalisée pour la connexion à {mediaServerName}, au cas où vous souhaiteriez rediriger vers une page de réinitialisation de mot de passe différente.",
"components.Settings.manualscanDescriptionJellyfin": "Normalement, cette tâche est executée qu'une fois toutes les 24 heures. Jellyseerr vérifiera plus agressivement les éléments récemment ajoutés à votre serveur {mediaServerName}. Si c'est la première fois que vous configurez Jellyseerr, une analyse complète manuelle de la bibliothèque est recommandée !",
"components.Settings.timeout": "Temps écoulé",
"components.Setup.configuremediaserver": "Configurer le serveur multimédia",
"components.TvDetails.rtaudiencescore": "Score de l'audience sur Rotten Tomatoes",
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Utilisateur pour {mediaServerName}",
"components.Setup.signinWithJellyfin": "Utilisez votre compte {mediaServerName}",
"components.UserList.mediaServerUser": "Utilisateur de {mediaServerName}",
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Épisode} other {# Épisodes}}",
"components.UserList.newJellyfinsigninenabled": "Le paramètre <strong>Activer la nouvelle connexion à {mediaServerName}</strong> est actuellement activé. Les utilisateurs de {mediaServerName} avec accès à la bibliothèque n'ont pas besoin d'être importés pour se connecter.",
"components.UserProfile.UserSettings.UserGeneralSettings.email": "E-mail",
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Enregistrer les modifications",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Appareil par défaut",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} importé(s) avec succès !",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Son de notification",
"components.Settings.Notifications.NotificationsPushover.sound": "Son de notification"
"components.UserProfile.localWatchlist": "Watchlist de {username}"
}

File diff suppressed because it is too large Load Diff

View File

@@ -3,12 +3,12 @@
"components.Discover.discovertv": "Populaire series",
"components.Discover.popularmovies": "Populaire films",
"components.Discover.populartv": "Populaire series",
"components.Discover.recentlyAdded": "Recent toegevoegd",
"components.Discover.recentlyAdded": "Onlangs toegevoegd",
"components.Discover.recentrequests": "Recente verzoeken",
"components.Discover.trending": "Trending",
"components.Discover.upcoming": "Verwachte films",
"components.Discover.upcomingmovies": "Verwachte films",
"components.Layout.SearchInput.searchPlaceholder": "Zoek films en series",
"components.Layout.SearchInput.searchPlaceholder": "Films en series zoeken",
"components.Layout.Sidebar.dashboard": "Ontdekken",
"components.Layout.Sidebar.requests": "Verzoeken",
"components.Layout.Sidebar.settings": "Instellingen",
@@ -16,7 +16,7 @@
"components.Layout.UserDropdown.signout": "Uitloggen",
"components.MovieDetails.budget": "Budget",
"components.MovieDetails.cast": "Cast",
"components.MovieDetails.originallanguage": "Originele taal",
"components.MovieDetails.originallanguage": "Oorspronkelijke taal",
"components.MovieDetails.overview": "Overzicht",
"components.MovieDetails.overviewunavailable": "Overzicht niet beschikbaar.",
"components.MovieDetails.recommendations": "Aanbevelingen",
@@ -114,7 +114,7 @@
"components.Settings.hostname": "Hostnaam of IP-adres",
"components.Settings.librariesRemaining": "Resterende bibliotheken: {count}",
"components.Settings.manualscan": "Handmatige bibliotheekscan",
"components.Settings.manualscanDescription": "Normaal wordt dit eens elke 24 uur uitgevoerd. Jellyseerr controleert de recent toegevoegde items van je Plex-server agressiever. Als je Plex voor de eerste keer configureert, is een eenmalige handmatige volledige bibliotheekscan aanbevolen!",
"components.Settings.manualscanDescription": "Normaliter wordt dit eenmaal per 24 uur uitgevoerd. Jellyseerr zal de lijst met onlangs toegevoegde media op je Plex-server vaker controleren. Als dit de eerste keer is dat je Jellyseerr instelt, wordt aanbevolen eenmalig een handmatige, volledige bibliotheekscan uit te voeren!",
"components.Settings.menuAbout": "Over",
"components.Settings.menuGeneralSettings": "Algemeen",
"components.Settings.menuJobs": "Taken en cache",
@@ -127,7 +127,7 @@
"components.Settings.plexlibraries": "Plex-bibliotheken",
"components.Settings.plexlibrariesDescription": "De bibliotheken die Jellyseerr scant voor titels. Stel je Plex-verbinding in en sla ze op. Klik daarna op de onderstaande knop als er geen bibliotheken staan.",
"components.Settings.plexsettings": "Plex-instellingen",
"components.Settings.plexsettingsDescription": "Configureer de instellingen voor je Plex-server. Jellyseerr scant je Plex-bibliotheken om te zien welke content beschikbaar is.",
"components.Settings.plexsettingsDescription": "Configureer de instellingen voor je Plex-server. Jellyseerr scant je Plex-bibliotheken om te zien welke inhoud beschikbaar is.",
"components.Settings.port": "Poort",
"components.Settings.radarrsettings": "Radarr-instellingen",
"components.Settings.sonarrsettings": "Sonarr-instellingen",
@@ -137,12 +137,12 @@
"components.Setup.configureservices": "Diensten configureren",
"components.Setup.continue": "Doorgaan",
"components.Setup.finish": "Installatie voltooien",
"components.Setup.finishing": "Bezig met voltooien…",
"components.Setup.finishing": "Voltooien…",
"components.Setup.loginwithplex": "Inloggen met Plex",
"components.Setup.signinMessage": "Ga aan de slag door in te loggen met je Plex-account",
"components.Setup.signinMessage": "Ga aan de slag door je aan te melden",
"components.Setup.welcome": "Welkom bij Jellyseerr",
"components.TvDetails.cast": "Cast",
"components.TvDetails.originallanguage": "Originele taal",
"components.TvDetails.originallanguage": "Oorspronkelijke taal",
"components.TvDetails.overview": "Overzicht",
"components.TvDetails.overviewunavailable": "Overzicht niet beschikbaar.",
"components.TvDetails.recommendations": "Aanbevelingen",
@@ -164,7 +164,7 @@
"i18n.movies": "Films",
"i18n.partiallyavailable": "Deels beschikbaar",
"i18n.pending": "In behandeling",
"i18n.processing": "Bezig met verwerken",
"i18n.processing": "Verwerken",
"i18n.tvshows": "Series",
"i18n.unavailable": "Niet beschikbaar",
"pages.oops": "Oeps",
@@ -187,14 +187,14 @@
"components.Setup.tip": "Tip",
"components.Settings.SonarrModal.testFirstRootFolders": "Test verbinding om hoofdmappen te laden",
"components.Settings.SonarrModal.testFirstQualityProfiles": "Test verbinding om kwaliteitsprofielen te laden",
"components.Settings.SonarrModal.loadingrootfolders": "Bezig met laden van hoofdmappen…",
"components.Settings.SonarrModal.loadingprofiles": "Bezig met laden van kwaliteitsprofielen…",
"components.Settings.SonarrModal.loadingrootfolders": "Hoofdmappen laden…",
"components.Settings.SonarrModal.loadingprofiles": "Kwaliteitsprofielen laden…",
"components.Settings.SettingsAbout.gettingsupport": "Ondersteuning krijgen",
"components.Settings.RadarrModal.validationMinimumAvailabilityRequired": "Je moet een minimale beschikbaarheid selecteren",
"components.Settings.RadarrModal.testFirstRootFolders": "Test verbinding om hoofdmappen te laden",
"components.Settings.RadarrModal.testFirstQualityProfiles": "Test verbinding om kwaliteitsprofielen te laden",
"components.Settings.RadarrModal.loadingrootfolders": "Bezig met laden van hoofdmappen…",
"components.Settings.RadarrModal.loadingprofiles": "Bezig met laden van kwaliteitsprofielen…",
"components.Settings.RadarrModal.loadingrootfolders": "Hoofdmappen laden…",
"components.Settings.RadarrModal.loadingprofiles": "Kwaliteitsprofielen laden…",
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Versiegegevens zijn momenteel niet beschikbaar.",
"components.Settings.SettingsAbout.Releases.latestversion": "Nieuwste",
"components.Settings.SettingsAbout.Releases.currentversion": "Huidig",
@@ -208,7 +208,7 @@
"i18n.retry": "Opnieuw proberen",
"i18n.requested": "Aangevraagd",
"i18n.failed": "Mislukt",
"i18n.deleting": "Bezig met verwijderen…",
"i18n.deleting": "Verwijderen…",
"i18n.close": "Sluiten",
"components.UserList.userdeleteerror": "Er ging iets mis bij het verwijderen van de gebruiker.",
"components.UserList.userdeleted": "Gebruiker succesvol verwijderd!",
@@ -223,7 +223,7 @@
"components.TvDetails.network": "{networkCount, plural, one {Netwerk} other {Netwerken}}",
"components.TvDetails.firstAirDate": "Datum eerste uitzending",
"components.TvDetails.anime": "Anime",
"components.StatusChacker.reloadOverseerr": "Herladen",
"components.StatusChacker.reloadJellyseerr": "Herladen",
"components.StatusChacker.newversionavailable": "Toepassingsupdate",
"components.StatusChacker.newversionDescription": "Jellyseerr is geüpdatet! Klik op de onderstaande knop om de pagina opnieuw te laden.",
"components.Settings.toastSettingsSuccess": "Instellingen succesvol opgeslagen!",
@@ -303,10 +303,10 @@
"components.UserList.create": "Aanmaken",
"components.UserList.createlocaluser": "Lokale gebruiker aanmaken",
"components.UserList.usercreatedfailed": "Er ging iets mis bij het aanmaken van de gebruiker.",
"components.UserList.creating": "Bezig met aanmaken…",
"components.UserList.creating": "Aanmaken…",
"components.UserList.validationpasswordminchars": "Wachtwoord is te kort; moet minimaal 8 tekens bevatten",
"components.UserList.usercreatedsuccess": "Gebruiker succesvol aangemaakt!",
"components.UserList.passwordinfodescription": "Configureer een applicatie-URL en schakel e-mailmeldingen in om automatische wachtwoordgeneratie mogelijk te maken.",
"components.UserList.passwordinfodescription": "Stel een applicatie-URL in en schakel e-mailmeldingen in om automatische wachtwoordgeneratie mogelijk te maken.",
"components.UserList.password": "Wachtwoord",
"components.UserList.localuser": "Lokale gebruiker",
"components.UserList.email": "E-mailadres",
@@ -340,23 +340,23 @@
"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…",
"components.Login.signingin": "Aanmelden…",
"components.Login.signin": "Inloggen",
"components.Settings.notificationAgentSettingsDescription": "Meldingsagenten configureren en inschakelen.",
"components.PlexLoginButton.signinwithplex": "Inloggen",
"components.PlexLoginButton.signingin": "Bezig met inloggen…",
"components.PlexLoginButton.signingin": "Aanmelden…",
"components.PermissionEdit.advancedrequest": "Geavanceerde aanvragen",
"components.PermissionEdit.admin": "Beheerder",
"components.UserList.userssaved": "Gebruikersrechten succesvol opgeslagen!",
"components.Settings.toastPlexRefreshSuccess": "Serverlijst van Plex succesvol opgehaald!",
"components.Settings.toastPlexRefresh": "Bezig met serverlijst ophalen van Plex…",
"components.Settings.toastPlexConnecting": "Bezig met verbinden met Plex-server…",
"components.Settings.toastPlexConnecting": "Verbinden met Plex…",
"components.UserList.bulkedit": "Meerdere bewerken",
"components.Settings.toastPlexRefreshFailure": "Kan serverlijst van Plex niet ophalen.",
"components.Settings.toastPlexConnectingSuccess": "Succesvol verbonden met Plex-server!",
"components.Settings.toastPlexConnectingFailure": "Kan geen verbinding maken met Plex.",
"components.Settings.settingUpPlexDescription": "Om Plex in te stellen, kan je de gegevens handmatig invoeren of een server selecteren die is opgehaald van <RegisterPlexTVLink>plex.tv</RegisterPlexTVLink>. Druk op de knop rechts van de vervolgkeuzelijst om de lijst van beschikbare servers op te halen.",
"components.Settings.serverpresetRefreshing": "Bezig met servers ophalen…",
"components.Settings.serverpresetRefreshing": "Servers ophalen…",
"components.Settings.serverpresetManualMessage": "Handmatige configuratie",
"components.Settings.serverpresetLoad": "Klik op de knop om de beschikbare servers te laden",
"components.Settings.serverpreset": "Server",
@@ -431,7 +431,7 @@
"components.RequestModal.AdvancedRequester.requestas": "Aanvragen als",
"components.Discover.discover": "Ontdekken",
"components.Settings.validationApplicationTitle": "Je moet een toepassingstitel opgeven",
"components.AppDataWarning.dockerVolumeMissingDescription": "De volumekoppeling <code>{appDataPath}</code> was niet correct geconfigureerd. Alle gegevens zullen worden gewist wanneer de container wordt gestopt of opnieuw wordt gestart.",
"components.AppDataWarning.dockerVolumeMissingDescription": "De volumekoppeling <code>{appDataPath}</code> is niet correct geconfigureerd. Alle gegevens zullen worden gewist wanneer de container wordt gestopt of opnieuw wordt gestart.",
"components.Settings.validationApplicationUrlTrailingSlash": "URL mag niet eindigen op een schuine streep",
"components.Settings.validationApplicationUrl": "Je moet een geldige URL opgeven",
"components.Settings.SonarrModal.validationApplicationUrlTrailingSlash": "URL mag niet eindigen op een schuine streep",
@@ -520,7 +520,7 @@
"components.Layout.UserDropdown.myprofile": "Profiel",
"components.UserProfile.UserSettings.UserNotificationSettings.validationDiscordId": "Je moet een geldige gebruikers-ID opgeven",
"components.UserProfile.UserSettings.UserNotificationSettings.discordIdTip": "Het <FindDiscordIdLink>meercijferige ID-nummer</FindDiscordIdLink> van je gebruikersaccount",
"components.CollectionDetails.requestcollection4k": "Collectie in 4K aanvragen",
"components.CollectionDetails.requestcollection4k": "Collectie aanvragen in 4K",
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Inhoud filteren op regionale beschikbaarheid",
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Regio van Ontdekken",
"components.UserProfile.UserSettings.UserGeneralSettings.originallanguageTip": "Inhoud filteren op oorspronkelijke taal",
@@ -546,7 +546,7 @@
"components.Settings.SettingsJobsCache.download-sync-reset": "Reset download sync",
"components.Settings.SettingsJobsCache.download-sync": "Synchronisatie downloads",
"components.TvDetails.seasons": "{seasonCount, plural, one {# seizoen} other {# seizoenen}}",
"i18n.loading": "Bezig met laden…",
"i18n.loading": "Laden…",
"components.UserProfile.UserSettings.UserNotificationSettings.validationTelegramChatId": "Je moet een geldige chat-ID opgeven",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatIdTipLong": "<TelegramBotLink>Een chat starten</TelegramBotLink>, <GetIdBotLink>@get_id_bot</GetIdBotLink> toevoegen en de opdracht <code>/my_id</code> geven",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatId": "Chat-ID",
@@ -558,14 +558,14 @@
"components.Discover.DiscoverNetwork.networkSeries": "Series van {network}",
"components.Discover.DiscoverMovieGenre.genreMovies": "{genre} films",
"components.Setup.scanbackground": "Het scannen wordt op de achtergrond uitgevoerd. Je kunt in de tussentijd doorgaan met het installatieproces.",
"components.Settings.scanning": "Bezig met synchroniseren…",
"components.Settings.scanning": "Synchroniseren…",
"components.Settings.scan": "Bibliotheken synchroniseren",
"components.Settings.SettingsJobsCache.sonarr-scan": "Sonarr-scan",
"components.Settings.SettingsJobsCache.radarr-scan": "Radarr-scan",
"components.Settings.SettingsJobsCache.plex-recently-added-scan": "Plex recent toegevoegde scan",
"components.Settings.SettingsJobsCache.plex-full-scan": "Plex volledige bibliotheekscan",
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "volledige bibliotheekscan Jellyfin",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Jellyfin recent toegevoegde scan",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Scan van 'onlangs toegevoegd' in Jellyfin",
"components.Settings.Notifications.validationUrl": "Je moet een geldige URL opgeven",
"components.Settings.Notifications.botAvatarUrl": "URL bot-avatar",
"components.RequestList.RequestItem.requested": "Aangevraagd",
@@ -670,27 +670,27 @@
"components.QuotaSelector.unlimited": "Onbeperkt",
"i18n.view": "Bekijken",
"i18n.tvshow": "Serie",
"i18n.testing": "Bezig met testen…",
"i18n.testing": "Testen…",
"i18n.test": "Test",
"i18n.status": "Status",
"i18n.showingresults": "<strong>{from}</strong> tot <strong>{to}</strong> van de <strong>{total}</strong> resultaten worden weergegeven",
"i18n.saving": "Bezig met opslaan…",
"i18n.saving": "Opslaan…",
"i18n.save": "Wijzigingen opslaan",
"i18n.resultsperpage": "{pageSize} resultaten per pagina weergeven",
"i18n.requesting": "Bezig met aanvragen…",
"i18n.requesting": "Aanvragen…",
"i18n.request4k": "Aanvragen in 4K",
"i18n.previous": "Vorige",
"i18n.notrequested": "Niet aangevraagd",
"i18n.noresults": "Geen resultaten.",
"i18n.next": "Volgende",
"i18n.movie": "Film",
"i18n.canceling": "Bezig met annuleren…",
"i18n.canceling": "Annuleren…",
"i18n.back": "Terug",
"i18n.areyousure": "Weet je het zeker?",
"i18n.all": "Alle",
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Deze gebruiker heeft nog minstens <strong>{seasons}</strong> {seasons, plural, one {seizoensverzoek} other {seizoensverzoeken}} nodig om deze serie aan te vragen.",
"components.TvDetails.originaltitle": "Originele titel",
"components.MovieDetails.originaltitle": "Originele titel",
"components.TvDetails.originaltitle": "Oorspronkelijke titel",
"components.MovieDetails.originaltitle": "Oorspronkelijke titel",
"components.LanguageSelector.originalLanguageDefault": "Alle talen",
"components.LanguageSelector.languageServerDefault": "Standaard ({language})",
"components.Settings.SonarrModal.testFirstTags": "Test de verbinding om labels te laden",
@@ -733,9 +733,9 @@
"components.RequestModal.pendingapproval": "Je verzoek is in afwachting van goedkeuring.",
"components.RequestList.RequestItem.cancelRequest": "Verzoek annuleren",
"components.NotificationTypeSelector.notificationTypes": "Meldingtypes",
"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.noPasswordSetOwnAccount": "Er is voor jouw account momenteel geen wachtwoord ingesteld. Configureer hieronder een wachtwoord om in te kunnen loggen als een \"lokale gebruiker\" met je 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.",
"components.Settings.serviceSettingsDescription": "Stel je {serverType}-server(s) hieronder in. 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 goedkeuring de server aanpassen die voor nieuwe aanvragen gebruikt wordt.",
"components.Settings.noDefaultServer": "Ten minste één {serverType} server moet als standaard worden gemarkeerd om {mediaType}verzoeken te kunnen verwerken.",
"components.Settings.noDefaultNon4kServer": "Als je slechts één enkele {serverType} server hebt voor zowel niet-4K als 4K-inhoud (of als je alleen 4K-inhoud downloadt), dan moet je {serverType} server <strong>NIET</strong> aangeduid worden als een 4K-server.",
"components.Settings.mediaTypeSeries": "serie",
@@ -747,7 +747,7 @@
"components.Layout.VersionStatus.outofdate": "Verouderd",
"components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} achter",
"components.UserList.autogeneratepasswordTip": "Een door de server gegenereerd wachtwoord naar de gebruiker e-mailen",
"i18n.retrying": "Bezig met opnieuw proberen…",
"i18n.retrying": "Opnieuw proberen…",
"components.Settings.serverSecure": "veilig",
"components.UserList.usercreatedfailedexisting": "Het opgegeven e-mailadres wordt al gebruikt door een andere gebruiker.",
"components.RequestModal.edit": "Verzoek bewerken",
@@ -847,7 +847,7 @@
"components.NotificationTypeSelector.usermediadeclinedDescription": "Een melding ontvangen wanneer je mediaverzoeken worden geweigerd.",
"components.NotificationTypeSelector.usermediaavailableDescription": "Een melding ontvangen wanneer je mediaverzoeken beschikbaar zijn.",
"components.NotificationTypeSelector.usermediaAutoApprovedDescription": "Een melding ontvangen wanneer andere gebruikers nieuwe mediaverzoeken indienen die automatisch worden goedgekeurd.",
"components.Settings.SettingsAbout.betawarning": "Dit is BETA software. Functies kunnen kapot en/of instabiel zijn. Meld eventuele problemen op GitHub!",
"components.Settings.SettingsAbout.betawarning": "Dit is BETA-software. Functies kunnen kapot en/of instabiel zijn. Meld eventuele problemen op GitHub!",
"components.Layout.LanguagePicker.displaylanguage": "Weergavetaal",
"components.MovieDetails.showmore": "Meer tonen",
"components.MovieDetails.showless": "Minder tonen",
@@ -971,7 +971,7 @@
"components.UserProfile.UserSettings.UserNotificationSettings.validationPushoverUserKey": "Je moet een geldige gebruikers- of groepssleutel opgeven",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletsettingssaved": "Instellingen voor Pushbullet-meldingen succesvol opgeslagen!",
"components.IssueDetails.playonplex": "Afspelen op {mediaServerName}",
"components.IssueDetails.play4konplex": "Afspelen in 4K op {mediaServerName}",
"components.IssueDetails.play4konplex": "Afspelen op {mediaServerName} in 4K",
"components.IssueDetails.openin4karr": "Openen in 4K {arr}",
"components.IssueList.IssueItem.episodes": "{episodeCount, plural, one {aflevering} other {afleveringen}}",
"components.IssueList.IssueItem.seasons": "{seasonCount, plural, one {seizoen} other {seizoenen}}",
@@ -982,7 +982,7 @@
"components.NotificationTypeSelector.adminissuereopenedDescription": "Ontvang een melding wanneer problemen door andere gebruikers opnieuw worden ingediend.",
"components.NotificationTypeSelector.issuereopenedDescription": "Stuur meldingen wanneer problemen opnieuw worden ingediend.",
"components.NotificationTypeSelector.userissuereopenedDescription": "Ontvang een bericht wanneer problemen die jij hebt gemeld, opnieuw worden ingediend.",
"components.RequestModal.requestseasons4k": "{seasonCount} {seasonCount, plural, one {seizoen} other {seizoenen}} in 4K aanvragen",
"components.RequestModal.requestseasons4k": "{seasonCount} {seasonCount, plural, one {seizoen} other {seizoenen}} aanvragen in 4K",
"components.RequestModal.requestmovies": "{count} {count, plural, one {film} other {films}} aanvragen",
"components.RequestModal.selectmovies": "Film(s) selecteren",
"components.MovieDetails.productioncountries": "Productie{countryCount, plural, one {land} other {landen}}",
@@ -998,7 +998,7 @@
"components.Settings.Notifications.NotificationsGotify.agentenabled": "Agent inschakelen",
"components.Settings.Notifications.NotificationsGotify.gotifysettingssaved": "Instellingen voor meldingen Gotify succesvol opgeslagen!",
"components.Settings.Notifications.NotificationsGotify.token": "Toepassingstoken",
"i18n.importing": "Bezig met importeren…",
"i18n.importing": "Importeren…",
"components.Settings.Notifications.NotificationsGotify.gotifysettingsfailed": "Instellingen voor meldingen Gotify niet opgeslagen.",
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestFailed": "Testmelding Gotify niet verzonden.",
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSuccess": "Testmelding Gotify verzonden!",
@@ -1012,7 +1012,7 @@
"components.UserList.newplexsigninenabled": "De instelling <strong>Nieuwe Plex-aanmelding inschakelen</strong> is momenteel ingeschakeld. Plex-gebruikers met bibliotheektoegang hoeven niet te worden geïmporteerd om in te loggen.",
"components.ManageSlideOver.manageModalAdvanced": "Geavanceerd",
"components.ManageSlideOver.alltime": "Altijd",
"components.ManageSlideOver.markallseasons4kavailable": "Alle seizoenen als beschikbaar in 4K markeren",
"components.ManageSlideOver.markallseasons4kavailable": "Alle seizoenen markeren als beschikbaar in 4K",
"components.ManageSlideOver.opentautulli": "In Tautulli openen",
"components.ManageSlideOver.pastdays": "Afgelopen {days, number} dagen",
"components.ManageSlideOver.playedby": "Afgespeeld door",
@@ -1046,8 +1046,8 @@
"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.PermissionEdit.viewrecentDescription": "Toestemming geven om de lijst met onlangs toegevoegde media weer te geven.",
"components.PermissionEdit.viewrecent": "Onlangs toegevoegd weergeven",
"components.Settings.deleteServer": "{serverType}-server verwijderen",
"components.StatusChecker.appUpdated": "{applicationTitle} bijgewerkt",
"components.RequestList.RequestItem.tmdbid": "TMDB ID",
@@ -1072,8 +1072,8 @@
"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.Discover.DiscoverWatchlist.discoverwatchlist": "Jouw kijklijst",
"components.Discover.plexwatchlist": "Jouw kijklijst",
"components.MovieDetails.physicalrelease": "Fysieke release",
"components.PermissionEdit.autorequest": "Automatisch aanvragen",
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Plex Kijklijst synchroniseren",
@@ -1099,7 +1099,7 @@
"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.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",
@@ -1152,8 +1152,8 @@
"components.Discover.DiscoverSliderEdit.remove": "Verwijderen",
"components.Discover.resetfailed": "Er is iets fout gegaan bij het resetten van de instellingen van Ontdekken.",
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Media die zijn toegevoegd aan je <PlexWatchlistSupportLink>Plex Kijklijst</PlexWatchlistSupportLink> verschijnen hier.",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Je Plex Kijklijst",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Recent toegevoegd",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Jouw kijklijst",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Onlangs toegevoegd",
"components.Discover.networks": "Netwerken",
"components.Discover.CreateSlider.searchStudios": "Studio's zoeken…",
"components.Discover.CreateSlider.starttyping": "Begin met typen om te zoeken.",
@@ -1184,8 +1184,8 @@
"components.Discover.DiscoverMovies.sortPopularityAsc": "Populariteit oplopend",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Populariteit aflopend",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Releasedatum oplopend",
"components.Discover.DiscoverMovies.sortTitleAsc": "Titel (A-Z) oplopend",
"components.Discover.DiscoverMovies.sortTitleDesc": "Titel (Z-A) aflopend",
"components.Discover.DiscoverMovies.sortTitleAsc": "Titel oplopend (A-Z)",
"components.Discover.DiscoverMovies.sortTitleDesc": "Titel aflopend (Z-A)",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "TMDB-beoordeling oplopend",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "TMDB-beoordeling aflopend",
"components.Discover.DiscoverSliderEdit.deletefail": "Slider verwijderen mislukt.",
@@ -1202,7 +1202,7 @@
"components.Discover.FilterSlideover.from": "Van",
"components.Discover.FilterSlideover.genres": "Genres",
"components.Discover.FilterSlideover.keywords": "Trefwoorden",
"components.Discover.FilterSlideover.originalLanguage": "Originele taal",
"components.Discover.FilterSlideover.originalLanguage": "Oorspronkelijke taal",
"components.Discover.FilterSlideover.ratingText": "Beoordelingen tussen {minValue} en {maxValue}",
"components.Discover.FilterSlideover.releaseDate": "Releasedatum",
"components.Discover.FilterSlideover.runtime": "Duur",
@@ -1262,18 +1262,87 @@
"components.Settings.SettingsJobsCache.availability-sync": "Synchronisatie van mediabeschikbaarheid",
"components.Discover.tmdbmoviestreamingservices": "Streamingdiensten voor films TMDB",
"components.Discover.tmdbtvstreamingservices": "Streamingdiensten voor series TMDB",
"components.Discover.FilterSlideover.tmdbuservotecount": "Aantal stemmen TMDB-gebruikers",
"components.Discover.FilterSlideover.voteCount": "Aantal stemmen tussen {minValue} en {maxValue}",
"components.Settings.RadarrModal.tagRequests": "Tagverzoeken",
"components.Settings.RadarrModal.tagRequestsInfo": "Voeg automatisch een extra tag toe met de gebruikers-ID en weergavenaam van de aanvrager",
"components.MovieDetails.imdbuserscore": "Gebruikersscore IMDB",
"components.Settings.SonarrModal.tagRequests": "Tagverzoeken",
"components.Settings.SonarrModal.tagRequestsInfo": "Voeg automatisch een extra tag toe met de gebruikers-ID en weergavenaam van de aanvrager",
"i18n.collection": "Collectie",
"components.Settings.Notifications.NotificationsPushover.sound": "Meldingsgeluid",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Apparaatstandaard",
"components.Login.validationhostrequired": "{mediaServerName}-URL vereist",
"components.Layout.UserWarnings.emailInvalid": "E-mailadres is ongeldig.",
"components.Login.description": "Aangezien dit de eerste keer is dat je je aanmeldt bij {applicationName}, dien je een geldig e-mailadres op te geven.",
"components.Login.saving": "Toevoegen…",
"components.ManageSlideOver.removearr": "Verwijderen van {arr}",
"components.Settings.RadarrModal.tagRequests": "Aanvragen taggen",
"components.MovieDetails.openradarr4k": "Film openen in 4K-Radarr",
"components.Settings.RadarrModal.tagRequestsInfo": "Automatisch een extra label toevoegen met de gebruikers-id en weergavenaam van de aanvrager",
"components.Settings.SonarrModal.animeSeriesType": "Serietype anime",
"components.Settings.SonarrModal.tagRequestsInfo": "Automatisch een extra label toevoegen met de gebruikers-id en weergavenaam van de aanvrager",
"components.Settings.internalUrl": "Interne URL",
"components.Settings.jellyfinsettings": "{mediaServerName}-instellingen",
"components.Settings.jellyfinlibrariesDescription": "De {mediaServerName}-bibliotheken die op titels worden gescand. Klik op onderstaande knop als er geen bibliotheken in de lijst staan.",
"components.Settings.manualscanDescriptionJellyfin": "Normaliter wordt dit eenmaal per 24 uur uitgevoerd. Jellyseerr zal de lijst met onlangs toegevoegde media op je {mediaServerName}-server vaker controleren. Als dit de eerste keer is dat je Jellyseerr instelt, wordt aanbevolen eenmalig een handmatige, volledige bibliotheekscan uit te voeren!",
"components.Settings.save": "Wijzigingen opslaan",
"components.Settings.syncJellyfin": "Bibliotheken synchoniseren",
"components.TvDetails.play": "Afspelen op {mediaServerName}",
"components.Discover.FilterSlideover.tmdbuservotecount": "Aantal gebruikersstemmen TMDB",
"components.Login.save": "Toevoegen",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Hiermee wordt deze {mediaType} onomkeerbaar verwijderd van {arr}, inclusief alle bestanden.",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Apparaatstandaard",
"components.Settings.Notifications.userEmailRequired": "Gebruikerse-mail vereisen",
"components.Settings.SettingsAbout.supportjellyseerr": "Jellyseerr ondersteunen",
"components.Settings.SonarrModal.seriesType": "Serietype",
"components.Settings.jellyfinSettings": "{mediaServerName}-instellingen",
"components.Setup.configuremediaserver": "Mediaserver instellen",
"components.TvDetails.play4k": "Afspelen op {mediaServerName} in 4K",
"components.UserList.mediaServerUser": "{mediaServerName}-gebruiker",
"components.UserList.noJellyfinuserstoimport": "Er zijn geen {mediaServerName}-gebruikers om te importeren.",
"components.UserProfile.UserSettings.UserGeneralSettings.email": "E-mail",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Apparaatstandaard",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Meldingsgeluid",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Apparaatstandaard"
"components.Login.signinwithjellyfin": "{mediaServerName}-account gebruiken",
"components.Discover.FilterSlideover.voteCount": "Aantal stemmen tussen {minValue} en {maxValue}",
"components.Layout.UserWarnings.emailRequired": "Een e-mailadres is vereist.",
"components.Layout.UserWarnings.passwordRequired": "Een wachtwoord is vereist.",
"components.Login.credentialerror": "Gebruikersnaam of wachtwoord is onjuist.",
"components.Login.emailtooltip": "Het adres hoeft niet gelieerd te zijn aan je {mediaServerName}-instantie.",
"components.Login.host": "{mediaServerName}-URL",
"components.Login.initialsignin": "Verbinden",
"components.Login.initialsigningin": "Verbinden…",
"components.Login.title": "E-mail toevoegen",
"components.Login.username": "Gebruikersnaam",
"components.Login.validationEmailRequired": "Je moet een e-mailadres opgeven",
"components.Login.validationEmailFormat": "Ongeldig e-mailadres",
"components.Login.validationemailformat": "Geldig e-mailadres vereist",
"components.Login.validationhostformat": "Geldige URL vereist",
"components.Login.validationusernamerequired": "Gebruikersnaam vereist",
"components.ManageSlideOver.removearr4k": "Verwijderen van 4K-{arr}",
"components.MovieDetails.downloadstatus": "Downloadstatus",
"components.MovieDetails.imdbuserscore": "Gebruikersbeoordeling IMDB",
"components.MovieDetails.openradarr": "Film openen in Radarr",
"components.MovieDetails.play": "Afspelen op {mediaServerName}",
"components.MovieDetails.play4k": "Afspelen op {mediaServerName} in 4K",
"components.Settings.Notifications.NotificationsPushover.sound": "Meldingsgeluid",
"components.Settings.SonarrModal.tagRequests": "Aanvragen taggen",
"components.Settings.jellyfinSettingsFailure": "Er is iets misgegaan bij het opslaan van de {mediaServerName}-instellingen.",
"components.Settings.jellyfinSettingsSuccess": "{mediaServerName}-instellingen opgeslagen!",
"components.Settings.jellyfinlibraries": "{mediaServerName}-bibliotheken",
"components.Settings.manualscanJellyfin": "Handmatige bibliotheekscan",
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
"components.Settings.saving": "Opslaan…",
"components.Settings.syncing": "Synchroniseren",
"components.Settings.timeout": "Time-out",
"components.Setup.signin": "Aanmelden",
"components.Setup.signinWithJellyfin": "{mediaServerName}-account gebruiken",
"components.TitleCard.addToWatchList": "Toevoegen aan kijklijst",
"components.TitleCard.watchlistError": "Er is iets misgegaan. Probeer het opnieuw.",
"components.UserList.importfromJellyfin": "{mediaServerName}-gebruikers importeren",
"components.UserList.importfromJellyfinerror": "Er is iets misgegaan bij het importeren van {mediaServerName}-gebruikers.",
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "{mediaServerName}-gebruiker",
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Wijzigingen opslaan",
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Opslaan…",
"i18n.collection": "Collectie",
"components.UserProfile.localWatchlist": "Kijklijst van {username}",
"components.Setup.signinWithPlex": "Plex-account gebruiken",
"components.Settings.jellyfinSettingsDescription": "Optioneel, configureer de interne en externe eindpunten voor uw {mediaServerName} server. In de meeste gevallen verschilt de externe URL met de interne URL. Een aangepaste wachtwoord reset URL kan ook gebruikt worden voor de {mediaServerName} login, voor het geval dat u doorverwezen wilt worden naar een andere wachtwoord reset pagina.",
"components.Settings.jellyfinsettingsDescription": "Configureer de instellingen voor uw {mediaServerName} server. {mediaServerName} scanned uw {mediaServerName} bibliotheken om te zien welke content beschikbaar is.",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Is succesvol verwijderd van de kijklijst!",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> succesvol toegevoegd aan de kijklijst!",
"components.TitleCard.watchlistCancel": "kijklijst voor <strong>{title}</strong> is geannuleerd.",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} succesvol geimporteerd!",
"components.UserList.newJellyfinsigninenabled": "De <strong>Gebruik Nieuwe {mediaServerName} Login</strong> instelling staat momenteel aan. {mediaServerName} gebruikers met toegang tot de bibliotheek, hoeven niet geïmporteerd te worden om in te kunnen loggen."
}

View File

@@ -1061,196 +1061,212 @@
"components.MovieDetails.rtaudiencescore": "Ocena Rotten Tomatoes",
"components.MovieDetails.rtcriticsscore": "Tomatometer Rotten Tomatoes",
"components.MovieDetails.tmdbuserscore": "Ocena użytkowników TMDB",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Bieżąca częstotliwość",
"components.TvDetails.seasonnumber": "Sezon {seasonNumber}",
"components.TvDetails.seasonstitle": "Sezony",
"components.Settings.SettingsJobsCache.imagecache": "Pamięć podręczna obrazów",
"components.PermissionEdit.viewrecent": "Wyświetl ostatnio dodane",
"components.PermissionEdit.viewrecentDescription": "Przyznaj uprawnienia do przeglądania listy ostatnio dodanych multimediów.",
"components.TitleCard.cleardata": "Wyczyść dane",
"components.RequestList.RequestItem.tmdbid": "Identyfikator TMDB",
"components.RequestList.RequestItem.tvdbid": "Identyfikator TVDB",
"components.TitleCard.tmdbid": "Identyfikator TMDB",
"components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synchronizacja listy obserwowanych Plex",
"components.TitleCard.mediaerror": "Nie znaleziono {mediaType}",
"components.TitleCard.tvdbid": "Identyfikator TVDB",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Automatyczne zamawianie filmów z <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>",
"components.PermissionEdit.autorequestSeriesDescription": "Udziel zgody na automatyczne przesyłanie próśb dotyczących multimediów innych niż 4K za pośrednictwem listy obserwowanych Plex.",
"components.PermissionEdit.viewwatchlists": "Wyświetlanie list obserwacyjnych Plex",
"components.PermissionEdit.viewwatchlistsDescription": "Przyznaj uprawnienia do przeglądania list obserwowanych Plex innych użytkowników.",
"components.RequestCard.tmdbid": "Identyfikator TMDB",
"components.RequestCard.tvdbid": "Identyfikator TVDB",
"components.Settings.SettingsLogs.viewdetails": "Zobacz szczegóły",
"components.Settings.restartrequiredTooltip": "Overseerr musi zostać ponownie uruchomiony, aby zmiany tego ustawienia zaczęły obowiązywać",
"components.TvDetails.reportissue": "Zgłoś problem",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Automatyczna prośba o serial",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Automatyczne zamawianie filmów z <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>",
"components.UserProfile.plexwatchlist": "Lista obserwowanych Plex",
"components.RequestCard.cancelrequest": "Anuluj prośbę",
"components.RequestCard.declinerequest": "Odrzuć prośbę",
"components.RequestCard.approverequest": "Zatwierdź prośbę",
"components.DownloadBlock.formattedTitle": "{title}: Sezon {seasonNumber} Odcinek {episodeNumber}",
"components.RequestBlock.approve": "Zatwierdź prośbę",
"components.RequestBlock.decline": "Odrzuć prośbę",
"components.RequestBlock.delete": "Usuń prośbę",
"components.RequestBlock.edit": "Edytuj prośbę",
"components.RequestBlock.lastmodifiedby": "Ostatnio zmodyfikowane przez",
"components.RequestBlock.requestdate": "Data złożenia prośby",
"components.RequestBlock.requestedby": "Prośba zgłoszona przez",
"components.RequestCard.editrequest": "Edytuj prośbę",
"components.RequestModal.requestcollection4ktitle": "Poproś o kolekcję w 4K",
"components.RequestModal.requestcollectiontitle": "Poproś o kolekcję",
"components.RequestModal.requestmovie4ktitle": "Poproś o film w 4K",
"components.RequestModal.requestmovietitle": "Poproś o film",
"components.RequestModal.requestseries4ktitle": "Poproś o serial w 4K",
"components.RequestModal.requestseriestitle": "Poproś o serial",
"components.Settings.SettingsJobsCache.image-cache-cleanup": "Czyszczenie pamięci podręcznej obrazów",
"components.Settings.SettingsJobsCache.imagecacheDescription": "Po włączeniu w ustawieniach Overseerr będzie pośredniczyć i buforować obrazy ze wstępnie skonfigurowanych źródeł zewnętrznych. Obrazy z pamięci podręcznej są zapisywane w folderze konfiguracji. Możesz znaleźć pliki w <code>{appDataPath}/cache/images</code>.",
"components.Settings.SettingsJobsCache.imagecachecount": "Obrazy zapisane w pamięci podręcznej",
"components.Settings.SettingsJobsCache.imagecachesize": "Całkowity rozmiar pamięci podręcznej",
"components.Settings.advancedTooltip": "Nieprawidłowe skonfigurowanie tego ustawienia może spowodować nieprawidłowe działanie",
"components.Settings.experimentalTooltip": "Włączenie tego ustawienia może spowodować nieoczekiwane zachowanie aplikacji",
"components.TvDetails.rtaudiencescore": "Ocena publiczności Rotten Tomatoes",
"components.TvDetails.rtcriticsscore": "Rotten Tomatoes Tomatometr",
"components.TvDetails.status4k": "4K {status}",
"components.TvDetails.tmdbuserscore": "Ocena użytkowników TMDB",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Filmy z próśb automatycznych",
"components.UserProfile.emptywatchlist": "W tym miejscu pojawią się multimedia dodane do <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>.",
"components.RequestCard.unknowntitle": "Nieznany tytuł",
"components.RequestList.RequestItem.unknowntitle": "Nieznany tytuł",
"components.StatusBadge.playonplex": "Odtwórz na Plex",
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
"components.TvDetails.Season.noepisodes": "Lista odcinków jest niedostępna.",
"components.TvDetails.Season.somethingwentwrong": "Coś poszło nie tak podczas pobierania danych o sezonie.",
"components.TvDetails.manageseries": "Zarządzaj serialem",
"components.Discover.emptywatchlist": "W tym miejscu pojawią się multimedia dodane do <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>.",
"components.RequestModal.SearchByNameModal.nomatches": "Nie udało nam się znaleźć dopasowania do tej serii.",
"components.StatusBadge.managemedia": "Zarządzaj {mediaType}",
"components.StatusBadge.openinarr": "Otwórz w {arr}",
"components.TvDetails.episodeCount": "{episodeCount, plural, one {# Odcinek} other {# Odcinki}}",
"components.Discover.CreateSlider.addSlider": "Dodaj Suwak",
"components.Discover.CreateSlider.addcustomslider": "Utwórz niestandardowy Suwak",
"components.Discover.CreateSlider.addfail": "Nie udało się utworzyć nowego Suwaka.",
"components.Discover.CreateSlider.addsuccess": "Utworzono nowy Suwaki zapisano ustawienia dostosowywania odnajdywania.",
"components.Discover.CreateSlider.editSlider": "Edytuj Suwak",
"components.Discover.CreateSlider.editfail": "Nie udało się edytować Suwaka.",
"components.Discover.CreateSlider.editsuccess": "Edytowano Suwak i zapisano ustawienia odkrywania.",
"components.Discover.CreateSlider.needresults": "Musisz mieć co najmniej 1 wynik.",
"components.Discover.CreateSlider.addSlider": "Dodaj suwak",
"components.Discover.CreateSlider.addcustomslider": "Utwórz niestandardowy suwak",
"components.Discover.CreateSlider.addfail": "Nie udało się utworzyć nowego suwaka.",
"components.Discover.CreateSlider.addsuccess": "Stworzony nowy suwak i zapisano dostosowywania odkrywania.",
"components.Discover.CreateSlider.editSlider": "Edytuj suwak",
"components.Discover.CreateSlider.editfail": "Nie udało się edytować suwaka.",
"components.Discover.CreateSlider.needresults": "Musisz mieć przynajmniej 1 wynik.",
"components.Discover.CreateSlider.nooptions": "Brak wyników.",
"components.Discover.CreateSlider.providetmdbgenreid": "Podaj identyfikator gatunku TMDB",
"components.Discover.CreateSlider.providetmdbkeywordid": "Podaj identyfikator słowa kluczowego TMDB",
"components.Discover.CreateSlider.providetmdbnetwork": "Podaj identyfikator platformy TMDB",
"components.Discover.CreateSlider.providetmdbgenreid": "Podaj ID gatunku TMDB",
"components.Discover.CreateSlider.providetmdbnetwork": "Podaj ID stacji TMDB",
"components.Discover.CreateSlider.providetmdbsearch": "Podaj zapytanie wyszukiwania",
"components.Discover.CreateSlider.providetmdbstudio": "Podaj identyfikator studia TMDB",
"components.Discover.CreateSlider.providetmdbstudio": "Podaj ID studia TMDB",
"components.Discover.CreateSlider.searchGenres": "Szukaj gatunków…",
"components.Discover.CreateSlider.searchKeywords": "Szukaj słów kluczowych…",
"components.Discover.CreateSlider.slidernameplaceholder": "Nazwa slidera",
"components.Discover.CreateSlider.starttyping": "Zacznij pisać, aby wyszukać.",
"components.Discover.CreateSlider.validationDatarequired": "Musisz uzyskać wartość danych.",
"components.Discover.CreateSlider.validationTitlerequired": "Musisz podać tytuł.",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "{keywordTitle} Filmy",
"components.Discover.DiscoverSliderEdit.deletefail": "Nie udało się usunąć slidera.",
"components.Discover.DiscoverSliderEdit.remove": "Usuń",
"components.Discover.DiscoverTvKeyword.keywordSeries": "Serial {keywordTitle}",
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# aktywny filtr} other {# aktywnych filtrów}}",
"components.Discover.CreateSlider.searchStudios": "Wyszukaj studia…",
"components.Discover.CreateSlider.slidernameplaceholder": "Nazwa suwaka",
"components.Discover.CreateSlider.starttyping": "Zacznij pisać aby wyszukać.",
"components.Discover.CreateSlider.validationDatarequired": "Należy wprowadzić wartość danych.",
"components.Discover.CreateSlider.validationTitlerequired": "Należy podać tytuł.",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Filmy: {keywordTitle}",
"components.Discover.DiscoverMovies.discovermovies": "Filmy",
"components.Discover.DiscoverMovies.sortPopularityAsc": "Popularność rosnąco",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Popularność malejąco",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Data wydania rosnąco",
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Data wydania malejąco",
"components.Discover.DiscoverMovies.sortTitleAsc": "Tytuł (A-Z) rosnąco",
"components.Discover.DiscoverMovies.sortTitleDesc": "Tytuł (Z-A) malejąco",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Ocena TMDB rosnąco",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Ocena TMDB malejąco",
"components.Discover.DiscoverSliderEdit.deletesuccess": "Pomyślnie usunięto slider.",
"components.Discover.DiscoverSliderEdit.deletefail": "Nie udało się usunąć suwaka.",
"components.Discover.DiscoverSliderEdit.deletesuccess": "Pomyślnie usunięto suwak.",
"components.Discover.DiscoverSliderEdit.enable": "Przełącz widoczność",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# aktywny filtr} other {# aktywnych filtrów}}",
"components.Discover.DiscoverTv.discovertv": "Seriale",
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Data pierwszej emisji rosnąco",
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Pierwsza data emisji malejąco",
"components.Discover.DiscoverSliderEdit.remove": "Usuń",
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Data premiery rosnąco",
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Data premiery malejąco",
"components.Discover.DiscoverTv.sortPopularityAsc": "Popularność rosnąco",
"components.Discover.DiscoverTv.sortPopularityDesc": "Popularność malejąco",
"components.Discover.DiscoverTv.sortTitleAsc": "Tytuł (A-Z) rosnąco",
"components.Discover.DiscoverTv.sortTitleDesc": "Tytuł (Z-A) malejąco",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Ocena TMDB rosnąco",
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "Ocena TMDB malejąco",
"components.Discover.CreateSlider.searchStudios": "Szukaj studiów…",
"components.Settings.SettingsMain.general": "Ogólne",
"components.Settings.SettingsMain.generalsettings": "Ustawienia ogólne",
"components.Settings.SettingsMain.originallanguageTip": "Filtruj zawartość według języka oryginału",
"components.Discover.PlexWatchlistSlider.emptywatchlist": "W tym miejscu pojawią się multimedia dodane do <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink>.",
"components.Discover.networks": "Platformy",
"components.Discover.moviegenres": "Gatunki filmowe",
"components.Discover.tmdbnetwork": "Platforma TMDB",
"components.Discover.tmdbstudio": "Studio TMDB",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Twoja lista obserwowanych Plex",
"components.Discover.createnewslider": "Utwórz nowy suwak",
"components.Discover.customizediscover": "Dostosowywanie funkcji Odkryj",
"components.Discover.resetfailed": "Wystąpił problem podczas resetowania ustawień odnajdywania.",
"components.Discover.resetsuccess": "Pomyślnie zresetowano ustawienia odnajdywania.",
"components.Discover.resetwarning": "Przywróć wszystkie Suwaki do ustawień domyślnych. Spowoduje to również usunięcie wszystkich niestandardowych Suwaków!",
"components.Discover.resettodefault": "Przywróć ustawienia domyślne",
"components.Discover.studios": "Studia",
"components.Discover.tmdbmoviegenre": "Gatunek filmu TMDB",
"components.Discover.tvgenres": "Gatunki serialu",
"components.Settings.SettingsMain.csrfProtectionTip": "Ustaw zewnętrzny dostęp api na tylko do odczytu (wymaga HTTPS)",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NIE włączaj tego ustawienia, chyba że rozumiesz, co robisz!",
"components.Settings.SettingsMain.generalsettingsDescription": "Skonfiguruj globalne i domyślne ustawienia dla Overseerr.",
"components.Settings.SettingsMain.hideAvailable": "Ukryj dostępne multimedia",
"components.Settings.SettingsMain.trustProxyTip": "Pozwól Overseerr poprawnie rejestrować adresy IP klientów za serwerem proxy",
"components.Settings.SettingsMain.toastSettingsSuccess": "Ustawienia zostały zapisane pomyślnie!",
"components.Settings.SettingsMain.trustProxy": "Włącz obsługę proxy",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "Adres URL nie może kończyć się ukośnikiem",
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# aktywny filtr} other {# aktywnych filtrów}}",
"components.Discover.FilterSlideover.clearfilters": "Wyczyść aktywne filtry",
"components.Discover.FilterSlideover.filters": "Filtry",
"components.Discover.FilterSlideover.firstAirDate": "Pierwsza data emisji",
"components.Discover.FilterSlideover.firstAirDate": "Data pierwszego wyemitowania",
"components.Discover.FilterSlideover.from": "Od",
"components.Discover.FilterSlideover.genres": "Gatunki",
"components.Discover.FilterSlideover.keywords": "Słowa kluczowe",
"components.Discover.FilterSlideover.originalLanguage": "Język oryginalny",
"components.Discover.FilterSlideover.ratingText": "Oceny pomiędzy {minValue} a {maxValue}",
"components.Discover.FilterSlideover.ratingText": "Oceny między {minValue} a {maxValue}",
"components.Discover.CreateSlider.providetmdbkeywordid": "Podaj ID słowa kluczowego TMDB",
"components.Discover.CreateSlider.searchKeywords": "Wyszukaj słowa kluczowe…",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Data wydania rosnąco",
"components.Discover.DiscoverTv.discovertv": "Seriale",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Ocena TMDB rosnąco",
"components.Discover.DiscoverTvKeyword.keywordSeries": "Seriale: {keywordTitle}",
"components.Discover.FilterSlideover.originalLanguage": "Oryginalny język",
"components.Discover.FilterSlideover.releaseDate": "Data wydania",
"components.Discover.FilterSlideover.runtimeText": "{minValue}-{maxValue} czas odtwarzania w minutach",
"components.Discover.FilterSlideover.runtime": "Czas odtwarzania",
"components.Discover.FilterSlideover.tmdbuserscore": "Ocena użytkowników TMDB",
"components.Discover.FilterSlideover.runtime": "Długość",
"components.Discover.FilterSlideover.runtimeText": "{minValue}-{maxValue} minut trwania",
"components.Discover.FilterSlideover.streamingservices": "Serwisy streamingowe",
"components.Discover.FilterSlideover.studio": "Studio",
"components.Discover.FilterSlideover.tmdbuservotecount": "Liczba głosów użytkowników TMDB",
"components.Discover.FilterSlideover.to": "Do",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Ostatnio dodane",
"components.Discover.stopediting": "Zatrzymaj edycję",
"components.Discover.tmdbmoviekeyword": "Słowo kluczowe filmu TMDB",
"components.Discover.tmdbsearch": "Wyszukiwanie TMDB",
"components.Layout.Sidebar.browsemovies": "Filmy",
"components.Layout.Sidebar.browsetv": "Seriale",
"components.Selector.searchGenres": "Wybierz gatunki…",
"components.Selector.searchKeywords": "Szukaj słów kluczowych…",
"components.Selector.showmore": "Pokaż więcej",
"components.Selector.starttyping": "Zacznij pisać, aby wyszukać.",
"components.Settings.SettingsMain.applicationTitle": "Tytuł aplikacji",
"components.Settings.SettingsMain.applicationurl": "Adres URL aplikacji",
"components.Settings.SettingsMain.cacheImages": "Włącz buforowanie obrazów",
"components.Settings.SettingsMain.csrfProtection": "Włącz ochronę CSRF",
"components.Settings.SettingsMain.locale": "Język wyświetlania",
"components.Settings.SettingsMain.originallanguage": "Odkryj język",
"components.Settings.SettingsMain.partialRequestsEnabled": "Zezwalaj na prośby o część serialu",
"components.Settings.SettingsMain.region": "Odkryj region",
"components.Settings.SettingsMain.regionTip": "Filtruj zawartość według dostępności regionalnej",
"components.Settings.SettingsMain.toastApiKeyFailure": "Coś poszło nie tak podczas generowania nowego klucza API.",
"components.Settings.SettingsMain.toastApiKeySuccess": "Nowy klucz API został pomyślnie wygenerowany!",
"components.Settings.SettingsMain.validationApplicationTitle": "Należy podać tytuł aplikacji",
"components.Settings.SettingsMain.validationApplicationUrl": "Musisz podać prawidłowy adres URL",
"components.Discover.FilterSlideover.streamingservices": "Usługi streamingowe",
"components.Discover.FilterSlideover.studio": "Studia",
"components.Discover.tmdbtvgenre": "Gatunek serialu TMDB",
"components.Discover.FilterSlideover.voteCount": "Liczba głosów między {minValue} a {maxValue}",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Twoja lista obserwowanych Plex",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Niedawno dodane",
"components.Discover.createnewslider": "Dodaj nowy suwak",
"components.Discover.customizediscover": "Dostosuj Odkryj",
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Media dodane do twojej <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink> zostaną wyświetlone tutaj.",
"components.Discover.emptywatchlist": "Media dodane do twojej <PlexWatchlistSupportLink>listy obserwowanych Plex</PlexWatchlistSupportLink> zostaną wyświetlone tutaj.",
"components.Discover.tmdbstudio": "Studio TMDB",
"components.Discover.tmdbtvkeyword": "Słowo kluczowe serialu TMDB",
"components.Discover.updatesuccess": "Zaktualizowano ustawienia odnajdywania.",
"components.Selector.nooptions": "Brak wyników.",
"components.Discover.tmdbtvgenre": "Gatunek serialu TMDB",
"components.Discover.tmdbsearch": "Wyszukiwanie TMDB",
"components.Discover.FilterSlideover.tmdbuserscore": "Ocena użytkownika TMDB",
"components.Discover.moviegenres": "Gatunki filmu",
"components.Discover.networks": "Kanały",
"components.Discover.CreateSlider.editsuccess": "Edytowano suwak i zapisano ustawienia personalizacji.",
"components.Discover.stopediting": "Zakończ edytowanie",
"components.Discover.studios": "Studia",
"components.DownloadBlock.formattedTitle": "{title}: Sezon {seasonNumber} Odcinek {episodeNumber}",
"components.Discover.tvgenres": "Gatunki seriali",
"components.Discover.updatefailed": "Coś poszło nie tak podczas aktualizacji ustawień personalizacji wykrywania.",
"components.Discover.updatesuccess": "Zaktualizowano ustawienia personalizacji wykrywania.",
"components.Discover.resettodefault": "Przywróć domyślne",
"components.Discover.resetfailed": "Coś poszło nie tak podczas resetowania ustawień personalizacji wykrywania.",
"components.Discover.resetsuccess": "Pomyślnie zresetowano ustawienia wykrywania.",
"components.Discover.tmdbmoviegenre": "Gatunek filmu TMDB",
"components.Layout.Sidebar.browsetv": "Seriale",
"components.Layout.UserWarnings.emailInvalid": "Adres e-mail jest nieprawidłowy.",
"components.Layout.UserWarnings.passwordRequired": "Wymagane jest podanie hasła.",
"components.Login.credentialerror": "Nazwa użytkownika lub hasło są nieprawidłowe.",
"components.Login.emailtooltip": "Adres nie musi być powiązany z instancją {mediaServerName}.",
"components.Login.host": "{mediaServerName} URL",
"components.Login.initialsignin": "Połącz",
"components.Login.initialsigningin": "Łączenie…",
"components.Login.save": "Reklama",
"components.Login.saving": "Dodaję…",
"components.Login.signinwithjellyfin": "Użyj swojego konta {mediaServerName}",
"components.Login.title": "Dodaj e-mail",
"components.Login.username": "Nazwa użytkownika",
"components.Login.validationEmailRequired": "Musisz podać adres e-mail",
"components.Login.validationemailformat": "Wymagany poprawny adres e-mail",
"components.Login.validationhostformat": "Wymagany poprawny adres URL",
"components.Login.validationhostrequired": "{mediaServerName} URL wymagany",
"components.Login.validationusernamerequired": "Wymagana nazwa użytkownika",
"components.ManageSlideOver.removearr4k": "Usuń z 4k {arr}",
"components.MovieDetails.downloadstatus": "Status pobierania",
"components.MovieDetails.openradarr4k": "Otwórz film 4k w Radarr",
"components.MovieDetails.play": "Odtwórz na {mediaServerName}",
"components.MovieDetails.play4k": "Odtwórz w 4K na {mediaServerName}",
"components.PermissionEdit.viewrecent": "Wyświetl ostatnio dodane",
"components.PermissionEdit.viewrecentDescription": "Zezwolenie na wyświetlanie listy ostatnio dodanych multimediów.",
"components.RequestBlock.approve": "Zatwierdź żądanie",
"components.RequestBlock.decline": "Odrzuć żądanie",
"components.RequestBlock.delete": "Usuń żądanie",
"components.RequestBlock.lastmodifiedby": "Ostatnio modyfikowany przez",
"components.RequestBlock.requestdate": "Data żądania",
"components.RequestBlock.requestedby": "Żądany przez",
"components.RequestCard.cancelrequest": "Anuluj prośbę",
"components.RequestCard.declinerequest": "Odrzuć prośbę",
"components.RequestCard.editrequest": "Edytuj prośbę",
"components.RequestCard.unknowntitle": "Nieznany tytuł",
"components.RequestModal.requestcollectiontitle": "Poproś o kolekcję",
"components.RequestModal.requestmovie4ktitle": "Poproś o film w 4K",
"components.RequestModal.requestmovietitle": "Poproś o film",
"components.RequestModal.requestseries4ktitle": "Poproś o serial w 4K",
"components.RequestModal.requestseriestitle": "Poproś o serial",
"components.Selector.searchGenres": "Wybierz gatunki…",
"components.Selector.searchKeywords": "Wyszukaj słowa kluczowe…",
"components.Selector.searchStudios": "Szukaj studiów…",
"components.Selector.showless": "Pokaż mniej",
"components.Discover.updatefailed": "Wystąpił problem podczas aktualizowania ustawień odnajdywania.",
"components.Selector.starttyping": "Rozpocznij wpisywanie, aby wyszukać.",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Ostatnio dodane skanowanie Jellyfin",
"components.Settings.SettingsMain.apikey": "Klucz API",
"components.Settings.SettingsMain.cacheImagesTip": "Pamięć podręczna dla obrazów pochodzących z zewnętrznych źródeł (wymaga znacznej ilości miejsca na dysku)",
"components.Settings.SettingsMain.applicationTitle": "Nazwa aplikacji",
"components.Settings.SettingsMain.applicationurl": "URL aplikacji",
"components.Settings.SettingsMain.csrfProtection": "Włącz ochronę CSRF",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "NIE włączaj tego ustawienia, jeśli nie rozumiesz, co robisz!",
"components.Settings.SettingsMain.csrfProtectionTip": "Ustawienie dostępu do zewnętrznego API tylko do odczytu (wymaga HTTPS)",
"components.Settings.SettingsMain.general": "Ogólne",
"components.Settings.SettingsMain.generalsettings": "Ustawienia ogólne",
"components.Settings.SettingsMain.generalsettingsDescription": "Konfiguracja globalnych i domyślnych ustawień Overseerr.",
"components.Settings.SettingsMain.hideAvailable": "Ukryj dostępne media",
"components.Settings.SettingsMain.locale": "Wyświetlany język",
"components.Settings.SettingsMain.partialRequestsEnabled": "Zezwalaj na częściowe żądania seriali",
"components.Settings.SettingsMain.region": "Region odkrywania",
"components.Settings.SettingsMain.regionTip": "Filtrowanie zawartości według dostępności regionalnej",
"components.Settings.SettingsMain.toastSettingsFailure": "Coś poszło nie tak podczas zapisywania ustawień.",
"i18n.collection": "Kolekcja",
"components.MovieDetails.imdbuserscore": "Ocena użytkowników IMDB",
"components.Settings.SonarrModal.seriesType": "Typ serialu"
"components.Settings.SettingsMain.trustProxyTip": "Umożliwienie Overseerr poprawnego rejestrowania adresów IP klientów za serwerem proxy",
"components.Settings.jellyfinSettings": "{mediaServerName} Ustawienia",
"components.Settings.jellyfinSettingsFailure": "Coś poszło nie tak podczas zapisywania ustawień {mediaServerName}.",
"components.Settings.jellyfinSettingsSuccess": "Ustawienia {mediaServerName} zostały pomyślnie zapisane!",
"components.Settings.jellyfinlibrariesDescription": "Biblioteki {mediaServerName} skanują w poszukiwaniu tytułów. Kliknij poniższy przycisk, jeśli na liście nie ma żadnych bibliotek.",
"components.Settings.jellyfinsettings": "{mediaServerName} ustawienia",
"components.Settings.jellyfinsettingsDescription": "Konfiguracja ustawień serwera {mediaServerName}. {mediaServerName} skanuje biblioteki {mediaServerName}, aby sprawdzić, jaka zawartość jest dostępna.",
"components.Settings.manualscanJellyfin": "Ręczne skanowanie biblioteki",
"components.Settings.saving": "Zapisywanie…",
"components.Settings.syncing": "Synchronizowanie",
"components.Setup.signinWithPlex": "Użyj konta Plex",
"components.StatusBadge.openinarr": "Otwórz w {arr}",
"components.StatusBadge.playonplex": "Odtwórz na {mediaServerName}",
"components.TitleCard.watchlistError": "Coś poszło nie tak, spróbuj ponownie.",
"components.TvDetails.Season.somethingwentwrong": "Coś poszło nie tak podczas pobierania danych sezonu.",
"components.TvDetails.seasonnumber": "Sezon {seasonNumber}",
"components.TvDetails.seasonstitle": "Sezony",
"components.TvDetails.status4k": "4K {status}",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Automatyczne żądania filmów",
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Zapisz zmiany",
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Zapisywanie…",
"components.Layout.Sidebar.browsemovies": "Filmy",
"components.Login.validationEmailFormat": "Nieprawidłowy adres e-mail",
"components.RequestModal.SearchByNameModal.nomatches": "Nie udało nam się znaleźć odpowiednika dla tego serialu.",
"components.Selector.showmore": "Pokaż więcej",
"components.Settings.SettingsMain.cacheImagesTip": "Pamięć podręczna obrazów pochodzących z zewnątrz (wymaga znacznej ilości miejsca na dysku)",
"components.Settings.SettingsMain.originallanguageTip": "Filtrowanie zawartości według oryginalnego języka",
"components.Settings.SettingsMain.toastSettingsSuccess": "Ustawienia zapisane pomyślnie!",
"components.Settings.experimentalTooltip": "Włączenie tego ustawienia może spowodować nieoczekiwane zachowanie aplikacji",
"components.UserList.mediaServerUser": "{mediaServerName} Użytkownik",
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Email",
"components.Discover.resetwarning": "Przywróć domyślne ustawienia wszystkich suwaków. Spowoduje to również usunięcie wszystkich niestandardowych suwaków!",
"components.Layout.UserWarnings.emailRequired": "Wymagany jest adres e-mail.",
"components.MovieDetails.openradarr": "Otwórz film w Radarr",
"components.RequestModal.requestcollection4ktitle": "Poproś o kolekcję w 4K",
"components.Setup.signinWithJellyfin": "Użyj konta {mediaServerName}",
"components.Login.description": "Ponieważ logujesz się do {applicationName} po raz pierwszy, musisz dodać prawidłowy adres e-mail.",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Spowoduje to nieodwracalne usunięcie tego {mediaType} z {arr}, w tym wszystkich plików.",
"components.ManageSlideOver.removearr": "Usuń z {arr}",
"components.PermissionEdit.autorequestSeriesDescription": "Zezwolenie na automatyczne przesyłanie żądań dotyczących seriali innych niż 4K za pośrednictwem listy obserwowanych Plex.",
"components.PermissionEdit.viewwatchlists": "Wyświetl {mediaServerName} watchlistę",
"components.RequestCard.approverequest": "Zaakceptuj prośbę",
"components.Settings.RadarrModal.tagRequestsInfo": "Automatycznie dodawaj dodatkowy znacznik z identyfikatorem użytkownika i wyświetlaną nazwą użytkownika",
"components.Settings.SettingsAbout.supportjellyseerr": "Wspomóż Jellyseerr",
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Pełne skanowanie bibliotek Jellyfin",
"components.Settings.SettingsLogs.viewdetails": "Zobacz szczegóły",
"components.Settings.jellyfinSettingsDescription": "Opcjonalnie skonfiguruj wewnętrzne i zewnętrzne punkty końcowe dla serwera {mediaServerName}. W większości przypadków zewnętrzny adres URL różni się od wewnętrznego adresu URL. Niestandardowy adres URL resetowania hasła można również ustawić dla logowania {mediaServerName}, na wypadek gdybyś chciał przekierować na inną stronę resetowania hasła.",
"components.Settings.save": "Zapisz zmiany",
"components.Settings.syncJellyfin": "Synchronizuj biblioteki",
"components.TvDetails.Season.noepisodes": "Lista odcinków jest niedostępna.",
"components.Settings.Notifications.NotificationsPushover.sound": "Dźwięk powiadomień",
"components.Settings.RadarrModal.tagRequests": "Żądania tagów",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Aktualna częstotliwość",
"components.Settings.SettingsMain.validationApplicationTitle": "Musisz podać tytuł aplikacji",
"components.Settings.SonarrModal.seriesType": "Typ seriali",
"components.Settings.advancedTooltip": "Nieprawidłowe skonfigurowanie tego ustawienia może spowodować nieprawidłowe działanie",
"components.TvDetails.reportissue": "Zgłoś problem",
"components.RequestBlock.edit": "Edytuj żądanie",
"components.RequestList.RequestItem.unknowntitle": "Nieznany tytuł",
"components.Selector.nooptions": "Brak wyników.",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Domyślne urządzenie",
"components.Settings.Notifications.userEmailRequired": "Wymagaj adresu e-mail użytkownika",
"components.Settings.manualscanDescriptionJellyfin": "Zwykle będzie to uruchamiane tylko raz na 24 godziny. Jellyseerr będzie bardziej agresywnie sprawdzać ostatnio dodane biblioteki serwera {mediaServerName}. Jeśli po raz pierwszy konfigurujesz Jellyseerr, zalecane jest jednorazowe pełne ręczne skanowanie biblioteki!"
}

View File

@@ -1257,9 +1257,35 @@
"components.Discover.FilterSlideover.tmdbuservotecount": "Qtd de Votos de Usuários TMDB",
"components.Discover.FilterSlideover.voteCount": "Qtd the votos entre {minValue} e {maxValue}",
"components.Settings.RadarrModal.tagRequestsInfo": "Adicione automaticamente uma tag extra com o ID de usuário e o nome de exibição do solicitante",
"i18n.collection": "Coleção",
"components.MovieDetails.imdbuserscore": "Pontuação de usuário IMDB",
"components.Settings.SonarrModal.tagRequestsInfo": "Adiciona automaticamente uma tag adicional com o ID de usuário e nome de exibição de quem pediu",
"components.Settings.SonarrModal.tagRequests": "Marcar Pedidos",
"components.Settings.RadarrModal.tagRequests": "Marcar Pedidos"
"components.Layout.UserWarnings.emailRequired": "Um endereço de e-mail é necessário.",
"components.Login.credentialerror": "O nome de usuário ou senha está incorreto.",
"components.Login.description": "Já que é sua primeira vez entrando em {applicationName}, você precisa adicionar um e-mail válido.",
"components.Login.host": "URL de {mediaServerName}",
"components.Login.initialsignin": "Conectar",
"components.Login.initialsigningin": "Conectando…",
"components.Login.save": "Adicionar",
"components.Login.saving": "Adicionando…",
"components.Login.signinwithjellyfin": "Use sua conta de {mediaServerName}",
"components.Login.title": "Adicionar E-Mail",
"components.Login.username": "Nome de usuário",
"components.Login.validationEmailFormat": "E-mail inválido",
"components.Login.validationEmailRequired": "Você precisa providenciar um e-mail",
"components.Login.validationemailformat": "E-mail válido necessário",
"components.Login.validationhostformat": "URL válido necessário",
"components.Login.validationusernamerequired": "Nome de usuário necessário",
"components.ManageSlideOver.removearr": "Remover de {arr}",
"components.ManageSlideOver.removearr4k": "Remover de {arr} 4K",
"components.MovieDetails.downloadstatus": "Status de download",
"components.MovieDetails.imdbuserscore": "Avaliação de usuário no IMDB",
"components.MovieDetails.openradarr": "Abrir filme no Radarr",
"components.Settings.Notifications.NotificationsPushover.sound": "Som de notificação",
"components.Login.emailtooltip": "Endereço não precisa ser associado à sua instância de {mediaServerName}.",
"components.Layout.UserWarnings.emailInvalid": "Endereço de e-mail inválido.",
"components.Layout.UserWarnings.passwordRequired": "Uma senha é necessária.",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Padrão do dispositivo",
"components.Login.validationhostrequired": "URL de {mediaServerName} necessário",
"components.MovieDetails.openradarr4k": "Abrir filme em Radarr 4K",
"components.MovieDetails.play": "Reproduzir em {mediaServerName}",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Isto irá remover este {mediaType} de {arr}, incluindo todos os arquivos.",
"components.MovieDetails.play4k": "Reproduzir em 4K em {mediaServerName}"
}

View File

@@ -370,7 +370,7 @@
"components.PlexLoginButton.signinwithplex": "Conectat",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} per {quotaDays} {days}</quotaUnits>",
"components.PersonDetails.lifespan": "{birthdate} {deathdate}",
"components.RequestBlock.seasons": "{seasonCount, plural, one {Sezon} other {Sezoane}}",
"components.RequestBlock.seasons": "{seasonCount, plural, un {Season} alte {Seasons}}",
"components.PermissionEdit.requestMoviesDescription": "Acordați permisiunea de a trimite solicitări pentru filme non-4K.",
"components.PermissionEdit.viewissuesDescription": "Acordați permisiunea de a vizualiza problemele media raportate de alți utilizatori.",
"components.PermissionEdit.viewwatchlistsDescription": "Acordați permisiunea de a vizualiza listele de urmărire Plex ale altor utilizatori.",
@@ -403,62 +403,40 @@
"components.RequestBlock.approve": "Aprobă Solicitarea",
"components.RequestBlock.decline": "Respinge Solicitarea",
"components.RequestBlock.requestedby": "Solicitat de",
"components.RequestButton.approve4krequests": "Aprobă {requestCount, plural, one {Cerere 4K} other {{requestCount} Cereri 4K}}",
"components.RequestButton.approve4krequests": "Aprobă {requestCount, plural, o {4K Request} alte {{requestCount} 4K Requests}}",
"components.RequestBlock.lastmodifiedby": "Ultima Dată Modificat de",
"components.RequestBlock.profilechanged": "Profil Calitate",
"components.RequestBlock.requestdate": "Dată Solicitare",
"components.RequestButton.approverequests": "Aprobă {requestCount, plural, one {Cerere} other {{requestCount} Cereri}}",
"components.RequestButton.requestmore4k": "Cere mai mult în 4K",
"components.RequestButton.approverequest4k": "Aproba Cereri 4K",
"components.RequestCard.tmdbid": "ID TMDB",
"components.RequestCard.failedretry": "A apărut o eroare la reîncercarea solicitării.",
"components.RequestButton.declinerequest": "Respinge Cerere",
"components.RequestCard.seasons": "{seasonCount, plural, one {Sezon} other {Sezoane}}",
"components.RequestCard.declinerequest": "Respinge Cererea",
"components.RequestButton.viewrequest": "Vezi Cerere",
"components.RequestButton.declinerequests": "Respinge {requestCount, plural, one {Cererea} other {{requestCount} Cererile}}",
"components.RequestCard.mediaerror": "{mediaType} Nu a fost găsit",
"components.RequestCard.editrequest": "Editează Cererea",
"components.RequestButton.viewrequest4k": "Vezi Cerere 4K",
"components.RequestButton.decline4krequests": "Respinge {requestCount, plural, one {Cererea 4K} other {{requestCount} Cererile 4K}}",
"components.RequestButton.declinerequest4k": "Respinge Cerere 4K",
"components.RequestCard.approverequest": "Aprobă Cererea",
"components.RequestButton.approverequest": "Cereri Aprobate",
"components.RequestCard.deleterequest": "Șterge Cererea",
"components.RequestCard.unknowntitle": "Titlu necunoscut",
"components.RequestList.RequestItem.cancelRequest": "Anulează Cerere",
"components.RequestCard.tvdbid": "ID TheTVDB",
"components.RequestButton.requestmore": "Cere mai mult",
"components.RequestList.RequestItem.deleterequest": "Șterge Cerere",
"components.RequestCard.cancelrequest": "Anulează Cererea",
"components.RequestModal.AdvancedRequester.folder": "{path} ({space})",
"components.RequestList.RequestItem.modified": "Modificat",
"components.RequestList.RequestItem.editrequest": "Editează Cererea",
"components.RequestModal.AdvancedRequester.qualityprofile": "Profil de Calitate",
"components.RequestList.requests": "Cereri",
"components.RequestModal.AdvancedRequester.advancedoptions": "Avansat",
"components.RequestModal.AdvancedRequester.notagoptions": "Fără etichete.",
"components.RequestList.RequestItem.modifieduserdate": "{date} de {user}",
"components.RequestModal.AdvancedRequester.requestas": "Cere ca",
"components.RequestList.showallrequests": "Afișează toate cererile",
"components.RequestList.RequestItem.tmdbid": "ID-ul TMDB",
"components.RequestList.RequestItem.requesteddate": "Solicitat",
"components.RequestModal.QuotaDisplay.movie": "film",
"components.RequestList.RequestItem.failedretry": "Ceva a mers greșit în timpul reîncercării cererii.",
"components.RequestList.RequestItem.unknowntitle": "Titlu Necunoscut",
"components.RequestModal.AdvancedRequester.destinationserver": "Server Destinație",
"components.RequestModal.AdvancedRequester.rootfolder": "Folder Rădăcină",
"components.RequestList.sortAdded": "Cele Mai Recente",
"components.RequestModal.AdvancedRequester.tags": "Etichete",
"components.RequestList.RequestItem.mediaerror": "{mediaType} nu a fost găsit",
"components.RequestList.sortModified": "Ultima Modificată",
"components.RequestList.RequestItem.tvdbid": "ID-ul TheTVDB",
"components.RequestModal.AdvancedRequester.selecttags": "Selectați Etichetele",
"components.RequestList.RequestItem.requested": "Solicitat",
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Nu sunt suficiente cereri de sezon rămase",
"components.RequestModal.AdvancedRequester.default": "{name} (Implicit)",
"components.RequestModal.AdvancedRequester.languageprofile": "Profil de Limbă",
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Acest utilizator are voie sa ceara <strong>{limit}</strong> {type} la fiecare <strong>{days}</strong> zile.",
"components.RequestList.RequestItem.seasons": "",
"components.RequestModal.QuotaDisplay.allowedRequests": "Aveți voie să cereți <strong>{limit}</strong> de {type} la fiecare <strong>{days}</strong> zile."
"components.Layout.UserWarnings.emailRequired": "Este necesara o adresa de email.",
"components.Layout.UserWarnings.passwordRequired": "Este necesara o parola.",
"components.Login.credentialerror": "Numele de utilizator sau parola sunt incorecte.",
"components.Login.emailtooltip": "Nu este necesar ca adresa ta sa fie asociata cu instanta ta {mediaServerName} .",
"components.Login.save": "Adauga",
"components.Login.signinwithjellyfin": "Foloseste-ti contul de {mediaServerName}",
"components.Login.title": "Adauga email",
"components.Login.username": "Nume utilizator",
"components.Login.validationEmailFormat": "Adresa email invalida",
"components.Login.validationemailformat": "Necesar email valid",
"components.Login.validationhostformat": "Necesar URL valid",
"components.Login.validationhostrequired": "{mediaServerName} URL necesar",
"components.Login.validationusernamerequired": "Nume utilizator necesar",
"components.MovieDetails.downloadstatus": "Status descarcare",
"components.MovieDetails.openradarr": "Deschide film in Radarr",
"components.MovieDetails.openradarr4k": "Deschide film in 4K Radarr",
"components.MovieDetails.play": "Ruleaza pe {mediaServerName}",
"components.MovieDetails.play4k": "Ruleaza 4k pe {mediaServerName}",
"components.RequestButton.declinerequest": "Refuza cerere",
"components.RequestButton.declinerequest4k": "Refuza cerere 4k",
"components.Layout.UserWarnings.emailInvalid": "Adresa de email este invalida.",
"components.Login.description": "Deoarece este prima ta authentificare in {applicationName}, este necesara sa introduci o adresa de email valida.",
"components.Login.initialsigningin": "Se conecteaza…",
"components.Login.saving": "Se adauga…",
"components.RequestButton.approverequest": "Aproba cerere",
"components.RequestButton.approverequest4k": "Aproba cerere 4k",
"components.Login.host": "{mediaServerName} URL",
"components.Login.initialsignin": "Conecteaza-te",
"components.ManageSlideOver.removearr4k": "Elimina din 4K {arr}",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Acesta va elimina ireversibil {mediaType} din {arr}, incluzand toate fisierele asociate.",
"components.Login.validationEmailRequired": "Trebuie sa introduci o adresa email",
"components.ManageSlideOver.removearr": "Elimina din {arr}"
}

View File

@@ -33,7 +33,7 @@
"components.RequestModal.cancel": "Отменить запрос",
"components.RequestModal.extras": "Дополнительно",
"components.RequestModal.numberofepisodes": "# эпизодов",
"components.RequestModal.pendingrequest": "",
"components.RequestModal.pendingrequest": "Ожидающий запрос",
"components.RequestModal.requestCancel": "Запрос на <strong>{title}</strong> отменён.",
"components.RequestModal.requestSuccess": "<strong>{title}</strong> успешно запрошен!",
"components.RequestModal.requestadmin": "Этот запрос будет одобрен автоматически.",
@@ -170,7 +170,7 @@
"pages.oops": "Упс",
"pages.returnHome": "Вернуться домой",
"components.CollectionDetails.overview": "Обзор",
"components.CollectionDetails.numberofmovies": "{count} {count, plural, one {фильм} few {фильма} other {фильмов}}",
"components.CollectionDetails.numberofmovies": "{count} фильмов",
"components.CollectionDetails.requestcollection": "Запросить Коллекцию",
"components.Login.email": "Адрес электронной почты",
"components.UserList.users": "Пользователи",
@@ -427,9 +427,9 @@
"components.Settings.RadarrModal.testFirstRootFolders": "Протестировать подключение для загрузки корневых каталогов",
"components.Settings.RadarrModal.loadingrootfolders": "Загрузка корневых каталогов…",
"components.RequestModal.AdvancedRequester.destinationserver": "Сервер-получатель",
"components.RequestList.RequestItem.mediaerror": "Название, связанное с этим запросом, больше недоступно.",
"components.RequestList.RequestItem.mediaerror": "{mediaType} не найдено",
"components.RequestList.RequestItem.failedretry": "Что-то пошло не так при попытке повторить запрос.",
"components.RequestCard.mediaerror": "Название, связанное с этим запросом, больше недоступно.",
"components.RequestCard.mediaerror": "{mediaType} не найдено",
"components.RequestCard.failedretry": "Что-то пошло не так при попытке повторить запрос.",
"components.RequestButton.viewrequest4k": "Посмотреть 4К запрос",
"components.RequestButton.requestmore4k": "Запросить больше в 4К",
@@ -570,7 +570,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.pending4krequest": "",
"components.RequestModal.pending4krequest": "Ожидающий 4K запрос",
"components.RequestModal.autoapproval": "Автоматическое одобрение",
"i18n.usersettings": "Настройки пользователя",
"i18n.showingresults": "Показываются результаты с <strong>{from}</strong> по <strong>{to}</strong> из <strong>{total}</strong>",
@@ -790,7 +790,7 @@
"components.UserList.importfromplexerror": "Что-то пошло не так при импорте пользователей из Plex.",
"components.UserList.importfrommediaserver": "Импортировать пользователей из {mediaServerName}",
"components.UserList.importfromplex": "Импортировать пользователей из Plex",
"components.UserList.importedfromplex": "{userCount, plural, one {# новый пользователь} other {# новых пользователя(ей)}} успешно импортированы из Plex!",
"components.UserList.importedfromplex": "<strong>{userCount}</strong> {userCount, plural, one {# новый пользователь} other {# новых пользователя(ей)}} успешно импортированы из Plex!",
"components.UserList.edituser": "Изменить разрешения пользователя",
"components.UserList.displayName": "Отображаемое имя",
"components.UserList.deleteconfirm": "Вы уверены, что хотите удалить этого пользователя? Все данные о его запросах будут удалены без возможности восстановления.",
@@ -1018,7 +1018,7 @@
"components.Discover.CreateSlider.addcustomslider": "Создать слайдер",
"components.Discover.CreateSlider.nooptions": "Нет результатов.",
"components.Discover.CreateSlider.providetmdbgenreid": "Введите TMDB ID жанра",
"components.Discover.CreateSlider.needresults": "Должен быть хотя бы 1 результат.",
"components.Discover.CreateSlider.needresults": "Должен быть хотя-бы 1 результат.",
"components.Discover.CreateSlider.providetmdbkeywordid": "Введите TMDB ID ключевого слова",
"components.Discover.CreateSlider.providetmdbnetwork": "Введите TMDB ID сети",
"components.Discover.CreateSlider.providetmdbsearch": "Введите поисковой запрос",
@@ -1027,7 +1027,7 @@
"components.Discover.CreateSlider.searchKeywords": "Поиск ключевых слов…",
"components.Discover.CreateSlider.searchStudios": "Поиск студий…",
"components.Discover.CreateSlider.slidernameplaceholder": "Название слайдера",
"components.Discover.CreateSlider.starttyping": "Начните писать для поиска.",
"components.Discover.CreateSlider.starttyping": "Начините писать для поиска.",
"components.Discover.CreateSlider.validationDatarequired": "Вы должны ввести дату.",
"components.Discover.CreateSlider.validationTitlerequired": "Вы должны ввести заголовок.",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Фильмы по ключевому слову \"{keywordTitle}\"",
@@ -1059,7 +1059,7 @@
"components.Discover.DiscoverSliderEdit.deletesuccess": "Слайдер успешно удален.",
"components.Discover.DiscoverSliderEdit.enable": "Изменить видимость",
"components.Discover.DiscoverSliderEdit.remove": "Удалить",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активен фильтр} other {# Активные фильтры }}",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активный фильтр} other {# Активные фильтры}}",
"components.Discover.DiscoverTv.discovertv": "Сериалы",
"components.Discover.DiscoverTv.sortPopularityAsc": "Популярность по возрастанию",
"components.Discover.DiscoverTv.sortPopularityDesc": "Популярность по убыванию",
@@ -1117,7 +1117,7 @@
"components.MovieDetails.digitalrelease": "Цифровой релиз",
"components.MovieDetails.physicalrelease": "Физический релиз",
"components.Settings.SettingsMain.toastSettingsFailure": "Что-то пошло не так при сохранении настроек.",
"components.Settings.SettingsMain.trustProxyTip": "Разрешить Overserr правильно регистрировать IP-адреса клиентов за прокси-сервером",
"components.Settings.SettingsMain.trustProxyTip": "Разрешить Jellyseerr правильно регистрировать IP-адреса клиентов за прокси-сервером",
"components.Settings.experimentalTooltip": "Включение этого параметра может привести к неожиданному поведению приложения",
"components.Settings.advancedTooltip": "Неправильная настройка этого параметра может привести к нарушению функциональности",
"components.Settings.externalUrl": "Внешний URL-адрес",
@@ -1131,7 +1131,7 @@
"components.Settings.validationApiKey": "Вы должны предоставить ключ API",
"components.TitleCard.mediaerror": "{mediaType} не найдено",
"components.TitleCard.tmdbid": "TMDB ID",
"components.Settings.restartrequiredTooltip": "Чтобы изменения этого параметра вступили в силу, необходимо перезапустить Overserr",
"components.Settings.restartrequiredTooltip": "Чтобы изменения этого параметра вступили в силу, необходимо перезапустить Jellyseerr",
"components.ManageSlideOver.alltime": "Все время",
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {просмотр} other {просмотров}}",
"components.Settings.Notifications.NotificationsGotify.agentenabled": "Включить агент",
@@ -1214,13 +1214,13 @@
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSending": "Отправка тестового уведомления Gotify…",
"components.Settings.SettingsMain.cacheImages": "Включить кэширование изображений",
"components.Settings.SettingsMain.generalsettings": "Общие настройки",
"components.Settings.SettingsMain.generalsettingsDescription": "Настройте глобальные параметры и параметры по умолчанию для Overserr.",
"components.Settings.SettingsMain.generalsettingsDescription": "Настройте глобальные параметры и параметры по умолчанию для Jellyseerr.",
"components.Settings.SettingsMain.hideAvailable": "Скрыть доступные медиа",
"components.Settings.SettingsMain.regionTip": "Фильтровать контент по региональной доступности",
"components.Settings.SettingsMain.toastApiKeyFailure": "Что-то пошло не так при создании нового ключа API.",
"components.Settings.SettingsMain.locale": "Язык приложения",
"components.Settings.SettingsMain.originallanguage": "Регион поиска",
"components.Settings.tautulliSettingsDescription": "При желании настройте параметры для вашего сервера Tautulli. Overserr извлекает данные истории просмотров Plex из Tautulli.",
"components.Settings.tautulliSettingsDescription": "При желании настройте параметры для вашего сервера Tautulli. Jellyseerr извлекает данные истории просмотров Plex из Tautulli.",
"components.Settings.toastTautulliSettingsFailure": "Что-то пошло не так при сохранении настроек Tautulli.",
"components.Settings.toastTautulliSettingsSuccess": "Настройки Tautulli успешно сохранены!",
"components.Settings.validationUrlBaseTrailingSlash": "База URL не должна заканчиваться косой чертой",
@@ -1241,7 +1241,7 @@
"components.Settings.Notifications.NotificationsGotify.validationTypes": "Вы должны выбрать как минимум один тип уведомления",
"components.Settings.Notifications.NotificationsGotify.validationUrlRequired": "Вы должны указать действующий URL",
"components.Settings.Notifications.NotificationsGotify.validationUrlTrailingSlash": "URL не должен заканчиваться слешем",
"components.Settings.SettingsJobsCache.imagecacheDescription": "Если включено, Overserr будет проксировать и кэшировать изображения из предварительно настроенных внешних источников. Кэшированные изображения сохраняются в папку конфигурации. Вы можете найти файлы в <code>{appDataPath}/cache/images</code>.",
"components.Settings.SettingsJobsCache.imagecacheDescription": "Если включено, Jellyseerr будет проксировать и кэшировать изображения из предварительно настроенных внешних источников. Кэшированные изображения сохраняются в папку конфигурации. Вы можете найти файлы в <code>{appDataPath}/cache/images</code>.",
"components.Settings.tautulliSettings": "Настройки Tautulli",
"components.StatusBadge.seasonepisodenumber": "S{seasonNumber}E{episodeNumber}",
"components.Discover.customizediscover": "Настроить Обнаружение",
@@ -1257,21 +1257,92 @@
"components.Selector.showmore": "Показать больше",
"components.Settings.SettingsJobsCache.imagecachesize": "Размер кэша",
"components.Settings.validationUrlBaseLeadingSlash": "Базовый URL должен начинаться с косой черты",
"components.Discover.FilterSlideover.tmdbuservotecount": "Количество голосов пользователей TMDB",
"components.Discover.FilterSlideover.voteCount": "Количество голосов между {minValue} и {maxValue}",
"components.Discover.tmdbmoviestreamingservices": "Стриминговые сервисы фильмов TMDB",
"components.Discover.tmdbtvstreamingservices": "Стриминговые сервисы сериалов TMDB",
"components.Settings.RadarrModal.tagRequestsInfo": "Автоматически добавлять дополнительный тег с ID и именем запросившего пользователя",
"components.Settings.RadarrModal.tagRequests": "Теги запросов",
"components.Layout.UserWarnings.emailRequired": "Требуется указать email адрес.",
"components.Layout.UserWarnings.passwordRequired": "Требуется указать пароль.",
"components.Login.emailtooltip": "Адрес не обязательно должен быть связан с вашим {mediaServerName} сервером.",
"components.Login.initialsignin": "Подключиться",
"components.Login.initialsigningin": "Подключение…",
"components.Login.save": "Добавить",
"components.Login.saving": "Добавление…",
"components.Login.signinwithjellyfin": "Используйте свой {mediaServerName} аккаунт",
"components.Login.host": "{mediaServerName} URL",
"components.Login.username": "Имя пользователя",
"components.Login.validationEmailFormat": "Неверный email",
"components.Login.validationemailformat": "Необходим корректный email",
"components.Login.validationhostformat": "Необходим корректный URL",
"components.Login.validationhostrequired": "Необходим {mediaServerName} URL",
"components.Login.validationusernamerequired": "Необходимо имя пользователя",
"components.ManageSlideOver.removearr": "Удалить из {arr}",
"components.ManageSlideOver.removearr4k": "Удалить из 4К {arr}",
"components.MovieDetails.imdbuserscore": "Оценка пользователей IMDB",
"components.Settings.SettingsJobsCache.availability-sync": "Синхронизация доступности медиа",
"components.Settings.SonarrModal.tagRequests": "Теги запросов",
"components.Settings.SonarrModal.tagRequestsInfo": "Автоматически добавлять тег с ID и именем запросившего пользователя",
"i18n.collection": "Коллекция",
"components.Settings.Notifications.NotificationsPushover.sound": "Звук уведомления",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Устройство по умолчанию",
"components.Settings.SonarrModal.animeSeriesType": "Тип аниме-сериала",
"components.MovieDetails.openradarr": "Открыть фильм в Radarr",
"components.MovieDetails.play": "Запустить на {mediaServerName}",
"components.MovieDetails.play4k": "Запустить 4К на {mediaServerName}",
"components.Settings.RadarrModal.tagRequests": "Тег запросов",
"components.Layout.UserWarnings.emailInvalid": "Неверный email адрес.",
"components.Settings.SonarrModal.seriesType": "Тип сериала",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук уведомления",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Устройство по умолчанию"
"components.Discover.FilterSlideover.voteCount": "Количество голосов от {minValue} до {maxValue}",
"components.Login.validationEmailRequired": "Вы должны указать адрес электронной почты",
"components.Settings.Notifications.userEmailRequired": "Требуется email пользователя",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Сканировать недавно добавленное в Jellyfin",
"components.Discover.tmdbmoviestreamingservices": "Сервисы потоковой передачи фильмов TMDB",
"components.Discover.tmdbtvstreamingservices": "Сервисы потоковой передачи сериалов TMDB",
"components.Login.description": "Поскольку вы впервые входите в систему {ApplicationName}, вам необходимо добавить адрес электронной почты.",
"components.Settings.Notifications.NotificationsPushover.sound": "Звук уведомлений",
"components.Settings.RadarrModal.tagRequestsInfo": "Автодобавление тега с именем и ID пользователя, отправившего запрос",
"components.Settings.SonarrModal.animeSeriesType": "Тип аниме",
"components.Discover.FilterSlideover.tmdbuservotecount": "Количество голосов от пользователей TMDB",
"components.Login.credentialerror": "Введено неверное имя пользователя или пароль.",
"components.Login.title": "Добавить email",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Это приведет к необратимому удалению {MediaType} из {arr}, включая все файлы.",
"components.Settings.SettingsAbout.supportjellyseerr": "Поддержать Jellyseerr",
"components.Settings.SonarrModal.tagRequests": "Тег запросов",
"components.MovieDetails.downloadstatus": "Статус загрузки",
"components.MovieDetails.openradarr4k": "Открыть фильм в 4К Radarr",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Устройство по умолчанию",
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Сканировать всю библиотеку Jellyfin",
"components.Settings.SettingsJobsCache.availability-sync": "Синхронизировать доступность медиа",
"components.Settings.jellyfinSettingsFailure": "Что-то пошло не так во время сохранения настроек {mediaServerName}.",
"components.Settings.jellyfinSettingsSuccess": "Настройки {mediaServerName} успешно сохранены!",
"components.Settings.jellyfinlibraries": "Библиотеки {mediaServerName}",
"components.Settings.jellyfinlibrariesDescription": "Библиотеки {mediaServerName} проверяются на наличие заголовков. Нажмите кнопку ниже, если в списке не хватает библиотек.",
"components.Settings.jellyfinsettings": "Настройки {mediaServerName}",
"components.Settings.internalUrl": "Внутренний URL-адрес",
"components.Settings.SonarrModal.tagRequestsInfo": "Автодобавление тега с именем и ID пользователя, отправившего запрос",
"components.Settings.jellyfinSettings": "Настройки {mediaServerName}",
"components.Settings.jellyfinSettingsDescription": "Необязательно настраивать внутреннюю и внешнюю конечные точки для вашего сервера {mediaServerName}. В большинстве случаев внешний URL-адрес отличается от внутреннего. Пользовательский URL-адрес для сброса пароля также может быть задан для входа в систему {mediaServerName}, на случай, если вы хотите перенаправить на другую страницу для сброса пароля.",
"components.Settings.jellyfinsettingsDescription": "Настройте свой {mediaServerName} сервер. {mediaServerName} отсканирует ваши библиотеки, чтобы увидеть, какие библиотеки доступны.",
"components.Settings.manualscanJellyfin": "Сканировать библиотеки вручную",
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
"components.Settings.syncJellyfin": "Синхронизировать библиотеки",
"components.Settings.syncing": "Синхронизация",
"components.Settings.timeout": "Время ожидания",
"components.Setup.signin": "Войти",
"components.Setup.signinWithPlex": "Используйте свой Plex аккаунт",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> успешно удален из списка наблюдения!",
"components.TitleCard.watchlistError": "Что-то пошло не так, попробуйте еще раз.",
"components.TvDetails.play": "Запустить в {mediaServerName}",
"components.TvDetails.play4k": "Запустить 4К в {mediaServerName}",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {userCount, plural, one {# новый пользователь} other {# новых пользователя(ей)}} успешно импортированы из {mediaServerName}!",
"components.UserList.importfromJellyfin": "Добавить пользователей из {mediaServerName}",
"components.UserList.noJellyfinuserstoimport": "Нет пользователей {mediaServerName} для импорта.",
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Пользователь {mediaServerName}",
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Сохранение…",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук уведомлений",
"i18n.collection": "Коллекция",
"components.Setup.configuremediaserver": "Настройте медиасервер",
"components.UserList.importfromJellyfinerror": "Что-то пошло не так при импорте пользователей из {mediaServerName}.",
"components.UserList.newJellyfinsigninenabled": "Параметр <strong>Включить новый вход в {mediaServerName}</strong> в настоящее время включен. Пользователей {mediaServerName} с доступом к библиотеке не нужно импортировать для входа.",
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Электронная почта",
"components.UserProfile.localWatchlist": "Список наблюдения {username}",
"components.Settings.manualscanDescriptionJellyfin": "Обычно это выполняется только раз в 24 часа. Jellyseerr будет более настойчиво проверять недавно добавленный сервер {mediaServerName}. Если вы впервые настраиваете Jellyseerr, то рекомендуем однократное полное сканирование библиотеки!",
"components.TitleCard.watchlistCancel": "наблюдение за <strong>{title}</strong> отменено.",
"components.Settings.saving": "Сохранение…",
"components.TitleCard.addToWatchList": "Добавить в список наблюдения",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> успешно добавлен в список наблюдения!",
"components.Settings.save": "Сохранить изменения",
"components.Setup.signinWithJellyfin": "Используйте свой {mediaServerName} аккаунт",
"components.UserList.mediaServerUser": "Пользователь {mediaServerName}",
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Сохранить изменения",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Устройство по умолчанию"
}

59
src/i18n/locale/sl.json Normal file
View File

@@ -0,0 +1,59 @@
{
"components.Discover.CreateSlider.editsuccess": "Urejen drsnik in shranjene nastavitve prilagajanja odkrivanja.",
"components.CollectionDetails.numberofmovies": "{count} film/ov",
"components.Discover.CreateSlider.slidernameplaceholder": "Ime drsnika",
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Premiera ↓",
"components.AppDataWarning.dockerVolumeMissingDescription": "Pripenjanje nosilca <code>{appDataPath}</code> ni bilo pravilno konfigurirano. Vsi podatki bodo izbrisani, ko se vsebnik zaustavi ali znova zažene.",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Priljubljenost ↑",
"components.AirDateBadge.airsrelative": "Predvajanje {relativeTime}",
"components.CollectionDetails.overview": "Pregled",
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# Active Filter} drugo {# Active Filters}}",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Ocena TMDB ↓",
"components.AirDateBadge.airedrelative": "Predvajano {relativeTime}",
"components.Discover.CreateSlider.searchStudios": "Iskanje studiev …",
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Datum izdaje ↑",
"components.Discover.CreateSlider.providetmdbnetwork": "Navedite ID omrežja TMDB",
"components.Discover.CreateSlider.addfail": "Novega drsnika ni bilo mogoče ustvariti.",
"components.CollectionDetails.requestcollection": "Zahtevaj zbirko",
"components.Discover.DiscoverMovieGenre.genreMovies": "Filmi: {genre}",
"components.Discover.DiscoverMovieLanguage.languageMovies": "Filmi: {language}",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Active Filter} other {# Active Filters}}",
"components.Discover.DiscoverMovies.sortPopularityAsc": "Priljubljenost ↓",
"components.Discover.CreateSlider.needresults": "Imeti morate vsaj 1 rezultat.",
"components.Discover.CreateSlider.addcustomslider": "Ustvari drsnik po meri",
"components.Discover.DiscoverTv.sortPopularityAsc": "Priljubljenost ↓",
"components.Discover.CreateSlider.editSlider": "Uredi drsnik",
"components.Discover.DiscoverTv.sortTitleAsc": "Naslov (a-ž) ↓",
"components.Discover.CreateSlider.validationDatarequired": "Navesti morate vrednost podatkov.",
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Premiera ↑",
"components.Discover.DiscoverTv.discovertv": "Serije",
"components.Discover.DiscoverSliderEdit.deletefail": "Drsnika ni bilo mogoče izbrisati.",
"components.Discover.CreateSlider.providetmdbstudio": "Navedite ID studia v TMDB",
"components.Discover.DiscoverMovies.sortTitleDesc": "Naslov (a-ž) ↑",
"components.Discover.DiscoverStudio.studioMovies": "{studio} filmi",
"components.Discover.DiscoverTv.sortPopularityDesc": "Priljubljenost ↑",
"components.Discover.CreateSlider.searchGenres": "Išči žanre …",
"components.Discover.CreateSlider.editfail": "Drsnika ni bilo mogoče urediti.",
"components.Discover.CreateSlider.starttyping": "Tipkajte za iskanje.",
"components.Discover.DiscoverSliderEdit.enable": "Preklopi vidnost",
"components.Discover.CreateSlider.addSlider": "Dodaj drsnik",
"components.CollectionDetails.requestcollection4k": "Zahtevaj zbirko 4K",
"components.Discover.CreateSlider.providetmdbsearch": "Vnesite iskalno poizvedbo",
"components.Discover.DiscoverNetwork.networkSeries": "{network} serije",
"components.Discover.CreateSlider.providetmdbkeywordid": "Navedite ID ključne besede TMDB",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Filmi: {keywordTitle}",
"components.Discover.CreateSlider.validationTitlerequired": "Navesti morate naslov.",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Datum izdaje ↓",
"components.Discover.CreateSlider.nooptions": "Ni zadetkov.",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Ocena TMDB ↑",
"components.Discover.CreateSlider.searchKeywords": "Iskanje po ključnih besedah …",
"components.Discover.CreateSlider.addsuccess": "Ustvarjen nov drsnik in shranjene nastavitve prilagajanja odkrivanja.",
"components.Discover.DiscoverSliderEdit.deletesuccess": "Drsnik je bil uspešno izbrisan.",
"components.Discover.DiscoverMovies.discovermovies": "Filmi",
"components.Discover.DiscoverMovies.sortTitleAsc": "Naslov (a-ž) ↓",
"components.Discover.CreateSlider.providetmdbgenreid": "Navedite ID žanra TMDB",
"components.Discover.DiscoverTv.sortTitleDesc": "Naslov (a-ž) ↑",
"components.Discover.DiscoverSliderEdit.remove": "Odstrani",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Ocena TMDB ↓",
"components.Discover.DiscoverTvGenre.genreSeries": "{genre} Series"
}

File diff suppressed because it is too large Load Diff

1308
src/i18n/locale/tr.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,10 +10,10 @@
"components.Discover.DiscoverMovieLanguage.languageMovies": "Фільми мовою \"{language}\"",
"components.Discover.DiscoverNetwork.networkSeries": "Серіали {network}",
"components.Discover.DiscoverStudio.studioMovies": "Фільми {studio}",
"components.Discover.DiscoverTvGenre.genreSeries": "Серіали в жанрі \"{genre}\"",
"components.Discover.DiscoverTvLanguage.languageSeries": "Серіали мовою \"{language}\"",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Your Watchlist",
"components.Discover.DiscoverWatchlist.watchlist": "Список спостереження Plex",
"components.Discover.DiscoverTvGenre.genreSeries": "Серіали в жанрі {genre}",
"components.Discover.DiscoverTvLanguage.languageSeries": "Серіали мовою {language}",
"components.Discover.DiscoverWatchlist.discoverwatchlist": "Ваш список перегляду Plex",
"components.Discover.DiscoverWatchlist.watchlist": "Список перегляду Plex",
"components.Discover.MovieGenreList.moviegenres": "Фільми за жанрами",
"components.Discover.MovieGenreSlider.moviegenres": "Фільми за жанрами",
"components.Discover.NetworkSlider.networks": "Телеканали",
@@ -25,7 +25,7 @@
"components.Discover.discovertv": "Популярні серіали",
"components.Discover.emptywatchlist": "Тут з’являться медіафайли, додані до вашого <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>.",
"components.Discover.noRequests": "Жодних запитів.",
"components.Discover.plexwatchlist": "Ваш список спостереження Plex",
"components.Discover.plexwatchlist": "Ваш список перегляду Plex",
"components.Discover.popularmovies": "Популярні фільми",
"components.Discover.populartv": "Популярні серіали",
"components.Discover.recentlyAdded": "Нещодавно додані",
@@ -118,7 +118,7 @@
"components.Layout.Sidebar.settings": "Налаштування",
"components.Layout.Sidebar.users": "Користувачі",
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "Запити на фільми",
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Запити на серіали",
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "Запити на сезони",
"components.Layout.UserDropdown.myprofile": "Профіль",
"components.Layout.UserDropdown.requests": "Запити",
"components.Layout.UserDropdown.settings": "Налаштування",
@@ -142,24 +142,24 @@
"components.ManageSlideOver.downloadstatus": "Завантаження",
"components.ManageSlideOver.manageModalAdvanced": "Просунутий",
"components.ManageSlideOver.manageModalClearMedia": "Очистити дані",
"components.ManageSlideOver.manageModalClearMediaWarning": "* Це призведе до незворотного видалення всіх даних для цього {mediaType}а, включаючи будь-які запити. Якщо цей елемент існує у вашій бібліотеці {mediaServerName}, мультимедійна інформація про нього буде відтворена під час наступного сканування. ",
"components.ManageSlideOver.manageModalClearMediaWarning": "* Це призведе до незворотного видалення всіх даних для цього {mediaType}а, включаючи будь-які запити. Якщо цей елемент існує у вашій бібліотеці {mediaServerName}, мультимедійна інформація про нього буде відтворена під час наступного сканування.",
"components.ManageSlideOver.manageModalIssues": "Відкриті проблеми",
"components.ManageSlideOver.manageModalMedia": "Media",
"components.ManageSlideOver.manageModalMedia4k": "4K Media",
"components.ManageSlideOver.manageModalNoRequests": "Запитів немає.",
"components.ManageSlideOver.manageModalRequests": "Запити",
"components.ManageSlideOver.manageModalTitle": "Управління {mediaType}",
"components.ManageSlideOver.manageModalTitle": "Управління {mediaType}ом",
"components.ManageSlideOver.mark4kavailable": "Позначити як доступний у 4К",
"components.ManageSlideOver.markallseasons4kavailable": "Позначити всі сезони як доступні в 4K",
"components.ManageSlideOver.markallseasonsavailable": "Mark All Seasons as Available",
"components.ManageSlideOver.markallseasonsavailable": "Позначити всі сезони як доступні",
"components.ManageSlideOver.markavailable": "Позначити як доступний",
"components.ManageSlideOver.movie": "фільм",
"components.ManageSlideOver.openarr": "Відкрити в {arr}",
"components.ManageSlideOver.openarr4k": "Відкрити в 4К {arr}",
"components.ManageSlideOver.opentautulli": "Відкрити в Tautulli",
"components.ManageSlideOver.pastdays": "Останні {days, number} днів",
"components.ManageSlideOver.playedby": "Грає",
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {грає} other {грають}}",
"components.ManageSlideOver.playedby": "Переглядає",
"components.ManageSlideOver.plays": "<strong>{playCount, number}</strong> {playCount, plural, one {перегляд} other {переглядів}}",
"components.ManageSlideOver.tvshow": "серіал",
"components.MediaSlider.ShowMoreCard.seemore": "Подивитися більше",
"components.MovieDetails.MovieCast.fullcast": "Повний акторський склад",
@@ -210,7 +210,7 @@
"components.NotificationTypeSelector.mediaapproved": "Схвалення медіа-запитів",
"components.NotificationTypeSelector.mediaapprovedDescription": "Надсилати повідомлення, коли медіа-запити схвалюються вручну.",
"components.NotificationTypeSelector.mediaautorequested": "Запит надіслано автоматично",
"components.NotificationTypeSelector.mediaautorequestedDescription": "Отримуйте сповіщення, коли нові медіа-запити автоматично надсилаються для елементів у вашому списку спостереження Plex.",
"components.NotificationTypeSelector.mediaautorequestedDescription": "Отримуйте сповіщення, коли нові медіа-запити автоматично надсилаються для елементів у вашому списку перегляду Plex.",
"components.NotificationTypeSelector.mediaavailable": "Доступні нові медіафайли",
"components.NotificationTypeSelector.mediaavailableDescription": "Надсилати повідомлення, коли запитані медіафайли стають доступними.",
"components.NotificationTypeSelector.mediadeclined": "Відхилення медіа-запитів",
@@ -245,13 +245,13 @@
"components.PermissionEdit.autoapproveMovies": "Автоматичне схвалення фільмів",
"components.PermissionEdit.autoapproveMoviesDescription": "Надати дозвіл на автоматичне схвалення всіх фільмів, відмінних від 4К.",
"components.PermissionEdit.autoapproveSeries": "Автоматичне схвалення серіалів",
"components.PermissionEdit.autoapproveSeriesDescription": "Надати дозвіл на автоматичне схвалення всіх серіалів, відмінних від 4К.",
"components.PermissionEdit.autoapproveSeriesDescription": "Надати дозвіл на автоматичне схвалення всіх серіалів, відмінних від 4K.",
"components.PermissionEdit.autorequest": "Автоматичний запит",
"components.PermissionEdit.autorequestDescription": "Надайте дозвіл на автоматичне надсилання запитів на медіафайли, відмінні від 4K, через Plex Watchlist.",
"components.PermissionEdit.autorequestDescription": "Надайте дозвіл на автоматичне надсилання запитів на медіафайли, відмінні від 4K, через список перегляду Plex.",
"components.PermissionEdit.autorequestMovies": "Автоматичний запит фільмів",
"components.PermissionEdit.autorequestMoviesDescription": "Надайте дозвіл на автоматичне надсилання запитів на фільми, відмінні від 4K, через Plex Watchlist.",
"components.PermissionEdit.autorequestMoviesDescription": "Надайте дозвіл на автоматичне надсилання запитів на фільми, відмінні від 4K, через список перегляду Plex.",
"components.PermissionEdit.autorequestSeries": "Автоматичний запит Серіалів",
"components.PermissionEdit.autorequestSeriesDescription": "Надайте дозвіл на автоматичне надсилання запитів на серіали, відмінні від 4K, через Plex Watchlist.",
"components.PermissionEdit.autorequestSeriesDescription": "Надайте дозвіл на автоматичне надсилання запитів на серіали, відмінні від 4K, через список перегляду Plex.",
"components.PermissionEdit.createissues": "Повідомлення про проблеми",
"components.PermissionEdit.createissuesDescription": "Надати дозвіл на повідомлення про проблеми з медіафайлами.",
"components.PermissionEdit.manageissues": "Управління проблемами",
@@ -266,7 +266,7 @@
"components.PermissionEdit.request4kTv": "Запити серіалів у 4К",
"components.PermissionEdit.request4kTvDescription": "Надати дозвіл на надсилання запитів серіалів у 4К.",
"components.PermissionEdit.requestDescription": "Надати дозвіл на надсилання запитів усіх медіафайлів, відмінних від 4К.",
"components.PermissionEdit.requestMovies": "Замовити фільми",
"components.PermissionEdit.requestMovies": "Запити фільмів",
"components.PermissionEdit.requestMoviesDescription": "Надати дозвіл на надсилання запитів усіх фільмів, відмінних від 4К.",
"components.PermissionEdit.requestTv": "Запити серіалів",
"components.PermissionEdit.requestTvDescription": "Надати дозвіл на надсилання запитів усіх серіалів, відмінних від 4К.",
@@ -280,8 +280,8 @@
"components.PermissionEdit.viewrecentDescription": "Надайте дозвіл на перегляд списку нещодавно доданих медіа.",
"components.PermissionEdit.viewrequests": "Перегляд запитів",
"components.PermissionEdit.viewrequestsDescription": "Надати дозвіл на перегляд медіа-запитів, надісланих іншими користувачами.",
"components.PermissionEdit.viewwatchlists": "Перегляньте списки спостереження Plex",
"components.PermissionEdit.viewwatchlistsDescription": "Надайте дозвіл на перегляд списків спостереження Plex інших користувачів.",
"components.PermissionEdit.viewwatchlists": "Перегляд списків переглядів Plex",
"components.PermissionEdit.viewwatchlistsDescription": "Надайте дозвіл на перегляд списків перегляду Plex інших користувачів.",
"components.PersonDetails.alsoknownas": "Також відомий(а) як: {names}",
"components.PersonDetails.appearsin": "Появи у фільмах та серіалах",
"components.PersonDetails.ascharacter": "в ролі {character}",
@@ -291,10 +291,10 @@
"components.PlexLoginButton.signingin": "Виконується вхід...",
"components.PlexLoginButton.signinwithplex": "Увійти",
"components.QuotaSelector.days": "{count, plural, one {день} other {днів}}",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{фільмів} за {quotaDays} {днів}</quotaUnits>",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} на {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.movies": "{count, plural, one {фільм} other {фільми}}",
"components.QuotaSelector.seasons": "{count, plural, one {сезон} other {сезони}}",
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{сезонів} за {quotaDays} {днів}</quotaUnits>",
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{seasons} на {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.unlimited": "Необмежено",
"components.RegionSelector.regionDefault": "Всі регіони",
"components.RegionSelector.regionServerDefault": "За замовчуванням ({region})",
@@ -329,7 +329,7 @@
"components.RequestCard.deleterequest": "Видалити запит",
"components.RequestCard.editrequest": "Редагувати запит",
"components.RequestCard.failedretry": "Щось пішло не так при спробі повторити запит.",
"components.RequestCard.mediaerror": "Назва, пов'язана з цим запитом, більше недоступна.",
"components.RequestCard.mediaerror": "{mediaType} Не знайдено",
"components.RequestCard.seasons": "{seasonCount, plural, one {Сезон} other {Сезони}}",
"components.RequestCard.tmdbid": "TMDB ID",
"components.RequestCard.tvdbid": "TheTVDB ID",
@@ -338,7 +338,7 @@
"components.RequestList.RequestItem.deleterequest": "Видалити запит",
"components.RequestList.RequestItem.editrequest": "Редагувати запит",
"components.RequestList.RequestItem.failedretry": "Щось пішло не так при спробі повторити запит.",
"components.RequestList.RequestItem.mediaerror": "Назва, пов'язана з цим запитом, більше недоступна.",
"components.RequestList.RequestItem.mediaerror": "{mediaType} Не знайдено",
"components.RequestList.RequestItem.modified": "Змінено",
"components.RequestList.RequestItem.modifieduserdate": "{date} користувачем {user}",
"components.RequestList.RequestItem.requested": "Запрошений",
@@ -366,17 +366,17 @@
"components.RequestModal.QuotaDisplay.allowedRequests": "Вам дозволено запитувати <strong>{limit}</strong> {type} кожні <strong>{days}</strong> днів.",
"components.RequestModal.QuotaDisplay.allowedRequestsUser": "Цьому користувачеві дозволено запитувати <strong>{limit}</strong> {type} кожні <strong>{days}</strong> днів.",
"components.RequestModal.QuotaDisplay.movie": "фільм",
"components.RequestModal.QuotaDisplay.movielimit": "{limit, plural, one {фільм} other {фільми}}",
"components.RequestModal.QuotaDisplay.movielimit": "{limit, plural, one {фільм} other {фільмів}}",
"components.RequestModal.QuotaDisplay.notenoughseasonrequests": "Залишилося недостатньо запитів на сезони",
"components.RequestModal.QuotaDisplay.quotaLink": "Ви можете переглянути зведення ваших обмежень на кількість запитів на <ProfileLink>сторінці вашого профілю</ProfileLink>.",
"components.RequestModal.QuotaDisplay.quotaLinkUser": "Ви можете переглянути зведення обмежень на кількість запитів цього користувача на <ProfileLink>сторінці його профілю</ProfileLink>.",
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {запитів {type} не залишилося} other {залишилось <strong>#</strong> запиту(ів) {type}}}",
"components.RequestModal.QuotaDisplay.requiredquota": "Вам необхідно мати принаймні <strong>{seasons}</strong> {seasons, plural, one {запит на сезони} other {запиту(ів) на сезони}} для того , щоб надіслати запит на цей серіал.",
"components.RequestModal.QuotaDisplay.requestsremaining": "{remaining, plural, =0 {Запитів на {type} не залишилося} other {Залишилось <strong>#</strong> запити(ів) на {type}}}",
"components.RequestModal.QuotaDisplay.requiredquota": "Вам необхідно мати принаймні <strong>{seasons}</strong> {seasons, plural, one {запит на сезони} other {запиту(ів) на сезони}} для того, щоб надіслати запит на цей серіал.",
"components.RequestModal.QuotaDisplay.requiredquotaUser": "Цьому користувачеві необхідно мати принаймні <strong>{seasons}</strong> {seasons, plural, one {запит на сезони} other {запиту(ів) на сезони}} для того, щоб надіслати запит на цей серіал.",
"components.RequestModal.QuotaDisplay.season": "сезон",
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {сезон} other {сезони}}",
"components.RequestModal.SearchByNameModal.nomatches": "Нам не вдалося знайти відповідність для цієї серії.",
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Ми не змогли автоматично виконати ваш запит. Будь ласка, виберіть правильний збіг зі списку нижче.",
"components.RequestModal.QuotaDisplay.seasonlimit": "{limit, plural, one {сезон} other {сезонів}}",
"components.RequestModal.SearchByNameModal.nomatches": "Нам не вдалося знайти відповідність для цього серіалу.",
"components.RequestModal.SearchByNameModal.notvdbiddescription": "Нам не вдалося автоматично знайти цей серіал. Будь ласка, виберіть правильний збіг зі списку нижче.",
"components.RequestModal.alreadyrequested": "Вже запрошений",
"components.RequestModal.approve": "Схвалити запит",
"components.RequestModal.autoapproval": "Автоматичне схвалення",
@@ -385,9 +385,9 @@
"components.RequestModal.errorediting": "Щось пішло не так під час редагування запиту.",
"components.RequestModal.extras": "Додатково",
"components.RequestModal.numberofepisodes": "# епізодів",
"components.RequestModal.pending4krequest": "",
"components.RequestModal.pending4krequest": "Очікуючий запит в 4К",
"components.RequestModal.pendingapproval": "Ваш запит чекає схвалення.",
"components.RequestModal.pendingrequest": "",
"components.RequestModal.pendingrequest": "Очікуючий запит",
"components.RequestModal.requestApproved": "Запит на <strong>{title}</strong> схвалений!",
"components.RequestModal.requestCancel": "Запит на <strong>{title}</strong> скасовано.",
"components.RequestModal.requestSuccess": "<strong>{title}</strong> успішно запрошений!",
@@ -404,7 +404,7 @@
"components.RequestModal.requestmovietitle": "Запит на фільм",
"components.RequestModal.requestseasons": "Запросити {seasonCount} {seasonCount, plural, one {сезон} other {сезону(ів)}}",
"components.RequestModal.requestseasons4k": "Запит {seasonCount} {seasonCount, plural, one {сезону} other {сезонів}} у 4К",
"components.RequestModal.requestseries4ktitle": "Надіслати запит на серіал у 4K",
"components.RequestModal.requestseries4ktitle": "Запросити серіал у 4K",
"components.RequestModal.requestseriestitle": "Запит на серіал",
"components.RequestModal.season": "Сезон",
"components.RequestModal.seasonnumber": "Сезон {number}",
@@ -452,7 +452,7 @@
"components.Settings.Notifications.NotificationsPushbullet.accessToken": "Токен доступу",
"components.Settings.Notifications.NotificationsPushbullet.accessTokenTip": "Створіть токен у <PushbulletSettingsLink>налаштуваннях облікового запису</PushbulletSettingsLink>",
"components.Settings.Notifications.NotificationsPushbullet.agentEnabled": "Активувати службу",
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "Channel Tag",
"components.Settings.Notifications.NotificationsPushbullet.channelTag": "Тег каналу",
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsFailed": "Не вдалося зберегти налаштування сповіщень Pushbullet.",
"components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsSaved": "Налаштування сповіщень Pushbullet успішно збережено!",
"components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestFailed": "Не вдалося надіслати тестове повідомлення до Pushbullet.",
@@ -609,7 +609,7 @@
"components.Settings.RadarrModal.validationRootFolderRequired": "Ви повинні вибрати кореневий каталог",
"components.Settings.SettingsAbout.Releases.currentversion": "Поточна",
"components.Settings.SettingsAbout.Releases.latestversion": "Остання",
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Дані про дозвіл в даний час недоступні.",
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Дані про реліз наразі недоступні.",
"components.Settings.SettingsAbout.Releases.releases": "Релізи",
"components.Settings.SettingsAbout.Releases.versionChangelog": "Зміни у версії {version}",
"components.Settings.SettingsAbout.Releases.viewchangelog": "Переглянути список змін",
@@ -626,7 +626,7 @@
"components.Settings.SettingsAbout.preferredmethod": "Переважний спосіб",
"components.Settings.SettingsAbout.runningDevelop": "Ви використовуєте гілку <code>develop</code> проекту Jellyseerr, яка рекомендується тільки для тих, хто робить внесок у розробку або допомагає в тестуванні.",
"components.Settings.SettingsAbout.supportoverseerr": "Підтримати Jellyseerr",
"components.Settings.SettingsAbout.timezone": "Годинний пояс",
"components.Settings.SettingsAbout.timezone": "Часовий пояс",
"components.Settings.SettingsAbout.totalmedia": "Усього мультимедіа",
"components.Settings.SettingsAbout.totalrequests": "Усього запитів",
"components.Settings.SettingsAbout.uptodate": "Актуальна",
@@ -645,7 +645,7 @@
"components.Settings.SettingsJobsCache.download-sync": "Синхронізувати завантаження",
"components.Settings.SettingsJobsCache.download-sync-reset": "Скинути синхронізацію завантажень",
"components.Settings.SettingsJobsCache.editJobSchedule": "Змінити завдання",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Current Frequency",
"components.Settings.SettingsJobsCache.editJobScheduleCurrent": "Поточна частота",
"components.Settings.SettingsJobsCache.editJobSchedulePrompt": "Частота",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "Кожен {jobScheduleHours, plural, one {година} other {{jobScheduleHours} години(ів)}}",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "Кожну {jobScheduleMinutes, plural, one {хвилину} other {{jobScheduleMinutes} хвилин(и)}}",
@@ -837,7 +837,7 @@
"components.Settings.sonarrsettings": "Налаштування Sonarr",
"components.Settings.ssl": "SSL",
"components.Settings.startscan": "Почати сканування",
"components.Settings.tautulliApiKey": "API Key",
"components.Settings.tautulliApiKey": "Ключ API",
"components.Settings.tautulliSettings": "Tautulli Налаштування",
"components.Settings.tautulliSettingsDescription": "За бажанням налаштуйте параметри для вашого сервера Tautulli. Jellyseerr отримує дані історії переглядів для медіафайлів Plex від Tautulli.",
"components.Settings.toastApiKeyFailure": "Щось пішло не так при створенні нового ключа API.",
@@ -966,8 +966,8 @@
"components.UserList.user": "Користувач",
"components.UserList.usercreatedfailed": "Щось пішло не так при створенні користувача.",
"components.UserList.usercreatedfailedexisting": "Вказана адреса електронної пошти вже використовується іншим користувачем.",
"components.UserList.usercreatedsuccess": "Користувач успішно створено!",
"components.UserList.userdeleted": "Користувач успішно видалено!",
"components.UserList.usercreatedsuccess": "Користувача успішно створено!",
"components.UserList.userdeleted": "Користувача успішно видалено!",
"components.UserList.userdeleteerror": "Щось пішло не так при видаленні користувача.",
"components.UserList.userfail": "Щось пішло не так при збереженні дозволів користувача.",
"components.UserList.userlist": "Список користувачів",
@@ -996,9 +996,9 @@
"components.UserProfile.UserSettings.UserGeneralSettings.owner": "Власник",
"components.UserProfile.UserSettings.UserGeneralSettings.plexuser": "Користувач Plex",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmovies": "Автоматичний запит фільмів",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Автоматично надсилайте запит на перегляд фільмів у своєму <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncmoviestip": "Автоматично запитувати фільми з вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Автоматичний запит Серіалів",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Автоматично надсилайте запит на серіал у своєму <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Автоматично запитувати серіали з вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>",
"components.UserProfile.UserSettings.UserGeneralSettings.region": "Регіон для пошуку фільмів та серіалів",
"components.UserProfile.UserSettings.UserGeneralSettings.regionTip": "Контент фільтрується за доступністю у вибраному регіоні",
"components.UserProfile.UserSettings.UserGeneralSettings.role": "Роль",
@@ -1031,7 +1031,7 @@
"components.UserProfile.UserSettings.UserNotificationSettings.sendSilently": "Надсилати без звуку",
"components.UserProfile.UserSettings.UserNotificationSettings.sendSilentlyDescription": "Надсилати повідомлення без звуку",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatId": "ID чату",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatIdTipLong": "<TelegramBotLink>Почніть чат</TelegramBotLink>, додайте <GetIdBotLink>@get_id_bot</GetIdBotLink> і виконайте команду <code>/my_id</code>",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramChatIdTipLong": "<TelegramBotLink>Почніть чат</TelegramBotLink>, додайте <GetIdBotLink>@get_id_bot</GetIdBotLink> і виконайте команду <code>/my_id</code>",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingsfailed": "Не вдалося зберегти налаштування сповіщень Telegram.",
"components.UserProfile.UserSettings.UserNotificationSettings.telegramsettingssaved": "Налаштування сповіщень Telegram успішно збережено!",
"components.UserProfile.UserSettings.UserNotificationSettings.validationDiscordId": "Ви повинні надати дійсний ID користувача",
@@ -1067,15 +1067,15 @@
"components.UserProfile.UserSettings.menuNotifications": "Сповіщення",
"components.UserProfile.UserSettings.menuPermissions": "Дозволи",
"components.UserProfile.UserSettings.unauthorizedDescription": "У вас немає дозволу на зміну налаштувань цього користувача.",
"components.UserProfile.emptywatchlist": "Тут з’являться медіафайли, додані до вашого <PlexWatchlistSupportLink>списку спостереження Plex</PlexWatchlistSupportLink>.",
"components.UserProfile.emptywatchlist": "Тут з’являться медіафайли, додані до вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>.",
"components.UserProfile.limit": "{remaining} з {limit}",
"components.UserProfile.movierequests": "Запитів фільмів",
"components.UserProfile.pastdays": "{type} (за {days} день(ів))",
"components.UserProfile.plexwatchlist": "Список спостереження Plex",
"components.UserProfile.pastdays": "{type} (на {days} дні(в)",
"components.UserProfile.plexwatchlist": "Список перегляду Plex",
"components.UserProfile.recentlywatched": "Нещодавно переглянуто",
"components.UserProfile.recentrequests": "Останні запити",
"components.UserProfile.requestsperdays": "залишилось {limit}",
"components.UserProfile.seriesrequest": "Запитів серіалів",
"components.UserProfile.seriesrequest": "Запитів сезонів",
"components.UserProfile.totalrequests": "Усього запитів",
"components.UserProfile.unlimited": "Необмежено",
"i18n.advanced": "Для просунутих користувачів",
@@ -1114,7 +1114,7 @@
"i18n.requested": "Запрошений",
"i18n.requesting": "Запит…",
"i18n.resolved": "Вирішені",
"i18n.restartRequired": "Restart Required",
"i18n.restartRequired": "Потрібне перезавантаження",
"i18n.resultsperpage": "Відобразити {pageSize} результатів на сторінці",
"i18n.retry": "Повторити",
"i18n.retrying": "Повтор…",
@@ -1140,144 +1140,211 @@
"Components.PermissionEdit.requestMovies": "Запити фільмів",
"Components.PermissionEdit.autoapprove4kMovies": "Автоматичне схвалення 4К фільмів",
"Components.PermissionEdit.autoapproveMovies": "Автоматичне схвалення фільмів",
"components.Discover.FilterSlideover.studio": "Студія",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Нещодавно додані",
"components.Discover.FilterSlideover.keywords": "Ключові слова",
"components.Discover.FilterSlideover.ratingText": "Оцінки від {minValue} до {maxValue}",
"components.Discover.FilterSlideover.tmdbuserscore": "Оцінка користувачів TMDB",
"components.Discover.DiscoverTv.discovertv": "Серіали",
"components.Discover.FilterSlideover.runtime": "Тривалість",
"components.Discover.FilterSlideover.from": "Від",
"components.Discover.studios": "Студії",
"components.Discover.FilterSlideover.to": "До",
"components.Discover.FilterSlideover.filters": "Фільтри",
"components.Discover.CreateSlider.providetmdbsearch": "Введіть пошуковий запит",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Фільми {keywordTitle}",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Ваш список перегляду Plex",
"components.Discover.FilterSlideover.genres": "Жанри",
"components.Discover.FilterSlideover.originalLanguage": "Мова оригіналу",
"components.Discover.CreateSlider.nooptions": "Немає результатів.",
"components.Discover.FilterSlideover.tmdbuservotecount": "Кількість голосів користувачів TMDB",
"components.Discover.DiscoverMovies.discovermovies": "Фільми",
"components.Discover.FilterSlideover.clearfilters": "Очистити активні фільтри",
"components.Discover.CreateSlider.searchKeywords": "Ключові слова пошуку…",
"components.Discover.CreateSlider.searchStudios": "Пошук студій…",
"components.Discover.CreateSlider.starttyping": "Починайте писати для пошуку.",
"components.Discover.CreateSlider.validationTitlerequired": "Ви повинні вказати назву.",
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
"components.Discover.DiscoverMovies.discovermovies": "Фільми",
"components.Discover.DiscoverSliderEdit.enable": "Змінити видимість",
"components.Discover.DiscoverSliderEdit.remove": "Видалити",
"components.Discover.DiscoverTv.discovertv": "Серіали",
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
"components.Discover.FilterSlideover.filters": "Фільтри",
"components.Discover.FilterSlideover.from": "Від",
"components.Discover.FilterSlideover.genres": "Жанри",
"components.Discover.FilterSlideover.keywords": "Ключові слова",
"components.Discover.FilterSlideover.originalLanguage": "Оригінальна мова",
"components.Discover.FilterSlideover.ratingText": "Оцінки від {minValue} до {maxValue}",
"components.Discover.FilterSlideover.releaseDate": "Дата релізу",
"components.Discover.FilterSlideover.runtime": "Тривалість",
"components.Discover.FilterSlideover.studio": "Студія",
"components.Discover.FilterSlideover.tmdbuserscore": "Оцінка користувачів TMDB",
"components.Discover.FilterSlideover.tmdbuservotecount": "Кількість голосів від користувачів TMDB",
"components.Discover.FilterSlideover.to": "До",
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Медіа додано до вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>.",
"components.Discover.PlexWatchlistSlider.plexwatchlist": "Ваш список перегляду Plex",
"components.Discover.RecentlyAddedSlider.recentlyAdded": "Нещодавно додані",
"components.Discover.studios": "Студії",
"components.Discover.tmdbmoviegenre": "Жанр фільму TMDB",
"components.Discover.tmdbmoviekeyword": "Ключове слово фільму TMDB",
"components.Discover.tmdbmoviestreamingservices": "Сервіси потокової передачі фільмів TMDB",
"components.Discover.tmdbnetwork": "Телеканал TMDB",
"components.Discover.tmdbstudio": "Студія TMDB",
"components.Discover.tmdbtvgenre": "Жанр серіалу TMDB",
"components.Discover.tmdbtvkeyword": "Ключове слово серіалу TMDB",
"components.Discover.tvgenres": "Жанри серіалів",
"components.Layout.UserWarnings.passwordRequired": "Потрібно вказати пароль.",
"components.Login.host": "{mediaServerName} URL",
"components.Login.initialsignin": "Підключитися",
"components.Login.initialsigningin": "Підключення…",
"components.Login.save": "Додати",
"components.Login.signinwithjellyfin": "Використовуйте свій {mediaServerName} обліковий запис",
"components.Login.title": "Додати email",
"components.Login.username": "Ім'я користувача",
"components.ManageSlideOver.removearr4k": "Видалити з 4K {arr}",
"components.MovieDetails.downloadstatus": "Статус завантаження",
"components.MovieDetails.imdbuserscore": "Оцінка користувачів IMDB",
"components.MovieDetails.openradarr4k": "Відкрити фільм у 4К Radarr",
"components.Selector.searchKeywords": "Ключові слова пошуку…",
"components.Selector.searchStudios": "Пошук студій…",
"components.Selector.starttyping": "Початок введення для пошуку.",
"components.Settings.Notifications.NotificationsPushover.sound": "Звук сповіщення",
"components.Settings.SettingsMain.general": "Загальні",
"components.Settings.SettingsMain.generalsettings": "Загальні налаштування",
"components.Settings.SettingsMain.applicationTitle": "Назва програми",
"components.Settings.SettingsMain.applicationurl": "URL програми",
"components.Settings.SettingsMain.cacheImages": "Увімкнути кешування зображень",
"components.Settings.SettingsMain.csrfProtection": "Увімкнути CSRF захист",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "НЕ вмикайте цей параметр, якщо ви не розумієте, що робите!",
"components.Settings.SettingsMain.hideAvailable": "Приховати доступні медіа",
"components.Settings.SettingsMain.locale": "Мова програми",
"components.Settings.SettingsMain.originallanguage": "Мови для пошуку фільмів та серіалів",
"components.Settings.SettingsMain.partialRequestsEnabled": "Дозволити запитувати серіали частково",
"components.Settings.SettingsMain.region": "Регіон для пошуку фільмів та серіалів",
"components.Settings.SettingsMain.regionTip": "Фільтрувати вміст за регіональною доступністю",
"components.Settings.SettingsMain.toastApiKeySuccess": "Новий ключ API успішно згенеровано!",
"components.Settings.SettingsMain.toastSettingsFailure": "Під час збереження налаштувань сталася помилка.",
"components.Settings.SettingsMain.toastSettingsSuccess": "Налаштування успішно збережено!",
"components.Settings.SettingsMain.trustProxyTip": "Дозволити Jellyseerr правильно реєструвати IP-адреси клієнтів за проксі-сервером",
"components.Settings.SettingsMain.validationApplicationUrl": "Ви повинні надати дійсну URL-адресу",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL-адреса не має закінчуватися косою рискою",
"components.Settings.SonarrModal.animeSeriesType": "Тип аніме",
"components.Settings.jellyfinSettings": "Налаштування {mediaServerName}",
"components.Settings.jellyfinSettingsSuccess": "Налаштування {mediaServerName} успішно збережено!",
"components.Settings.jellyfinlibraries": "Бібліотеки {mediaServerName}",
"components.Settings.jellyfinsettings": "Налаштування {mediaServerName}",
"components.Setup.signinWithPlex": "Використовуйте свій обліковий запис Plex",
"components.TvDetails.play": "Відтворити в {mediaServerName}",
"components.UserList.mediaServerUser": "Користувач {mediaServerName}",
"components.UserProfile.UserSettings.UserGeneralSettings.email": "Електронна пошта",
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "Збереження…",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук сповіщення",
"i18n.collection": "Колекція",
"components.Discover.CreateSlider.needresults": "Ви повинні мати принаймні 1 результат.",
"components.Discover.CreateSlider.searchGenres": "Пошук жанрів…",
"components.Discover.DiscoverMovieKeyword.keywordMovies": "Фільми {keywordTitle}",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Серіали",
"components.Discover.FilterSlideover.clearfilters": "Очистити всі активні фільтри",
"components.Discover.FilterSlideover.runtimeText": "тривалість {minValue}-{maxValue} хвилин",
"components.Discover.FilterSlideover.voteCount": "Кількість голосів від {minValue} до {maxValue}",
"components.Discover.DiscoverSliderEdit.remove": "Видалити",
"components.Layout.Sidebar.browsemovies": "Фільми",
"components.MovieDetails.imdbuserscore": "Оцінка користувачів IMDB",
"components.Layout.Sidebar.browsetv": "Серіали",
"components.Discover.DiscoverTv.sortPopularityDesc": "Популярність за спаданням",
"components.Discover.moviegenres": "Жанри фільмів",
"components.Discover.resetwarning": "Скинути всі повзунки до стандартних. Це також видалить будь-які спеціальні повзунки!",
"components.Discover.stopediting": "Зупинити редагування",
"components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
"components.Discover.DiscoverTv.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
"components.Discover.FilterSlideover.streamingservices": "Сервіси потокового передавання",
"components.Discover.FilterSlideover.activefilters": "{count, plural, one {# Активний фільтр} other {# Активні фільтри}}",
"components.Discover.CreateSlider.addSlider": "Додати повзунок",
"components.Discover.tvgenres": "Жанри серіалів",
"components.Discover.tmdbmoviekeyword": "Ключове слово фільму TMDB",
"components.Discover.tmdbtvkeyword": "Ключове слово серіала TMDB",
"components.Discover.tmdbnetwork": "Телеканал TMDB",
"components.Discover.networks": "Телеканали",
"components.Discover.tmdbtvgenre": "Жанр серіала TMDB",
"components.Discover.tmdbstudio": "Студія TMDB",
"components.Discover.tmdbtvstreamingservices": "Сервіси потокового передавання серіалів TMDB",
"components.Discover.tmdbmoviestreamingservices": "Сервіси потокової передачі фільмів TMDB",
"components.Discover.resetfailed": "Щось пішло не так під час скидання налаштувань Discover.",
"components.Discover.tmdbsearch": "Пошук TMDB",
"components.Discover.CreateSlider.searchKeywords": "Ключові слова пошуку…",
"components.Discover.tmdbmoviegenre": "Жанр фільму TMDB",
"components.Discover.updatesuccess": "Оновлено параметри налаштування Discover.",
"components.Discover.resetsuccess": "Успішно скинуто параметри налаштування.",
"components.Discover.updatefailed": "Під час оновлення налаштувань Discover сталася помилка.",
"components.Selector.showmore": "Показати більше",
"components.Selector.searchGenres": "Виберіть жанри…",
"components.Selector.searchStudios": "Пошук студій…",
"components.Discover.CreateSlider.addcustomslider": "Створити власний повзунок",
"components.Selector.showless": "Показати менше",
"components.Selector.starttyping": "Початок введення для пошуку.",
"components.Selector.searchKeywords": "Пошук за ключовими словами…",
"components.Selector.nooptions": "Немає результатів.",
"components.Discover.resettodefault": "Скинути за замовчуванням",
"components.Settings.SettingsJobsCache.availability-sync": "Синхронізація доступності медіа",
"components.Discover.tmdbsearch": "Пошук TMDB",
"components.Discover.tmdbtvstreamingservices": "Сервіси потокового передавання серіалів TMDB",
"components.Layout.Sidebar.browsemovies": "Фільми",
"components.Layout.Sidebar.browsetv": "Серіали",
"components.Layout.UserWarnings.emailInvalid": "Адреса електронної пошти недійсна.",
"components.Login.saving": "Додавання…",
"components.Login.validationhostformat": "Потрібна дійсна URL-адреса",
"components.Login.validationusernamerequired": "Потрібно ім'я користувача",
"components.ManageSlideOver.removearr": "Видалити з {arr}",
"components.MovieDetails.openradarr": "Відкрити фільм у Radarr",
"components.Selector.nooptions": "Немає результатів.",
"components.Selector.searchGenres": "Виберіть жанри…",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Пристрій за замовчуванням",
"components.Settings.Notifications.userEmailRequired": "Потрібен email користувача",
"components.Settings.RadarrModal.tagRequestsInfo": "Автоматично додавати додатковий тег з ID та іменем користувача, який запитує",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Кожну {jobScheduleSeconds, plural, one {секунду} other {{jobScheduleSeconds} секунд}}",
"components.Settings.RadarrModal.tagRequests": "Теги запитів",
"components.Settings.SettingsMain.hideAvailable": "Приховати доступні медіа",
"components.Settings.SettingsMain.regionTip": "Фільтрувати вміст за регіональною доступністю",
"components.Settings.SettingsMain.region": "Регіон для пошуку фільмів та серіалів",
"components.Settings.SettingsMain.trustProxy": "Увімкнути підтримку проксі",
"components.Settings.SettingsMain.toastSettingsSuccess": "Налаштування успішно збережено!",
"components.Settings.SettingsMain.locale": "Мова інтерфейсу",
"components.Settings.SettingsMain.applicationTitle": "Назва програми",
"components.Settings.SettingsMain.originallanguage": "Мови для пошуку фільмів та серіалів",
"components.Settings.SettingsMain.csrfProtection": "Увімкнути захист CSRF",
"components.Settings.SettingsMain.toastApiKeyFailure": "Під час створення нового ключа API сталася помилка.",
"components.Settings.SettingsMain.originallanguageTip": "Фільтрувати вміст за мовою оригіналу",
"components.Settings.SettingsMain.cacheImagesTip": "Кешувати зображення із зовнішніх джерел (потрібний значний об'єм дискового простору)",
"components.Settings.SettingsMain.trustProxyTip": "Дозволити Overseerr правильно реєструвати IP-адреси клієнтів за проксі-сервером",
"components.Settings.SettingsMain.generalsettings": "Загальні налаштування",
"components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL-адреса не має закінчуватися скісною рискою",
"components.Settings.SettingsMain.apikey": "Ключ API",
"components.Settings.SettingsMain.generalsettingsDescription": "Налаштуйте глобальні параметри і параметри за замовчуванням для Overseerr.",
"components.Settings.SettingsMain.toastApiKeySuccess": "Новий ключ API успішно згенеровано!",
"components.Settings.SettingsMain.cacheImages": "Увімкнути кешування зображень",
"components.Settings.SettingsMain.applicationurl": "URL програми",
"components.Settings.SettingsMain.general": "Загальні",
"components.Settings.SettingsMain.csrfProtectionHoverTip": "НЕ вмикайте цей параметр, якщо ви не розумієте, що робите!",
"components.Settings.SettingsMain.partialRequestsEnabled": "Дозволити запитувати серіали частково",
"components.Settings.SettingsMain.toastSettingsFailure": "Під час збереження налаштувань сталася помилка.",
"components.Settings.SettingsMain.validationApplicationUrl": "Ви повинні вказати дійсну URL-адресу",
"components.Settings.SettingsMain.validationApplicationTitle": "Ви повинні вказати назву програми",
"components.Settings.SettingsAbout.supportjellyseerr": "Підтримайте Jellyseerr",
"components.Settings.SettingsMain.csrfProtectionTip": "Встановіть доступ до зовнішнього API лише для читання (потрібний HTTPS)",
"components.Discover.DiscoverTvKeyword.keywordSeries": "{keywordTitle} Серіали",
"components.Discover.CreateSlider.editsuccess": "Відредаговано повзунок і збережено налаштування Discover.",
"components.Discover.CreateSlider.slidernameplaceholder": "Назва повзунка",
"components.Settings.internalUrl": "Внутрішня URL-адреса",
"components.Settings.SettingsJobsCache.availability-sync": "Синхронізація доступності медіа",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "Кожну {jobScheduleSeconds, plural, one {секунду} other {{jobScheduleSeconds} секунд}}",
"components.Settings.SettingsMain.apikey": "Ключ API",
"components.Settings.SettingsMain.toastApiKeyFailure": "Під час створення нового ключа API сталася помилка.",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Пристрій за замовчуванням",
"components.UserList.noJellyfinuserstoimport": "Немає користувачів {mediaServerName} для імпорту.",
"components.UserList.importfromJellyfinerror": "Під час імпорту користувачів з {mediaServerName} сталася помилка.",
"components.Settings.SettingsMain.cacheImagesTip": "Кешувати зображення із зовнішніх джерел (потрібний значний об'єм дискового простору)",
"components.Settings.SettingsMain.validationApplicationTitle": "Ви повинні вказати назву програми",
"components.Settings.SonarrModal.seriesType": "Тип серіалу",
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "Користувач {mediaServerName}",
"components.TitleCard.watchlistError": "Щось пішло не так, повторіть спробу.",
"components.Settings.SettingsMain.generalsettingsDescription": "Налаштуйте глобальні параметри та параметри за замовчуванням для Jellyseerr.",
"components.Settings.SettingsMain.originallanguageTip": "Фільтрувати вміст за мовою оригіналу",
"components.Settings.SettingsMain.trustProxy": "Увімкнути підтримку проксі",
"components.Settings.jellyfinSettingsFailure": "Під час збереження налаштувань {mediaServerName} сталася помилка.",
"components.UserProfile.UserSettings.UserGeneralSettings.save": "Зберегти зміни",
"components.TvDetails.play4k": "Відтворити 4K в {mediaServerName}",
"components.Discover.CreateSlider.providetmdbsearch": "Введіть пошуковий запит",
"components.Discover.FilterSlideover.streamingservices": "Сервіси потокового передавання",
"components.Discover.moviegenres": "Жанри фільмів",
"components.MovieDetails.play": "Відтворити в {mediaServerName}",
"components.MovieDetails.play4k": "Відтворити в {mediaServerName} у 4К",
"components.Selector.showless": "Згорнути",
"components.Discover.CreateSlider.addSlider": "Додати повзунок",
"components.Discover.CreateSlider.addcustomslider": "Створити власний повзунок",
"components.Discover.CreateSlider.addfail": "Не вдалося створити новий повзунок.",
"components.Discover.CreateSlider.needresults": "Ви повинні мати принаймні 1 результат.",
"components.Discover.DiscoverSliderEdit.deletefail": "Не вдалося видалити повзунок.",
"components.Discover.DiscoverSliderEdit.deletesuccess": "Повзунок успішно видалено.",
"components.Discover.CreateSlider.addsuccess": "Створено новий повзунок і збережено параметри налаштування Discover.",
"components.Discover.CreateSlider.editSlider": "Редагувати повзунок",
"components.Discover.CreateSlider.editfail": "Не вдалося відредагувати повзунок.",
"components.Discover.CreateSlider.addsuccess": "Створено новий повзунок і збережено параметри налаштування Discover.",
"components.Discover.PlexWatchlistSlider.emptywatchlist": "Медіа додано до вашого <PlexWatchlistSupportLink>списку перегляду Plex</PlexWatchlistSupportLink>.",
"components.Settings.Notifications.NotificationsPushover.sound": "Звук сповіщення",
"components.Discover.customizediscover": "Налаштувати Discover",
"components.Discover.createnewslider": "Створити новий повзунок",
"components.Discover.FilterSlideover.firstAirDate": "Дата виходу в ефір",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "Пристрій за замовчуванням",
"components.Settings.SonarrModal.tagRequests": "Теги запитів",
"components.Settings.SonarrModal.tagRequestsInfo": "Автоматично додавати додатковий тег з ID та іменем користувача, який запитує",
"components.Settings.SonarrModal.animeSeriesType": "Тип аніме-серіалу",
"components.Settings.SonarrModal.seriesType": "Тип серіалу",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "Пристрій за замовчуванням",
"i18n.collection": "Колекція",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "Звук сповіщення",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Популярність за спаданням",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Дата випуску за спаданням",
"components.Discover.CreateSlider.providetmdbnetwork": "Введіть TMDB ID мережі",
"components.Discover.DiscoverMovies.sortPopularityAsc": "Популярність за зростанням",
"components.Discover.CreateSlider.validationDatarequired": "Ви повинні надати доступний для пошуку вміст.",
"components.Discover.CreateSlider.providetmdbstudio": "Введіть TMDB ID студії",
"components.Discover.DiscoverMovies.sortTitleDesc": "Назва (Я-А) за спаданням",
"components.Discover.CreateSlider.starttyping": "Початок введення для пошуку.",
"components.Discover.CreateSlider.providetmdbkeywordid": "Введіть TMDB ID ключового слова",
"components.Discover.CreateSlider.validationTitlerequired": "Ви повинні вказати назву.",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Дата випуску за зростанням",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
"components.Discover.DiscoverMovies.sortTitleAsc": "Назва (А-Я) за зростанням",
"components.Discover.CreateSlider.editsuccess": "Відредаговано повзунок і збережено параметри налаштування Discover.",
"components.Discover.CreateSlider.providetmdbgenreid": "Введіть TMDB ID жанру",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
"components.Discover.CreateSlider.providetmdbkeywordid": "Введіть TMDB ID ключового слова",
"components.Discover.CreateSlider.providetmdbnetwork": "Введіть TMDB ID мережі",
"components.Discover.CreateSlider.providetmdbstudio": "Введіть TMDB ID студії",
"components.Discover.CreateSlider.slidernameplaceholder": "Назва повзунка",
"components.Discover.CreateSlider.validationDatarequired": "Ви повинні надати доступний для пошуку вміст.",
"components.Discover.DiscoverMovies.sortPopularityAsc": "Популярність за зростанням",
"components.Discover.DiscoverMovies.sortPopularityDesc": "Популярність за спаданням",
"components.Discover.DiscoverMovies.sortReleaseDateAsc": "Дата випуску за зростанням",
"components.Discover.DiscoverMovies.sortReleaseDateDesc": "Дата випуску за спаданням",
"components.Discover.DiscoverMovies.sortTitleAsc": "Назва (А-Я) за зростанням",
"components.Discover.DiscoverMovies.sortTitleDesc": "Назва (Я-А) за спаданням",
"components.Discover.DiscoverMovies.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
"components.Discover.DiscoverMovies.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
"components.Discover.DiscoverTv.sortFirstAirDateAsc": "Дата виходу в ефір за зростанням",
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
"components.Discover.DiscoverTv.sortPopularityAsc": "Популярність за зростанням",
"components.Discover.DiscoverTv.sortTitleAsc": "Назва (А-Я) за зростанням",
"components.Discover.DiscoverTv.sortFirstAirDateDesc": "Дата виходу в ефір за спаданням",
"components.Discover.DiscoverSliderEdit.deletefail": "Не вдалося видалити повзунок.",
"components.Discover.DiscoverSliderEdit.enable": "Перемкнути видимість",
"components.Discover.DiscoverSliderEdit.deletesuccess": "Повзунок успішно видалено.",
"components.Discover.DiscoverTv.sortTitleDesc": "Назва (Я-А) за спаданням"
"components.Discover.DiscoverTv.sortPopularityAsc": "Популярність за зростанням",
"components.Discover.DiscoverTv.sortPopularityDesc": "Популярність за спаданням",
"components.Discover.DiscoverTv.sortTitleAsc": "Назва (А-Я) за зростанням",
"components.Discover.DiscoverTv.sortTitleDesc": "Назва (Я-А) за спаданням",
"components.Discover.DiscoverTv.sortTmdbRatingAsc": "Рейтинг TMDB за зростанням",
"components.Discover.DiscoverTv.sortTmdbRatingDesc": "Рейтинг TMDB за спаданням",
"components.Discover.FilterSlideover.firstAirDate": "Дата виходу в ефір",
"components.Discover.createnewslider": "Створити новий повзунок",
"components.Discover.customizediscover": "Налаштувати Discover",
"components.Discover.resetfailed": "Щось пішло не так під час скидання налаштувань Discover.",
"components.Discover.resetsuccess": "Успішно скинуто параметри налаштування.",
"components.Discover.resetwarning": "Скинути всі повзунки до стандартних. Це також видалить будь-які спеціальні повзунки!",
"components.Discover.stopediting": "Зупинити редагування",
"components.Discover.updatefailed": "Під час оновлення налаштувань Discover сталася помилка.",
"components.Discover.updatesuccess": "Оновлено параметри налаштування Discover.",
"components.Login.credentialerror": "Ім'я користувача або пароль неправильні.",
"components.Login.description": "Оскільки ви вперше входите в {applicationName}, вам потрібно додати дійсну адресу електронної пошти.",
"components.Login.validationEmailFormat": "Невірний email",
"components.Login.validationEmailRequired": "Ви повинні вказати адресу електронної пошти",
"components.Login.validationemailformat": "Потрібен дійсний email",
"components.Layout.UserWarnings.emailRequired": "Потрібно вказати адресу електронної пошти.",
"components.Login.emailtooltip": "Адресу не потрібно пов’язувати з вашим {mediaServerName} сервером.",
"components.Login.validationhostrequired": "Необхідна URL-адреса {mediaServerName}",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* Це безповоротно видалить цей {mediaType} з {arr}, включаючи всі файли.",
"components.Selector.showmore": "Показати більше",
"components.Settings.RadarrModal.tagRequests": "Теги запитів",
"components.Settings.SonarrModal.tagRequests": "Теги запитів",
"components.Setup.configuremediaserver": "Налаштуйте медіасервер",
"components.Settings.jellyfinsettingsDescription": "Налаштуйте свій {mediaServerName} сервер. {mediaServerName} відсканує бібліотеки, щоб побачити, які бібліотеки доступні.",
"components.Settings.manualscanJellyfin": "Сканувати бібліотеки вручну",
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
"components.Settings.jellyfinlibrariesDescription": "Бібліотеки {mediaServerName} перевіряються на наявність заголовків. Натисніть нижче, якщо в списку не вистачає бібліотек.",
"components.Settings.saving": "Збереження…",
"components.Settings.syncJellyfin": "Синхронізувати бібліотеки",
"components.Settings.syncing": "Синхронізація",
"components.Setup.signin": "Увійти",
"components.Setup.signinWithJellyfin": "Використовуйте свій {mediaServerName} обліковий запис",
"components.TitleCard.addToWatchList": "Додати в список перегляду",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong> успішно додано до списку перегляду!",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} успішно імпортовано!",
"components.UserList.importfromJellyfin": "Додати користувачів з {mediaServerName}",
"components.Settings.manualscanDescriptionJellyfin": "Зазвичай це запускається лише раз на 24 години. Jellyseerr перевірятиме нещодавно доданий сервер {mediaServerName} більш агресивно. Якщо ви вперше налаштовуєте Jellyseerr, рекомендується одноразове повне сканування бібліотеки вручну!",
"components.Settings.save": "Зберегти зміни",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong> Успішно видалено зі списку перегляду!",
"components.UserList.newJellyfinsigninenabled": "Параметр <strong>Увімкнути новий вхід на {mediaServerName}</strong> наразі ввімкнено. Користувачам {mediaServerName} із доступом до бібліотеки не потрібно імпортувати, щоб увійти.",
"components.UserProfile.localWatchlist": "Список перегляду {username}",
"components.Settings.jellyfinSettingsDescription": "Додатково налаштуйте внутрішні та зовнішні кінцеві точки для вашого сервера {mediaServerName}. У більшості випадків зовнішня URL-адреса відрізняється від внутрішньої URL-адреси. Для входу в систему {mediaServerName} також можна встановити спеціальну URL-адресу скидання пароля, якщо ви хочете переспрямувати на іншу сторінку скидання пароля.",
"components.Settings.SonarrModal.tagRequestsInfo": "Автоматично додавати додатковий тег з ID та іменем користувача, який запитує"
}

View File

@@ -397,7 +397,7 @@
"components.UserProfile.UserSettings.UserPasswordChange.password": "密码设置",
"components.UserProfile.UserSettings.UserPasswordChange.nopermissionDescription": "你无权设置此用户的密码。",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSetOwnAccount": "你的帐户目前没有设置密码。在下方配置密码,使你能够作为“本地用户”登录。",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "此用户帐户目前没有设置密码。在下方配置密码,使该帐户能够作为“本地用户”登录。",
"components.UserProfile.UserSettings.UserPasswordChange.noPasswordSet": "此用户帐户目前没有设置密码。配置下面的密码以使此帐户能够作为“本地用户”登录。",
"components.UserProfile.UserSettings.UserPasswordChange.newpassword": "新密码",
"components.UserProfile.UserSettings.UserPasswordChange.currentpassword": "当前的密码",
"components.UserProfile.UserSettings.UserPasswordChange.confirmpassword": "确认密码",
@@ -766,14 +766,14 @@
"components.RequestButton.viewrequest": "查看请求",
"components.RequestButton.requestmore4k": "再提交 4K 请求",
"components.RequestButton.requestmore": "提交更多季数的请求",
"components.RequestButton.declinerequests": "拒绝{requestCount, plural, one {请求} other {{requestCount} 个请求}}",
"components.RequestButton.declinerequests": "拒绝{requestCount, plural, one {Request} other {{requestCount} Requests}}",
"components.RequestButton.declinerequest4k": "拒绝 4K 请求",
"components.RequestButton.declinerequest": "拒绝请求",
"components.RequestButton.decline4krequests": "拒绝{requestCount, plural, one { 4K 请求} other { {requestCount} 4K 请求}}",
"components.RequestButton.approverequests": "批准{requestCount, plural, one {请求} other {{requestCount} 个请求}}",
"components.RequestButton.decline4krequests": "拒绝 {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
"components.RequestButton.approverequests": "批准 {requestCount, plural, one {Request} other {{requestCount} Requests}}",
"components.RequestButton.approverequest4k": "批准 4K 请求",
"components.RequestButton.approverequest": "批准请求",
"components.RequestButton.approve4krequests": "批准{requestCount, plural, one { 4K 请求} other { {requestCount} 4K 请求}}",
"components.RequestButton.approve4krequests": "批准 {requestCount, plural, one {4K Request} other {{requestCount} 4K Requests}}",
"components.RequestBlock.server": "目標服务器",
"components.RequestBlock.seasons": "季数",
"components.RequestBlock.rootfolder": "根目录",
@@ -782,10 +782,10 @@
"components.RegionSelector.regionServerDefault": "默认设置({region}",
"components.RegionSelector.regionDefault": "所有地区",
"components.QuotaSelector.unlimited": "无限",
"components.QuotaSelector.tvRequests": "<quotaUnits>每 {quotaDays} {days} </quotaUnits>{quotaLimit}<quotaUnits> {seasons}</quotaUnits>",
"components.QuotaSelector.tvRequests": "{quotaLimit} <quotaUnits>{seasons} 每 {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.seasons": "季",
"components.QuotaSelector.movies": "部电影",
"components.QuotaSelector.movieRequests": "<quotaUnits>每 {quotaDays} {days} </quotaUnits>{quotaLimit}<quotaUnits> {movies}</quotaUnits>",
"components.QuotaSelector.movieRequests": "{quotaLimit} <quotaUnits>{movies} 每 {quotaDays} {days}</quotaUnits>",
"components.QuotaSelector.days": "天",
"components.PlexLoginButton.signinwithplex": "登入",
"components.PlexLoginButton.signingin": "登入中…",
@@ -900,7 +900,7 @@
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestFailed": "Gotify 测试通知发送失败。",
"components.Settings.Notifications.NotificationsGotify.toastGotifyTestSending": "Gotify测试通知发送中…",
"components.Settings.Notifications.enableMentions": "允许提及",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "每 {jobScheduleMinutes} 分钟",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorMinutes": "每 {jobScheduleMinutes, plural, one {minute} other {{jobScheduleMinutes} minutes}}",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoverApplicationToken": "应用 API 令牌",
"components.UserList.newplexsigninenabled": "<strong>允许新的 Plex 用户登录</strong> 设置目前已启用。还没有导入的Plex用户也能登录。",
"components.UserProfile.UserSettings.UserNotificationSettings.pushoversettingsfailed": "Pushover 通知设置保存失败。",
@@ -909,7 +909,7 @@
"components.Settings.RadarrModal.inCinemas": "已上映",
"components.UserProfile.UserSettings.UserNotificationSettings.pushbulletAccessTokenTip": "从您的<PushbulletSettingsLink>账号设置</PushbulletSettingsLink>获取API令牌",
"components.Settings.SettingsAbout.appDataPath": "数据目录",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "每 {jobScheduleHours} 小时",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorHours": "每 {jobScheduleHours, plural, one {hour} other {{jobScheduleHours} hours}}",
"components.Settings.tautulliSettings": "Tautulli 设置",
"components.Settings.tautulliSettingsDescription": "关于 Tautulli 服务器的设置。Jellyseerr 会从 Tautulli 获取 Plex 媒体的观看历史记录。",
"components.UserProfile.UserSettings.UserGeneralSettings.discordId": "Discord 用户ID",
@@ -1063,8 +1063,8 @@
"components.Settings.restartrequiredTooltip": "必须重新启动 Jellyseerr 才能使更改的设置生效",
"components.TvDetails.manageseries": "管理电视节目",
"components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "自动请求您的 <PlexWatchlistSupportLink>Plex 关注列表</PlexWatchlistSupportLink>的媒体",
"components.AirDateBadge.airedrelative": "播出{relativeTime}",
"components.AirDateBadge.airsrelative": "播出{relativeTime}",
"components.AirDateBadge.airedrelative": "{relativeTime}播出",
"components.AirDateBadge.airsrelative": "{relativeTime}播出",
"components.Layout.UserDropdown.MiniQuotaDisplay.movierequests": "电影请求",
"components.Layout.UserDropdown.MiniQuotaDisplay.seriesrequests": "电视节目请求",
"components.NotificationTypeSelector.mediaautorequestedDescription": "当 Plex 关注列表中的项目自动提交新媒体请求时,会收到通知。",
@@ -1203,7 +1203,7 @@
"components.Discover.PlexWatchlistSlider.emptywatchlist": "您的 <PlexWatchlistSupportLink>Plex 关注列表</PlexWatchlistSupportLink>中的媒体会显示在这里。",
"components.Selector.starttyping": "开始打字以进行搜索。",
"components.Discover.CreateSlider.starttyping": "开始打字以进行搜索。",
"components.Discover.CreateSlider.needresults": "需要至少有 1 个结果。",
"components.Discover.CreateSlider.needresults": "需要至少有 1 个结果。",
"components.Selector.showless": "显示更少",
"components.Discover.resetfailed": "重置探索媒体设置时出了点问题。",
"components.Settings.SettingsMain.validationApplicationTitle": "你必须提供一个应用程序标题",
@@ -1253,7 +1253,7 @@
"components.Settings.SettingsJobsCache.availability-sync": "同步媒体可用性",
"components.Discover.tmdbmoviestreamingservices": "TMDB 电影流媒体服务",
"components.Discover.tmdbtvstreamingservices": "TMDB 电视流媒体服务",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "每 {jobScheduleSeconds} 秒",
"components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "每 {jobScheduleSeconds, plural, one {second} other {{jobScheduleSeconds} seconds}}",
"components.Discover.FilterSlideover.voteCount": "在 {minValue} 和 {maxValue} 之间的评分数",
"components.Settings.RadarrModal.tagRequests": "标签请求",
"components.Settings.RadarrModal.tagRequestsInfo": "自动添加带有请求者的用户 ID 和显示名称的附加标签",
@@ -1261,11 +1261,83 @@
"i18n.collection": "合集",
"components.Discover.FilterSlideover.tmdbuservotecount": "TMDB 用户评分数",
"components.Settings.SonarrModal.tagRequestsInfo": "自动添加带有请求者的用户 ID 和显示名称的附加标签",
"components.MovieDetails.imdbuserscore": "IMDB 用户评分",
"components.Settings.Notifications.NotificationsPushover.sound": "通知提示音",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "默认设备",
"components.Settings.SonarrModal.animeSeriesType": "动漫剧集类型",
"components.Settings.SonarrModal.seriesType": "剧集类型",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "通知提示音",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "默认设备"
"components.Layout.UserWarnings.passwordRequired": "需要输入密码。",
"components.Login.emailtooltip": "地址不需要与{mediaServerName}实例相关联。",
"components.Login.host": "{mediaServerName} 的 URL",
"components.Login.initialsignin": "连接",
"components.Login.initialsigningin": "连接中……",
"components.Login.save": "添加",
"components.Login.saving": "添加中……",
"components.Login.signinwithjellyfin": "使用您的{mediaServerName}帐户",
"components.Login.title": "添加邮件",
"components.Login.username": "用户名",
"components.Login.validationEmailFormat": "无效的邮件地址",
"components.Login.validationEmailRequired": "你必须提供一个电子邮件",
"components.Login.validationemailformat": "需要有效的电子邮件",
"components.Login.validationhostformat": "需要有效的URL",
"components.Login.validationusernamerequired": "需要用户名",
"components.ManageSlideOver.manageModalRemoveMediaWarning": "* 这将不可逆地从{arr}中删除{mediaType},包括所有文件。",
"components.ManageSlideOver.removearr4k": "移除4K {arr}",
"components.MovieDetails.downloadstatus": "下载状态",
"components.MovieDetails.imdbuserscore": "IMDB用户评分",
"components.MovieDetails.openradarr": "在Radarr中打开电影",
"components.MovieDetails.play": "播放{mediaServerName}",
"components.MovieDetails.play4k": "播放 4K {mediaServerName}",
"components.Settings.Notifications.NotificationsPushover.sound": "通知声音",
"components.Settings.SettingsJobsCache.jellyfin-full-scan": "Jellyfin全库扫描",
"components.Settings.SonarrModal.seriesType": "系列类型",
"components.Settings.jellyfinSettingsFailure": "保存{mediaServerName}设置时出错。",
"components.Settings.jellyfinSettingsSuccess": "{mediaServerName}设置保存成功!",
"components.Settings.jellyfinlibraries": "{mediaServerName}库",
"components.Settings.jellyfinlibrariesDescription": "库{mediaServerName}用于扫描标题。如果没有列出库,请单击下面的按钮。",
"components.Settings.jellyfinsettings": "{mediaServerName}设置",
"components.Settings.manualscanJellyfin": "手动扫描库",
"components.Settings.menuJellyfinSettings": "{mediaServerName}",
"components.Settings.saving": "保存中……",
"components.Settings.syncJellyfin": "同步库",
"components.Settings.syncing": "同步中",
"components.Settings.timeout": "超时",
"components.Setup.signin": "登录",
"components.Setup.signinWithJellyfin": "使用您的{mediaServerName}帐户",
"components.TitleCard.addToWatchList": "添加到监视列表",
"components.TitleCard.watchlistDeleted": "<strong>{title}</strong>从监视列表中删除成功!",
"components.TitleCard.watchlistError": "出了问题,再试一次。",
"components.TvDetails.play": "在 {mediaServerName} 播放",
"components.TvDetails.play4k": "mediaServerName} 播放 4K",
"components.UserList.importfrommediaserver": "导入{mediaServerName}用户",
"components.UserList.mediaServerUser": "{mediaServerName} 用户",
"components.UserList.noJellyfinuserstoimport": "在{mediaServerName}中没有用户要导入。",
"components.UserList.newJellyfinsigninenabled": "<strong>启用 {mediaServerName} 登录</strong> 设置当前已启用. {mediaServerName} 具有库访问权限的用户不需要导入即可登录。",
"components.UserProfile.UserSettings.UserGeneralSettings.mediaServerUser": "{mediaServerName} 用户",
"components.UserProfile.UserSettings.UserNotificationSettings.deviceDefault": "设备默认",
"components.Layout.UserWarnings.emailInvalid": "邮件地址无效。",
"components.Layout.UserWarnings.emailRequired": "需要填写电子邮件地址。",
"components.Login.credentialerror": "用户名或密码错误。",
"components.Login.description": "由于这是您第一次登录{applicationName},您需要添加一个有效的电子邮件地址。",
"components.Login.validationhostrequired": "{mediaServerName} URL是必需的",
"components.ManageSlideOver.removearr": "从{arr}中删除",
"components.MovieDetails.openradarr4k": "在 4K Radarr 中打开电影",
"components.Settings.Notifications.NotificationsPushover.deviceDefault": "设备默认",
"components.Settings.Notifications.userEmailRequired": "获取用户邮箱",
"components.Settings.SettingsAbout.supportjellyseerr": "支持Jellyseerr",
"components.Settings.SettingsJobsCache.jellyfin-recently-added-scan": "Jellyfin最近新增扫描",
"components.Settings.SonarrModal.animeSeriesType": "动漫系列",
"components.Settings.internalUrl": "内部URL",
"components.Settings.jellyfinSettings": "{mediaServerName}设置",
"components.Settings.jellyfinSettingsDescription": "可以为您的{mediaServerName}服务器配置内部和外部端点。在大多数情况下外部URL与内部URL不同。如果你想重定向到不同的密码重置页面也可以为{mediaServerName}登录设置自定义密码重置URL。",
"components.Settings.jellyfinsettingsDescription": "配置{mediaServerName}服务器的设置。{mediaServerName}扫描{mediaServerName}库以查看可用的内容。",
"components.Settings.manualscanDescriptionJellyfin": "正常情况下每24小时只会运行一次。Jellyseerr将更积极地检查您的{mediaServerName}服务器最近添加的内容。如果这是您第一次配置Jellyseerr建议您手动进行一次完整的库扫描!",
"components.Settings.save": "保存更改",
"components.Setup.configuremediaserver": "配置媒体服务器",
"components.Setup.signinWithPlex": "使用您的 Plex 帐户",
"components.TitleCard.watchlistCancel": "<strong>{title}</strong>的监视列表已取消。",
"components.TitleCard.watchlistSuccess": "<strong>{title}</strong>添加到监视列表成功!",
"components.UserList.importfromJellyfin": "导入{mediaServerName}用户",
"components.UserProfile.UserSettings.UserGeneralSettings.email": "电子邮件",
"components.UserProfile.UserSettings.UserGeneralSettings.save": "保存更改",
"components.UserList.importfromJellyfinerror": "导入{mediaServerName}用户时出错。",
"components.UserProfile.UserSettings.UserNotificationSettings.sound": "通知声音",
"components.UserProfile.UserSettings.UserGeneralSettings.saving": "保存中……",
"components.UserProfile.localWatchlist": "{username}的监视列表",
"components.UserList.importedfromJellyfin": "<strong>{userCount}</strong> {mediaServerName} {userCount, plural, one {user} other {users}} 导入成功!"
}

View File

@@ -8,7 +8,7 @@ const JellyfinSettingsPage: NextPage = () => {
useRouteGuard(Permission.MANAGE_SETTINGS);
return (
<SettingsLayout>
<SettingsJellyfin showAdvancedSettings={true} />
<SettingsJellyfin />
</SettingsLayout>
);
};