Compare commits

...

15 Commits

Author SHA1 Message Date
semantic-release-bot
17df5dd072 chore(release): 1.4.0 2020-12-15 00:53:05 +00:00
sct
4b48a36ad3 Merge branch 'develop' 2020-12-15 00:48:28 +00:00
allcontributors[bot]
2d3359a7e3 docs: add darknessgp as a contributor (#279) [skip ci]
* docs: update README.md [skip ci]

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

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2020-12-15 09:15:18 +09:00
darknessgp
6d08b10820 fix: changing parameter name to use correct 'port' #276 (#277)
Co-authored-by: Ryan Boyles <Ryan.Boyles@ahstech.com>
2020-12-15 09:14:11 +09:00
sct
78af1a3e6d fix(services): include radarr/sonarr baseUrl when adding media 2020-12-14 16:39:01 +00:00
semantic-release-bot
16bd3e9fd5 chore(release): 1.3.2 2020-12-14 13:11:15 +00:00
sct
6360c82898 Merge branch 'develop' 2020-12-14 13:06:22 +00:00
allcontributors[bot]
67a8f7fbfe docs: add jvennik as a contributor (#253) [skip ci]
* docs: update README.md [skip ci]

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

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2020-12-14 19:08:45 +09:00
Weblate (bot)
e17c637483 feat(lang): Translations update from Weblate (#240)
* feat(lang): translated using Weblate (German)

Currently translated at 100.0% (306 of 306 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: K. Herbert <herbert.ka@mailo.com>
Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/de/
Translation: Overseerr/Overseerr Frontend

* feat(lang): translated using Weblate (Dutch)

Currently translated at 100.0% (310 of 310 strings)

feat(lang): translated using Weblate (Dutch)

Currently translated at 100.0% (306 of 306 strings)

feat(lang): translated using Weblate (Dutch)

Currently translated at 88.8% (272 of 306 strings)

feat(lang): translated using Weblate (Dutch)

Currently translated at 72.5% (222 of 306 strings)

feat(lang): translated using Weblate (Dutch)

Currently translated at 69.9% (214 of 306 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jos Vennik <josvennik@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/nl/
Translation: Overseerr/Overseerr Frontend

* feat(lang): translated using Weblate (French)

Currently translated at 100.0% (306 of 306 strings)

feat(lang): translated using Weblate (French)

Currently translated at 100.0% (306 of 306 strings)

feat(lang): translated using Weblate (French)

Currently translated at 100.0% (306 of 306 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: K. Herbert <herbert.ka@mailo.com>
Co-authored-by: NGVICIOUS <giyomu1@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/overseerr/overseerr-frontend/fr/
Translation: Overseerr/Overseerr Frontend

Co-authored-by: K. Herbert <herbert.ka@mailo.com>
Co-authored-by: Jos Vennik <josvennik@gmail.com>
Co-authored-by: NGVICIOUS <giyomu1@gmail.com>
2020-12-14 19:07:46 +09:00
sct
15013d6c5d fix(frontend): encode special characters in search input to prevent crashing router
re #252
2020-12-14 09:38:38 +00:00
sct
8cb05c413a fix(frontend): convert plex port to a number before posting to the api 2020-12-14 09:13:59 +00:00
sct
2098a2d3d2 fix(frontend): converts email smtp port to a number before posting to the api
- also adds toast notifications to both email/discord notifications pages to know when sucesses or
failures occur

re #251
2020-12-14 09:00:10 +00:00
sct
6c1ee830a1 fix(services): improve logging for adding movies to Radarr 2020-12-14 08:17:38 +00:00
sct
0658b7943e fix(services): radarr/sonarr will use the correct default server 2020-12-14 08:14:08 +00:00
sct
edbbccf3ae fix(plex sync): catch errors that occur during processMovie
this also removes the unique constraint on imdbId

re #244 #246 #250
2020-12-14 08:01:33 +00:00
18 changed files with 469 additions and 314 deletions

View File

@@ -70,6 +70,24 @@
"contributions": [
"doc"
]
},
{
"login": "jvennik",
"name": "jvennik",
"avatar_url": "https://avatars3.githubusercontent.com/u/6672637?v=4",
"profile": "https://github.com/jvennik",
"contributions": [
"translation"
]
},
{
"login": "darknessgp",
"name": "darknessgp",
"avatar_url": "https://avatars0.githubusercontent.com/u/1521243?v=4",
"profile": "https://github.com/darknessgp",
"contributions": [
"code"
]
}
],
"badgeTemplate": "<a href=\"#contributors-\"><img alt=\"All Contributors\" src=\"https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg\"/></a>",

View File

@@ -1,3 +1,28 @@
# [1.4.0](https://github.com/sct/overseerr/compare/v1.3.2...v1.4.0) (2020-12-15)
### Bug Fixes
* changing parameter name to use correct 'port' [#276](https://github.com/sct/overseerr/issues/276) ([#277](https://github.com/sct/overseerr/issues/277)) ([6d08b10](https://github.com/sct/overseerr/commit/6d08b108200177ca3068c852e60a0df75ce2232a))
* **services:** include radarr/sonarr baseUrl when adding media ([78af1a3](https://github.com/sct/overseerr/commit/78af1a3e6d00a5645a05e7bf3cf56a59439b6cc9))
### Features
* **lang:** Translations update from Weblate ([#240](https://github.com/sct/overseerr/issues/240)) ([e17c637](https://github.com/sct/overseerr/commit/e17c63748362b6a480693e003ef5eec614dcec43))
## [1.3.2](https://github.com/sct/overseerr/compare/v1.3.1...v1.3.2) (2020-12-14)
### Bug Fixes
* **frontend:** convert plex port to a number before posting to the api ([8cb05c4](https://github.com/sct/overseerr/commit/8cb05c413a15a4b74e37ece5e24367d115995b32))
* **frontend:** converts email smtp port to a number before posting to the api ([2098a2d](https://github.com/sct/overseerr/commit/2098a2d3d2981fd2ae54392aec3ef81327f2858e)), closes [#251](https://github.com/sct/overseerr/issues/251)
* **frontend:** encode special characters in search input to prevent crashing router ([15013d6](https://github.com/sct/overseerr/commit/15013d6c5dbff15704c7c30d261d68a265e7f2d7)), closes [#252](https://github.com/sct/overseerr/issues/252)
* **plex sync:** catch errors that occur during processMovie ([edbbccf](https://github.com/sct/overseerr/commit/edbbccf3ae623430294f1a5c3fd2728dbd42e555)), closes [#244](https://github.com/sct/overseerr/issues/244) [#246](https://github.com/sct/overseerr/issues/246) [#250](https://github.com/sct/overseerr/issues/250)
* **services:** improve logging for adding movies to Radarr ([6c1ee83](https://github.com/sct/overseerr/commit/6c1ee830a183f89bb1fe96a181a7d61684e23b22))
* **services:** radarr/sonarr will use the correct default server ([0658b79](https://github.com/sct/overseerr/commit/0658b7943e1ab25816db9da34d4c9ea808d9203d))
## [1.3.1](https://github.com/sct/overseerr/compare/v1.3.0...v1.3.1) (2020-12-14)

View File

@@ -16,7 +16,7 @@
<a href="https://lgtm.com/projects/g/sct/overseerr/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/sct/overseerr.svg?logo=lgtm&logoWidth=18"/></a>
<img alt="GitHub" src="https://img.shields.io/github/license/sct/overseerr">
<!-- 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-7-orange.svg"/></a>
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-9-orange.svg"/></a>
<!-- ALL-CONTRIBUTORS-BADGE:END -->
</p>
@@ -101,11 +101,14 @@ Our [Code of Conduct](https://github.com/sct/overseerr/blob/develop/CODE_OF_COND
<td align="center"><a href="https://github.com/GiyomuWeb"><img src="https://avatars0.githubusercontent.com/u/62489209?v=4" width="100px;" alt=""/><br /><sub><b>GiyomuWeb</b></sub></a><br /><a href="#translation-GiyomuWeb" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/angrycuban13"><img src="https://avatars3.githubusercontent.com/u/39564898?v=4" width="100px;" alt=""/><br /><sub><b>Angry Cuban</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=angrycuban13" title="Documentation">📖</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/jvennik"><img src="https://avatars3.githubusercontent.com/u/6672637?v=4" width="100px;" alt=""/><br /><sub><b>jvennik</b></sub></a><br /><a href="#translation-jvennik" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/darknessgp"><img src="https://avatars0.githubusercontent.com/u/1521243?v=4" width="100px;" alt=""/><br /><sub><b>darknessgp</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=darknessgp" title="Code">💻</a></td>
</tr>
</table>
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
## Contributing

View File

@@ -1,6 +1,6 @@
{
"name": "overseerr",
"version": "1.3.1",
"version": "1.4.0",
"private": true,
"scripts": {
"dev": "nodemon -e ts --watch server --watch overseerr-api.yml -e .json,.ts,.yml -x ts-node --files --project server/tsconfig.json server/index.ts",
@@ -11,6 +11,7 @@
"start": "NODE_ENV=production node dist/index.js",
"i18n:extract": "extract-messages -l=en -o src/i18n/locale -d en --flat true --overwriteDefault false './src/**/!(*.test).{ts,tsx}'",
"migration:generate": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:generate",
"migration:create": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:create",
"migration:run": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:run",
"format": "prettier --write ."
},

View File

@@ -61,7 +61,7 @@ class PlexAPI {
this.plexClient = new NodePlexAPI({
hostname: settings.plex.ip,
post: settings.plex.port,
port: settings.plex.port,
token: plexToken,
authenticator: {
authenticate: (

View File

@@ -1,4 +1,5 @@
import Axios, { AxiosInstance } from 'axios';
import logger from '../logger';
interface RadarrMovieOptions {
title: string;
@@ -96,6 +97,11 @@ class RadarrAPI {
return response.data;
} catch (e) {
logger.error('Something went wrong adding a movie to Radarr', {
label: 'Radarr',
message: e.message,
options,
});
throw new Error(`[Radarr] Failed to add movie: ${e.message}`);
}
};

View File

@@ -234,13 +234,24 @@ export class MediaRequest {
return;
}
const radarrSettings = settings.radarr.find(
(radarr) => radarr.isDefault && !radarr.is4k
);
if (!radarrSettings) {
logger.info(
'There is no default radarr configured. Did you set any of your Radarr servers as default?',
{ label: 'Media Request' }
);
return;
}
const tmdb = new TheMovieDb();
const radarrSettings = settings.radarr[0];
const radarr = new RadarrAPI({
apiKey: radarrSettings.apiKey,
url: `${radarrSettings.useSsl ? 'https' : 'http'}://${
radarrSettings.hostname
}:${radarrSettings.port}/api`,
}:${radarrSettings.port}${radarrSettings.baseUrl ?? ''}/api`,
});
const movie = await tmdb.getMovie({ movieId: this.media.tmdbId });
@@ -283,6 +294,18 @@ export class MediaRequest {
return;
}
const sonarrSettings = settings.sonarr.find(
(sonarr) => sonarr.isDefault && !sonarr.is4k
);
if (!sonarrSettings) {
logger.info(
'There is no default sonarr configured. Did you set any of your Sonarr servers as default?',
{ label: 'Media Request' }
);
return;
}
const media = await mediaRepository.findOne({
where: { id: this.media.id },
relations: ['requests'],
@@ -293,12 +316,11 @@ export class MediaRequest {
}
const tmdb = new TheMovieDb();
const sonarrSettings = settings.sonarr[0];
const sonarr = new SonarrAPI({
apiKey: sonarrSettings.apiKey,
url: `${sonarrSettings.useSsl ? 'https' : 'http'}://${
sonarrSettings.hostname
}:${sonarrSettings.port}/api`,
}:${sonarrSettings.port}${sonarrSettings.baseUrl ?? ''}/api`,
});
const series = await tmdb.getTvShow({ tvId: media.tmdbId });

View File

@@ -51,64 +51,81 @@ class JobPlexSync {
private async processMovie(plexitem: PlexLibraryItem) {
const mediaRepository = getRepository(Media);
if (plexitem.guid.match(plexRegex)) {
const metadata = await this.plexClient.getMetadata(plexitem.ratingKey);
const newMedia = new Media();
try {
if (plexitem.guid.match(plexRegex)) {
const metadata = await this.plexClient.getMetadata(plexitem.ratingKey);
const newMedia = new Media();
metadata.Guid.forEach((ref) => {
if (ref.id.match(imdbRegex)) {
newMedia.imdbId = ref.id.match(imdbRegex)?.[1] ?? undefined;
} else if (ref.id.match(tmdbRegex)) {
const tmdbMatch = ref.id.match(tmdbRegex)?.[1];
newMedia.tmdbId = Number(tmdbMatch);
if (!metadata.Guid) {
logger.debug('No Guid metadata for this title. Skipping', {
label: 'Plex Sync',
ratingKey: plexitem.ratingKey,
});
return;
}
});
const existing = await this.getExisting(newMedia.tmdbId);
if (existing && existing.status === MediaStatus.AVAILABLE) {
this.log(`Title exists and is already available ${metadata.title}`);
} else if (existing && existing.status !== MediaStatus.AVAILABLE) {
existing.status = MediaStatus.AVAILABLE;
mediaRepository.save(existing);
this.log(
`Request for ${metadata.title} exists. Setting status AVAILABLE`,
'info'
);
} else {
newMedia.status = MediaStatus.AVAILABLE;
newMedia.mediaType = MediaType.MOVIE;
await mediaRepository.save(newMedia);
this.log(`Saved ${plexitem.title}`);
}
} else {
const matchedid = plexitem.guid.match(/imdb:\/\/(tt[0-9]+)/);
if (matchedid?.[1]) {
const tmdbMovie = await this.tmdb.getMovieByImdbId({
imdbId: matchedid[1],
metadata.Guid.forEach((ref) => {
if (ref.id.match(imdbRegex)) {
newMedia.imdbId = ref.id.match(imdbRegex)?.[1] ?? undefined;
} else if (ref.id.match(tmdbRegex)) {
const tmdbMatch = ref.id.match(tmdbRegex)?.[1];
newMedia.tmdbId = Number(tmdbMatch);
}
});
const existing = await this.getExisting(tmdbMovie.id);
const existing = await this.getExisting(newMedia.tmdbId);
if (existing && existing.status === MediaStatus.AVAILABLE) {
this.log(`Title exists and is already available ${plexitem.title}`);
this.log(`Title exists and is already available ${metadata.title}`);
} else if (existing && existing.status !== MediaStatus.AVAILABLE) {
existing.status = MediaStatus.AVAILABLE;
await mediaRepository.save(existing);
mediaRepository.save(existing);
this.log(
`Request for ${plexitem.title} exists. Setting status AVAILABLE`,
`Request for ${metadata.title} exists. Setting status AVAILABLE`,
'info'
);
} else if (tmdbMovie) {
const newMedia = new Media();
newMedia.imdbId = tmdbMovie.external_ids.imdb_id;
newMedia.tmdbId = tmdbMovie.id;
} else {
newMedia.status = MediaStatus.AVAILABLE;
newMedia.mediaType = MediaType.MOVIE;
await mediaRepository.save(newMedia);
this.log(`Saved ${tmdbMovie.title}`);
this.log(`Saved ${plexitem.title}`);
}
} else {
const matchedid = plexitem.guid.match(/imdb:\/\/(tt[0-9]+)/);
if (matchedid?.[1]) {
const tmdbMovie = await this.tmdb.getMovieByImdbId({
imdbId: matchedid[1],
});
const existing = await this.getExisting(tmdbMovie.id);
if (existing && existing.status === MediaStatus.AVAILABLE) {
this.log(`Title exists and is already available ${plexitem.title}`);
} else if (existing && existing.status !== MediaStatus.AVAILABLE) {
existing.status = MediaStatus.AVAILABLE;
await mediaRepository.save(existing);
this.log(
`Request for ${plexitem.title} exists. Setting status AVAILABLE`,
'info'
);
} else if (tmdbMovie) {
const newMedia = new Media();
newMedia.imdbId = tmdbMovie.external_ids.imdb_id;
newMedia.tmdbId = tmdbMovie.id;
newMedia.status = MediaStatus.AVAILABLE;
newMedia.mediaType = MediaType.MOVIE;
await mediaRepository.save(newMedia);
this.log(`Saved ${tmdbMovie.title}`);
}
}
}
} catch (e) {
this.log(
`Failed to process plex item. ratingKey: ${
plexitem.parentRatingKey ?? plexitem.ratingKey
}`,
'error'
);
}
}

View File

@@ -0,0 +1,20 @@
import { MigrationInterface, QueryRunner, TableUnique } from 'typeorm';
export class DropImdbIdConstraint1607928251245 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropUniqueConstraint(
'media',
'UQ_7ff2d11f6a83cb52386eaebe74b'
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createUniqueConstraint(
'media',
new TableUnique({
name: 'UQ_7ff2d11f6a83cb52386eaebe74b',
columnNames: ['imdbId'],
})
);
}
}

View File

@@ -2,7 +2,7 @@ declare module 'plex-api' {
export default class PlexAPI {
constructor(intiialOptions: {
hostname: string;
post: number;
port: number;
token?: string;
authenticator: {
authenticate: (

View File

@@ -6,6 +6,7 @@ import Button from '../../Common/Button';
import { defineMessages, useIntl } from 'react-intl';
import Axios from 'axios';
import * as Yup from 'yup';
import { useToasts } from 'react-toast-notifications';
const messages = defineMessages({
save: 'Save Changes',
@@ -14,10 +15,13 @@ const messages = defineMessages({
webhookUrl: 'Webhook URL',
validationWebhookUrlRequired: 'You must provide a webhook URL',
webhookUrlPlaceholder: 'Server Settings -> Integrations -> Webhooks',
discordsettingssaved: 'Discord notification settings saved!',
discordsettingsfailed: 'Discord notification settings failed to save.',
});
const NotificationsDiscord: React.FC = () => {
const intl = useIntl();
const { addToast } = useToasts();
const { data, error, revalidate } = useSWR(
'/api/v1/settings/notifications/discord'
);
@@ -49,8 +53,15 @@ const NotificationsDiscord: React.FC = () => {
webhookUrl: values.webhookUrl,
},
});
addToast(intl.formatMessage(messages.discordsettingssaved), {
appearance: 'success',
autoDismiss: true,
});
} catch (e) {
// TODO show error
addToast(intl.formatMessage(messages.discordsettingsfailed), {
appearance: 'error',
autoDismiss: true,
});
} finally {
revalidate();
}

View File

@@ -6,6 +6,7 @@ import Button from '../../Common/Button';
import { defineMessages, useIntl } from 'react-intl';
import Axios from 'axios';
import * as Yup from 'yup';
import { useToasts } from 'react-toast-notifications';
const messages = defineMessages({
save: 'Save Changes',
@@ -20,10 +21,13 @@ const messages = defineMessages({
enableSsl: 'Enable SSL',
authUser: 'Auth User',
authPass: 'Auth Pass',
emailsettingssaved: 'Email notification settings saved!',
emailsettingsfailed: 'Email notification settings failed to save.',
});
const NotificationsEmail: React.FC = () => {
const intl = useIntl();
const { addToast } = useToasts();
const { data, error, revalidate } = useSWR(
'/api/v1/settings/notifications/email'
);
@@ -65,14 +69,21 @@ const NotificationsEmail: React.FC = () => {
options: {
emailFrom: values.emailFrom,
smtpHost: values.smtpHost,
smtpPort: values.smtpPort,
smtpPort: Number(values.smtpPort),
secure: values.secure,
authUser: values.authUser,
authPass: values.authPass,
},
});
addToast(intl.formatMessage(messages.emailsettingssaved), {
appearance: 'success',
autoDismiss: true,
});
} catch (e) {
// TODO show error
addToast(intl.formatMessage(messages.emailsettingsfailed), {
appearance: 'error',
autoDismiss: true,
});
} finally {
revalidate();
}

View File

@@ -78,7 +78,7 @@ const SettingsPlex: React.FC<SettingsPlexProps> = ({ onComplete }) => {
try {
await axios.post('/api/v1/settings/plex', {
ip: values.hostname,
port: values.port,
port: Number(values.port),
} as PlexSettings);
revalidate();

View File

@@ -7,6 +7,10 @@ import type { Nullable } from '../utils/typeHelpers';
type Url = string | UrlObject;
const encodeURIExtraParams = (string: string): string => {
return encodeURIComponent(string).replace(/!/g, '%21');
};
interface SearchObject {
searchValue: string;
searchOpen: boolean;
@@ -35,14 +39,17 @@ const useSearchInput = (): SearchObject => {
if (router.pathname.startsWith('/search')) {
router.replace({
pathname: router.pathname,
query: { ...router.query, query: debouncedValue },
query: {
...router.query,
query: encodeURIExtraParams(debouncedValue),
},
});
} else {
setLastRoute(router.asPath);
router
.push({
pathname: '/search',
query: { query: debouncedValue },
query: { query: encodeURIExtraParams(debouncedValue) },
})
.then(() => window.scrollTo(0, 0));
}
@@ -85,8 +92,12 @@ const useSearchInput = (): SearchObject => {
* is on /search
*/
useEffect(() => {
if (router.query.query !== debouncedValue) {
setSearchValue((router.query.query as string) ?? '');
if (router.query.query !== encodeURIExtraParams(debouncedValue)) {
setSearchValue(
router.query.query
? decodeURIComponent(router.query.query as string)
: ''
);
if (!router.pathname.startsWith('/search') && !router.query.query) {
setIsOpen(false);

View File

@@ -58,7 +58,7 @@
"components.RequestList.RequestItem.notavailable": "entf.",
"components.RequestList.RequestItem.requestedby": "Antrag von {username}",
"components.RequestList.RequestItem.seasons": "Staffeln",
"components.RequestList.mediaInfo": "Medieninformationen",
"components.RequestList.mediaInfo": "Medieninfos",
"components.RequestList.modifiedBy": "Zuletzt geändert von",
"components.RequestList.next": "Nächste",
"components.RequestList.previous": "Vorherige",
@@ -88,8 +88,8 @@
"components.RequestModal.status": "Status",
"components.Search.searchresults": "Suchergebnisse",
"components.Settings.Notifications.agentenabled": "Agent aktiviert",
"components.Settings.Notifications.authPass": "Auth Pass",
"components.Settings.Notifications.authUser": "Auth User",
"components.Settings.Notifications.authPass": "Authentifizierungspasswort",
"components.Settings.Notifications.authUser": "Authentifizierungsbenutzername",
"components.Settings.Notifications.emailsender": "E-Mail-Absenderadresse",
"components.Settings.Notifications.enableSsl": "SSL aktivieren",
"components.Settings.Notifications.save": "Änderungen speichern",

View File

@@ -91,7 +91,11 @@
"components.Settings.Notifications.agentenabled": "Agent Enabled",
"components.Settings.Notifications.authPass": "Auth Pass",
"components.Settings.Notifications.authUser": "Auth User",
"components.Settings.Notifications.discordsettingsfailed": "Discord notification settings failed to save.",
"components.Settings.Notifications.discordsettingssaved": "Discord notification settings saved!",
"components.Settings.Notifications.emailsender": "Email Sender Address",
"components.Settings.Notifications.emailsettingsfailed": "Email notification settings failed to save.",
"components.Settings.Notifications.emailsettingssaved": "Email notification settings saved!",
"components.Settings.Notifications.enableSsl": "Enable SSL",
"components.Settings.Notifications.save": "Save Changes",
"components.Settings.Notifications.saving": "Saving...",

View File

@@ -90,13 +90,13 @@
"components.Settings.Notifications.agentenabled": "Agent activé",
"components.Settings.Notifications.authPass": "Auth Pass",
"components.Settings.Notifications.authUser": "Auth User",
"components.Settings.Notifications.emailsender": "Adresse courriel de l'expéditeur",
"components.Settings.Notifications.emailsender": "e-mail de l'expéditeur",
"components.Settings.Notifications.enableSsl": "Activer le SSL",
"components.Settings.Notifications.save": "Sauvegarder les changements",
"components.Settings.Notifications.saving": "Sauvegarde en cours…",
"components.Settings.Notifications.smtpHost": "Hôte SMTP",
"components.Settings.Notifications.smtpPort": "Port SMTP",
"components.Settings.Notifications.validationFromRequired": "Vous devez fournir une adresse courriel d'expéditeur",
"components.Settings.Notifications.validationFromRequired": "Vous devez fournir une adresse e-mail d'expéditeur",
"components.Settings.Notifications.validationSmtpHostRequired": "Vous devez fournir un hôte SSL",
"components.Settings.Notifications.validationSmtpPortRequired": "Vous devez fournir un port SMTP",
"components.Settings.Notifications.validationWebhookUrlRequired": "Vous devez fournir une URL de webhook",
@@ -255,7 +255,7 @@
"components.UserEdit.autoapproveDescription": "Active la validation automatique de toutes les demandes d'ajouts de cet utilisateur.",
"components.UserEdit.avatar": "Avatar",
"components.UserEdit.edituser": "Modifier l'utilisateur",
"components.UserEdit.email": "Courriel",
"components.UserEdit.email": "e-mail",
"components.UserEdit.managerequests": "Gérer les demandes d'ajouts",
"components.UserEdit.managerequestsDescription": "Donne la permission de gérer les demandes d'ajouts sur Overseerr. Ceci inclut la possibilité de valider ou refuser une demande.",
"components.UserEdit.permissions": "Autorisations",

View File

@@ -4,7 +4,7 @@
"components.Discover.nopending": "Geen Wachtende Verzoeken",
"components.Discover.popularmovies": "Populaire Films",
"components.Discover.populartv": "Populaire Series",
"components.Discover.recentlyAdded": "RecentelijkToegevoegd",
"components.Discover.recentlyAdded": "Recentelijk Toegevoegd",
"components.Discover.recentrequests": "Recente Verzoeken",
"components.Discover.trending": "Trending",
"components.Discover.upcoming": "Verwachte Films",
@@ -32,7 +32,7 @@
"components.MovieDetails.originallanguage": "Originele Taal",
"components.MovieDetails.overview": "Overzicht",
"components.MovieDetails.overviewunavailable": "Overzicht onbeschikbaar",
"components.MovieDetails.pending": "In afwachting",
"components.MovieDetails.pending": "Wachtende",
"components.MovieDetails.recommendations": "Aanbevelingen",
"components.MovieDetails.recommendationssubtext": "Als je {title} leuk vond, vind je dit misschien ook leuk...",
"components.MovieDetails.releasedate": "Release Datum",
@@ -56,251 +56,257 @@
"components.RequestCard.requestedby": "Verzocht door {username}",
"components.RequestCard.seasons": "Seizoenen",
"components.RequestList.RequestItem.notavailable": "Nvt",
"components.RequestList.RequestItem.requestedby": "",
"components.RequestList.RequestItem.seasons": "",
"components.RequestList.mediaInfo": "",
"components.RequestList.modifiedBy": "",
"components.RequestList.next": "",
"components.RequestList.previous": "",
"components.RequestList.requestedAt": "",
"components.RequestList.requests": "",
"components.RequestList.showingresults": "",
"components.RequestList.status": "",
"components.RequestModal.cancel": "",
"components.RequestModal.cancelling": "",
"components.RequestModal.cancelrequest": "",
"components.RequestModal.close": "",
"components.RequestModal.extras": "",
"components.RequestModal.notrequested": "",
"components.RequestModal.numberofepisodes": "",
"components.RequestModal.pendingrequest": "",
"components.RequestModal.request": "",
"components.RequestModal.requestCancel": "",
"components.RequestModal.requestSuccess": "",
"components.RequestModal.requestadmin": "",
"components.RequestModal.requestfrom": "",
"components.RequestModal.requesting": "",
"components.RequestModal.requestseasons": "",
"components.RequestModal.requesttitle": "",
"components.RequestModal.season": "",
"components.RequestModal.seasonnumber": "",
"components.RequestModal.selectseason": "",
"components.RequestModal.status": "",
"components.Search.searchresults": "",
"components.Settings.Notifications.agentenabled": "",
"components.Settings.Notifications.authPass": "",
"components.Settings.Notifications.authUser": "",
"components.Settings.Notifications.emailsender": "",
"components.Settings.Notifications.enableSsl": "",
"components.Settings.Notifications.save": "",
"components.Settings.Notifications.saving": "",
"components.Settings.Notifications.smtpHost": "",
"components.Settings.Notifications.smtpPort": "",
"components.Settings.Notifications.validationFromRequired": "",
"components.Settings.Notifications.validationSmtpHostRequired": "",
"components.Settings.Notifications.validationSmtpPortRequired": "",
"components.Settings.Notifications.validationWebhookUrlRequired": "",
"components.Settings.Notifications.webhookUrl": "",
"components.Settings.Notifications.webhookUrlPlaceholder": "",
"components.Settings.RadarrModal.add": "",
"components.Settings.RadarrModal.apiKey": "",
"components.Settings.RadarrModal.apiKeyPlaceholder": "",
"components.Settings.RadarrModal.baseUrl": "",
"components.Settings.RadarrModal.baseUrlPlaceholder": "",
"components.Settings.RadarrModal.createradarr": "",
"components.Settings.RadarrModal.defaultserver": "",
"components.Settings.RadarrModal.editradarr": "",
"components.Settings.RadarrModal.hostname": "",
"components.Settings.RadarrModal.minimumAvailability": "",
"components.Settings.RadarrModal.port": "",
"components.Settings.RadarrModal.qualityprofile": "",
"components.Settings.RadarrModal.rootfolder": "",
"components.Settings.RadarrModal.save": "",
"components.Settings.RadarrModal.saving": "",
"components.Settings.RadarrModal.selectMinimumAvailability": "",
"components.Settings.RadarrModal.selectQualityProfile": "",
"components.Settings.RadarrModal.selectRootFolder": "",
"components.Settings.RadarrModal.server4k": "",
"components.Settings.RadarrModal.servername": "",
"components.Settings.RadarrModal.servernamePlaceholder": "",
"components.Settings.RadarrModal.ssl": "",
"components.Settings.RadarrModal.test": "",
"components.Settings.RadarrModal.testing": "",
"components.Settings.RadarrModal.toastRadarrTestFailure": "",
"components.Settings.RadarrModal.toastRadarrTestSuccess": "",
"components.Settings.RadarrModal.validationApiKeyRequired": "",
"components.Settings.RadarrModal.validationHostnameRequired": "",
"components.Settings.RadarrModal.validationPortRequired": "",
"components.Settings.RadarrModal.validationProfileRequired": "",
"components.Settings.RadarrModal.validationRootFolderRequired": "",
"components.Settings.SonarrModal.add": "",
"components.Settings.SonarrModal.apiKey": "",
"components.Settings.SonarrModal.apiKeyPlaceholder": "",
"components.Settings.SonarrModal.baseUrl": "",
"components.Settings.SonarrModal.baseUrlPlaceholder": "",
"components.Settings.SonarrModal.createsonarr": "",
"components.Settings.SonarrModal.defaultserver": "",
"components.Settings.SonarrModal.editsonarr": "",
"components.Settings.SonarrModal.hostname": "",
"components.Settings.SonarrModal.port": "",
"components.Settings.SonarrModal.qualityprofile": "",
"components.Settings.SonarrModal.rootfolder": "",
"components.Settings.SonarrModal.save": "",
"components.Settings.SonarrModal.saving": "",
"components.Settings.SonarrModal.seasonfolders": "",
"components.Settings.SonarrModal.selectQualityProfile": "",
"components.Settings.SonarrModal.selectRootFolder": "",
"components.Settings.SonarrModal.server4k": "",
"components.Settings.SonarrModal.servername": "",
"components.Settings.SonarrModal.servernamePlaceholder": "",
"components.Settings.SonarrModal.ssl": "",
"components.Settings.SonarrModal.test": "",
"components.Settings.SonarrModal.testing": "",
"components.Settings.SonarrModal.toastRadarrTestFailure": "",
"components.Settings.SonarrModal.toastRadarrTestSuccess": "",
"components.Settings.SonarrModal.validationApiKeyRequired": "",
"components.Settings.SonarrModal.validationHostnameRequired": "",
"components.Settings.SonarrModal.validationPortRequired": "",
"components.Settings.SonarrModal.validationProfileRequired": "",
"components.Settings.SonarrModal.validationRootFolderRequired": "",
"components.Settings.activeProfile": "",
"components.Settings.addradarr": "",
"components.Settings.address": "",
"components.Settings.addsonarr": "",
"components.Settings.apikey": "",
"components.Settings.applicationurl": "",
"components.Settings.cancelscan": "",
"components.Settings.copied": "",
"components.Settings.currentlibrary": "",
"components.Settings.default": "",
"components.Settings.default4k": "",
"components.Settings.delete": "",
"components.Settings.deleteserverconfirm": "",
"components.Settings.edit": "",
"components.Settings.generalsettings": "",
"components.Settings.generalsettingsDescription": "",
"components.Settings.hostname": "",
"components.Settings.jobname": "",
"components.Settings.librariesRemaining": "",
"components.Settings.manualscan": "",
"components.Settings.manualscanDescription": "",
"components.Settings.menuAbout": "",
"components.Settings.menuGeneralSettings": "",
"components.Settings.menuJobs": "",
"components.Settings.menuLogs": "",
"components.Settings.menuNotifications": "",
"components.Settings.menuPlexSettings": "",
"components.Settings.menuServices": "",
"components.Settings.nextexecution": "",
"components.Settings.notificationsettings": "",
"components.Settings.notificationsettingsDescription": "",
"components.Settings.notrunning": "",
"components.Settings.plexlibraries": "",
"components.Settings.plexlibrariesDescription": "",
"components.Settings.plexsettings": "",
"components.Settings.plexsettingsDescription": "",
"components.Settings.port": "",
"components.Settings.radarrSettingsDescription": "",
"components.Settings.radarrsettings": "",
"components.Settings.runnow": "",
"components.Settings.save": "",
"components.Settings.saving": "",
"components.Settings.servername": "",
"components.Settings.servernamePlaceholder": "",
"components.Settings.sonarrSettingsDescription": "",
"components.Settings.sonarrsettings": "",
"components.Settings.ssl": "",
"components.Settings.startscan": "",
"components.Settings.sync": "",
"components.Settings.syncing": "",
"components.Setup.configureplex": "",
"components.Setup.configureservices": "",
"components.Setup.continue": "",
"components.Setup.finish": "",
"components.Setup.finishing": "",
"components.Setup.loginwithplex": "",
"components.Setup.signinMessage": "",
"components.Setup.welcome": "",
"components.Slider.noresults": "",
"components.TitleCard.movie": "",
"components.TitleCard.tvshow": "",
"components.TvDetails.approve": "",
"components.TvDetails.approverequests": "",
"components.TvDetails.available": "",
"components.TvDetails.cancelrequest": "",
"components.TvDetails.cast": "",
"components.TvDetails.decline": "",
"components.TvDetails.declinerequests": "",
"components.TvDetails.manageModalClearMedia": "",
"components.TvDetails.manageModalClearMediaWarning": "",
"components.TvDetails.manageModalNoRequests": "",
"components.TvDetails.manageModalRequests": "",
"components.TvDetails.manageModalTitle": "",
"components.TvDetails.originallanguage": "",
"components.TvDetails.overview": "",
"components.TvDetails.overviewunavailable": "",
"components.TvDetails.pending": "",
"components.TvDetails.recommendations": "",
"components.TvDetails.recommendationssubtext": "",
"components.TvDetails.request": "",
"components.TvDetails.requestmore": "",
"components.TvDetails.similar": "",
"components.TvDetails.similarsubtext": "",
"components.TvDetails.status": "",
"components.TvDetails.unavailable": "",
"components.TvDetails.userrating": "",
"components.UserEdit.admin": "",
"components.UserEdit.adminDescription": "",
"components.UserEdit.autoapprove": "",
"components.UserEdit.autoapproveDescription": "",
"components.UserEdit.avatar": "",
"components.UserEdit.edituser": "",
"components.UserEdit.email": "",
"components.UserEdit.managerequests": "",
"components.UserEdit.managerequestsDescription": "",
"components.UserEdit.permissions": "",
"components.UserEdit.request": "",
"components.UserEdit.requestDescription": "",
"components.UserEdit.save": "",
"components.UserEdit.saving": "",
"components.UserEdit.settings": "",
"components.UserEdit.settingsDescription": "",
"components.UserEdit.userfail": "",
"components.UserEdit.username": "",
"components.UserEdit.users": "",
"components.UserEdit.usersDescription": "",
"components.UserEdit.usersaved": "",
"components.UserEdit.vote": "",
"components.UserEdit.voteDescription": "",
"components.UserList.admin": "",
"components.UserList.created": "",
"components.UserList.delete": "",
"components.UserList.edit": "",
"components.UserList.lastupdated": "",
"components.UserList.plexuser": "",
"components.UserList.role": "",
"components.UserList.totalrequests": "",
"components.UserList.user": "",
"components.UserList.userlist": "",
"components.UserList.username": "",
"components.UserList.usertype": "",
"i18n.approve": "",
"i18n.approved": "",
"i18n.available": "",
"i18n.cancel": "",
"i18n.decline": "",
"i18n.declined": "",
"i18n.delete": "",
"i18n.movies": "",
"i18n.partiallyavailable": "",
"i18n.pending": "",
"i18n.processing": "",
"i18n.tvshows": "",
"i18n.unavailable": "",
"pages.internalServerError": "",
"pages.oops": "",
"pages.pageNotFound": "",
"pages.returnHome": "",
"pages.serviceUnavailable": "",
"pages.somethingWentWrong": ""
"components.RequestList.RequestItem.requestedby": "Verzocht door {username}",
"components.RequestList.RequestItem.seasons": "Seizoenen",
"components.RequestList.mediaInfo": "Media Info",
"components.RequestList.modifiedBy": "Laatst Aangepast Door",
"components.RequestList.next": "Volgende",
"components.RequestList.previous": "Vorige",
"components.RequestList.requestedAt": "Aangevraagd Om",
"components.RequestList.requests": "Verzoeken",
"components.RequestList.showingresults": "<strong>{from}</strong> tot <strong>{to}</strong> van de <strong>{total}</strong> resultaten worden weergegeven",
"components.RequestList.status": "Status",
"components.RequestModal.cancel": "Verzoek Annuleren",
"components.RequestModal.cancelling": "Bezig met annuleren...",
"components.RequestModal.cancelrequest": "Hiermee wordt je verzoek verwijderd. Weet je zeker dat je door wilt gaan?",
"components.RequestModal.close": "Sluiten",
"components.RequestModal.extras": "Extra",
"components.RequestModal.notrequested": "Niet Verzocht",
"components.RequestModal.numberofepisodes": "# Afleveringen",
"components.RequestModal.pendingrequest": "Wachtend verzoek voor {title}",
"components.RequestModal.request": "Verzoek",
"components.RequestModal.requestCancel": "Verzoek voor <strong>{title}</strong> is geannuleerd",
"components.RequestModal.requestSuccess": "<strong>{title}</strong> is verzocht.",
"components.RequestModal.requestadmin": "Je verzoek zal onmiddelijk goedgekeurd worden.",
"components.RequestModal.requestfrom": "Er is een afwachtend verzoek van {user}",
"components.RequestModal.requesting": "Bezig met verzoeken…",
"components.RequestModal.requestseasons": "Verzoek {seasonCount} {seasonCount, plural, één {Season} andere {Seasons}}",
"components.RequestModal.requesttitle": "Verzoek {title}",
"components.RequestModal.season": "Seizoen",
"components.RequestModal.seasonnumber": "Seizoen {number}",
"components.RequestModal.selectseason": "Selecteer seizoen(en)",
"components.RequestModal.status": "Status",
"components.Search.searchresults": "Zoekresultaten",
"components.Settings.Notifications.agentenabled": "Agent Ingeschakeld",
"components.Settings.Notifications.authPass": "Wachtwoord",
"components.Settings.Notifications.authUser": "Gebruikersnaam",
"components.Settings.Notifications.emailsender": "E-mail Adres Van Afzender",
"components.Settings.Notifications.enableSsl": "Schakel SSL in",
"components.Settings.Notifications.save": "Wijzigingen Opslaan",
"components.Settings.Notifications.saving": "Bezig met opslaan...",
"components.Settings.Notifications.smtpHost": "SMTP Host",
"components.Settings.Notifications.smtpPort": "SMTP Poort",
"components.Settings.Notifications.validationFromRequired": "Je moet een afzender adres opgeven",
"components.Settings.Notifications.validationSmtpHostRequired": "Je moet een SMTP host opgeven",
"components.Settings.Notifications.validationSmtpPortRequired": "Je moet een SMTP poort opgeven",
"components.Settings.Notifications.validationWebhookUrlRequired": "Je moet een webhook URL opgeven",
"components.Settings.Notifications.webhookUrl": "Webhook URL",
"components.Settings.Notifications.webhookUrlPlaceholder": "Server instellingen -> Integraties -> Webhooks",
"components.Settings.RadarrModal.add": "Server Toevoegen",
"components.Settings.RadarrModal.apiKey": "API Key",
"components.Settings.RadarrModal.apiKeyPlaceholder": "Je Radarr API Key",
"components.Settings.RadarrModal.baseUrl": "Basis URL",
"components.Settings.RadarrModal.baseUrlPlaceholder": "Voorbeeld: /radarr",
"components.Settings.RadarrModal.createradarr": "Maak Een Nieuwe Radarr Server Aan",
"components.Settings.RadarrModal.defaultserver": "Standaard Server",
"components.Settings.RadarrModal.editradarr": "Wijzig Radarr Server",
"components.Settings.RadarrModal.hostname": "Hostnaam",
"components.Settings.RadarrModal.minimumAvailability": "Minimale Beschikbaarheid",
"components.Settings.RadarrModal.port": "Poort",
"components.Settings.RadarrModal.qualityprofile": "Kwaliteitsprofiel",
"components.Settings.RadarrModal.rootfolder": "Hoofdmap",
"components.Settings.RadarrModal.save": "Wijzigingen Opslaan",
"components.Settings.RadarrModal.saving": "Bezig met opslaan...",
"components.Settings.RadarrModal.selectMinimumAvailability": "Selecteer minimale beschikbaarheid",
"components.Settings.RadarrModal.selectQualityProfile": "Selecteer een kwaliteitsprofiel",
"components.Settings.RadarrModal.selectRootFolder": "Selecteer een Hoofdmap",
"components.Settings.RadarrModal.server4k": "4K Server",
"components.Settings.RadarrModal.servername": "Server Naam",
"components.Settings.RadarrModal.servernamePlaceholder": "Een Radarr Server",
"components.Settings.RadarrModal.ssl": "SSL",
"components.Settings.RadarrModal.test": "Test",
"components.Settings.RadarrModal.testing": "Bezig met testen...",
"components.Settings.RadarrModal.toastRadarrTestFailure": "Kon niet verbinden met de Radarr Server",
"components.Settings.RadarrModal.toastRadarrTestSuccess": "Verbonden met de Radarr server!",
"components.Settings.RadarrModal.validationApiKeyRequired": "Je moet een API key opgeven",
"components.Settings.RadarrModal.validationHostnameRequired": "Je moet een hostnaam/IP opgeven",
"components.Settings.RadarrModal.validationPortRequired": "Je moet een poort opgeven",
"components.Settings.RadarrModal.validationProfileRequired": "Je moet een profiel selecteren",
"components.Settings.RadarrModal.validationRootFolderRequired": "Je moet een hoofdmap selecteren",
"components.Settings.SonarrModal.add": "Server Toevoegen",
"components.Settings.SonarrModal.apiKey": "API Key",
"components.Settings.SonarrModal.apiKeyPlaceholder": "Je Sonarr API Key",
"components.Settings.SonarrModal.baseUrl": "Basis URL",
"components.Settings.SonarrModal.baseUrlPlaceholder": "Voorbeeld: /sonarr",
"components.Settings.SonarrModal.createsonarr": "Maak Nieuwe Sonar Server Aan",
"components.Settings.SonarrModal.defaultserver": "Standaard Server",
"components.Settings.SonarrModal.editsonarr": "Wijzig Sonarr Server",
"components.Settings.SonarrModal.hostname": "Hostnaam",
"components.Settings.SonarrModal.port": "Poort",
"components.Settings.SonarrModal.qualityprofile": "Kwaliteitsprofiel",
"components.Settings.SonarrModal.rootfolder": "Basisfolder",
"components.Settings.SonarrModal.save": "Wijzigingen Opslaan",
"components.Settings.SonarrModal.saving": "Bezig met opslaan...",
"components.Settings.SonarrModal.seasonfolders": "Seizoen Folders",
"components.Settings.SonarrModal.selectQualityProfile": "Selecteer een Kwaliteitsprofiel",
"components.Settings.SonarrModal.selectRootFolder": "Selecteer een Basisfolder",
"components.Settings.SonarrModal.server4k": "4K Server",
"components.Settings.SonarrModal.servername": "Sever Naam",
"components.Settings.SonarrModal.servernamePlaceholder": "Een Sonarr Server",
"components.Settings.SonarrModal.ssl": "SSL",
"components.Settings.SonarrModal.test": "Test",
"components.Settings.SonarrModal.testing": "Bezig met testen...",
"components.Settings.SonarrModal.toastRadarrTestFailure": "Kon niet verbinden met de Sonarr Server",
"components.Settings.SonarrModal.toastRadarrTestSuccess": "Verbonden met de Sonarr server!",
"components.Settings.SonarrModal.validationApiKeyRequired": "Je moet een API key opgeven",
"components.Settings.SonarrModal.validationHostnameRequired": "Je moet een hostnaam/IP opgeven",
"components.Settings.SonarrModal.validationPortRequired": "Je moet een poort opgeven",
"components.Settings.SonarrModal.validationProfileRequired": "Je moet een profiel selecteren",
"components.Settings.SonarrModal.validationRootFolderRequired": "Je moet een hoofdfolder selecteren",
"components.Settings.activeProfile": "Actief profiel",
"components.Settings.addradarr": "Radarr Server Toevoegen",
"components.Settings.address": "Adres",
"components.Settings.addsonarr": "Sonarr Server Toevoegen",
"components.Settings.apikey": "API Key",
"components.Settings.applicationurl": "Applicatie URL",
"components.Settings.cancelscan": "Scan Annuleren",
"components.Settings.copied": "API key gekopieerd naar het klembord",
"components.Settings.currentlibrary": "Huidige Bibliotheek: {name}",
"components.Settings.default": "Standaard",
"components.Settings.default4k": "Standaard 4K",
"components.Settings.delete": "Verwijderen",
"components.Settings.deleteserverconfirm": "Weet je zeker dat je deze server wil verwijderen?",
"components.Settings.edit": "Wijzig",
"components.Settings.generalsettings": "Algemene Instellingen",
"components.Settings.generalsettingsDescription": "Deze instellingen zijn gerelateerd aan de algemene Overseer configuratie.",
"components.Settings.hostname": "Hostnaam/IP",
"components.Settings.jobname": "Taaknaam",
"components.Settings.librariesRemaining": "Resterende Bibliotheken: {count}",
"components.Settings.manualscan": "Handmatige Bibliotheek Scan",
"components.Settings.manualscanDescription": "Normaal gesproken wordt dit eens elke 6 uur gedraaid. Overseerr controleert de recentelijk toegoevoegde items van je Plex Server aggresiever. Als dit je eerst keer is om Plex te configuren raden wij aan om eenmaal een volledige bibliotheek scan handmatig te draaien!",
"components.Settings.menuAbout": "Over",
"components.Settings.menuGeneralSettings": "Algemene Instellingen",
"components.Settings.menuJobs": "Taken",
"components.Settings.menuLogs": "Logboeken",
"components.Settings.menuNotifications": "Notificaties",
"components.Settings.menuPlexSettings": "Plex",
"components.Settings.menuServices": "Diensten",
"components.Settings.nextexecution": "Volgende Uitvoering",
"components.Settings.notificationsettings": "Notificatie Instellingen",
"components.Settings.notificationsettingsDescription": "Hier kun je kiezen welke soort notificaties er worden verstuurd en door welke type diensten.",
"components.Settings.notrunning": "Draait niet",
"components.Settings.plexlibraries": "Plex Bibliotheken",
"components.Settings.plexlibrariesDescription": "The bibliotheken die Overseerr scanned voor titels. Stel je Plex connectie instellingen in en sla ze op. Klik op de onderstaande knop als er geen connecties staan.",
"components.Settings.plexsettings": "Plex Instellingen",
"components.Settings.plexsettingsDescription": "Configureer de instellingen voor je Plex server. Overseerr gebruikt je Plex server om je bibliotheek met een interval te scannen om te zien welke content beschikbaar is.",
"components.Settings.port": "Poort",
"components.Settings.radarrSettingsDescription": "Stel hier onder je Radarr connectie in. Je kan er meerdere hebben, maar slechts twee actief hebben als standaard (één voor standaard HD, en één voor 4K). Beheerders kunnen bepalen welke server gebruikt wordt voor nieuwe verzoeken.",
"components.Settings.radarrsettings": "Radarr Instellingen",
"components.Settings.runnow": "Nu Starten",
"components.Settings.save": "Wijzigingen Opslaan",
"components.Settings.saving": "Bezig met opslaan...",
"components.Settings.servername": "Server Naam (Automatisch Ingesteld)",
"components.Settings.servernamePlaceholder": "Plex Server Naam",
"components.Settings.sonarrSettingsDescription": "Stel hier onder je Sonarr connectie in. Je kan er meerdere hebben, maar slechts twee actief hebben als standaard (één voor standaard HD, en één voor 4K). Beheerders kunnen bepalen welke server gebruikt wordt voor nieuwe verzoeken.",
"components.Settings.sonarrsettings": "Sonarr Instellingen",
"components.Settings.ssl": "SSL",
"components.Settings.startscan": "Scan Starten",
"components.Settings.sync": "Sync Plex Bibliotheken",
"components.Settings.syncing": "Bezig met synchronizeren…",
"components.Setup.configureplex": "Configureer Plex",
"components.Setup.configureservices": "Configureer Diensten",
"components.Setup.continue": "Doorgaan",
"components.Setup.finish": "Installatie Voltooien",
"components.Setup.finishing": "Bezig met voltooien...",
"components.Setup.loginwithplex": "Login met Plex",
"components.Setup.signinMessage": "Ga aan de slag door in te loggen met je Plex account",
"components.Setup.welcome": "Welcome bij Overseerr",
"components.Slider.noresults": "Geen Resultaten",
"components.TitleCard.movie": "Film",
"components.TitleCard.tvshow": "Series",
"components.TvDetails.approve": "Goedkeuren",
"components.TvDetails.approverequests": "Keur {requestCount} {requestCount, plural, één {Request} meerdere {Requests}} goed",
"components.TvDetails.available": "Beschikbaar",
"components.TvDetails.cancelrequest": "Verzoek Annuleren",
"components.TvDetails.cast": "Cast",
"components.TvDetails.decline": "Weigeren",
"components.TvDetails.declinerequests": "Weiger {requestCount} {requestCount, plural, één {Request} meerdere {Requests}}",
"components.TvDetails.manageModalClearMedia": "Wis Alle Media Data",
"components.TvDetails.manageModalClearMediaWarning": "Dit wist alle media data inclusief alle verzoeken voor dit item zonder herstelmogelijkheden. Als dit item in je Plex bibliotheek bestaat zal alle media info bij de volgende sync hersteld worden.",
"components.TvDetails.manageModalNoRequests": "Geen Verzoeken",
"components.TvDetails.manageModalRequests": "Verzoeken",
"components.TvDetails.manageModalTitle": "Beheer Series",
"components.TvDetails.originallanguage": "Originele Taal",
"components.TvDetails.overview": "Overzicht",
"components.TvDetails.overviewunavailable": "Overzicht onbeschikbaar",
"components.TvDetails.pending": "Wachtende",
"components.TvDetails.recommendations": "Aanbevelingen",
"components.TvDetails.recommendationssubtext": "Als je {title} leuk vond, vind je dit misschien ook leuk...",
"components.TvDetails.request": "Verzoek",
"components.TvDetails.requestmore": "Verzoek Meer",
"components.TvDetails.similar": "Soortgelijke Series",
"components.TvDetails.similarsubtext": "Andere series gelijk aan {title}",
"components.TvDetails.status": "Status",
"components.TvDetails.unavailable": "Onbeschikbaar",
"components.TvDetails.userrating": "Gebruikersbeoordeling",
"components.UserEdit.admin": "Beheerder",
"components.UserEdit.adminDescription": "Volledige beheerderstoegang. Omzeilt alle toestemmingscontroles.",
"components.UserEdit.autoapprove": "Automatisch Goedkeuren",
"components.UserEdit.autoapproveDescription": "Geeft automatische goedkeuring voor alle verzoeken van deze gebruiker.",
"components.UserEdit.avatar": "Avatar",
"components.UserEdit.edituser": "Wijzig Gebruiker",
"components.UserEdit.email": "E-mail",
"components.UserEdit.managerequests": "Beheer Verzoeken",
"components.UserEdit.managerequestsDescription": "Geeft toestemming om Overseerr-verzoeken te beheren. Inclusief het goedkeuren en weigeren van verzoeken.",
"components.UserEdit.permissions": "Rechten",
"components.UserEdit.request": "Verzoek",
"components.UserEdit.requestDescription": "Geeft toestemming om films en series aan te vragen.",
"components.UserEdit.save": "Sla op",
"components.UserEdit.saving": "Bezig met opslaan...",
"components.UserEdit.settings": "Instellingen Beheren",
"components.UserEdit.settingsDescription": "Geeft toestemming om alle Overseerr-instellingen te wijzigen. Een gebruiker moet deze toestemming hebben om deze aan anderen te verlenen.",
"components.UserEdit.userfail": "Er ging iets verkeerd bij het opslaan van de gebruiker.",
"components.UserEdit.username": "Gebruikersnaam",
"components.UserEdit.users": "Beheer Gebruikers",
"components.UserEdit.usersDescription": "Geeft toestemming om Overseerr-gebruikers te beheren. Gebruikers met deze toestemming kunnen gebruikers met beheerdersrechten niet wijzigen of deze toestemming geven.",
"components.UserEdit.usersaved": "Gebruiker opgeslagen",
"components.UserEdit.vote": "Stem",
"components.UserEdit.voteDescription": "Geeft toestemming om te stemmen op verzoeken (stemmen is nog niet geïmplementeerd)",
"components.UserList.admin": "Beheerder",
"components.UserList.created": "Gemaakt",
"components.UserList.delete": "Verwijderen",
"components.UserList.edit": "Wijzig",
"components.UserList.lastupdated": "Laatst Aangepast",
"components.UserList.plexuser": "Plex Gebruiker",
"components.UserList.role": "Rol",
"components.UserList.totalrequests": "Totale Verzoeken",
"components.UserList.user": "Gebruiker",
"components.UserList.userlist": "Gebruikerslijst",
"components.UserList.username": "Gebruikersnaam",
"components.UserList.usertype": "Gebruikerstype",
"i18n.approve": "Goedkeuren",
"i18n.approved": "Goedgekeurd",
"i18n.available": "Beschikbaar",
"i18n.cancel": "Annuleer",
"i18n.decline": "Weigeren",
"i18n.declined": "Geweigerd",
"i18n.delete": "Verwijder",
"i18n.movies": "Films",
"i18n.partiallyavailable": "Gedeeltelijk Beschikbaar",
"i18n.pending": "Afwachtende",
"i18n.processing": "Bezig met verwerken…",
"i18n.tvshows": "Series",
"i18n.unavailable": "Onbeschikbaar",
"pages.internalServerError": "{statusCode} - Interne Server Error",
"pages.oops": "Oeps",
"pages.pageNotFound": "404 - Pagina Niet Gevonden",
"pages.returnHome": "Terug naar de Home pagina",
"pages.serviceUnavailable": "{statusCode} - Service Onbeschikbaar",
"pages.somethingWentWrong": "{statusCode} - Er is iets verkeerd gegaan",
"components.MovieDetails.MovieCast.fullcast": "Volledige Cast",
"components.TvDetails.TvCast.fullseriescast": "Volledige Cast van de Series",
"components.Settings.Notifications.emailsettingssaved": "E-mail notificatie instellingen zijn opgeslagen!",
"components.Settings.Notifications.emailsettingsfailed": "E-mail notificatie instellingen konden niet opgeslagen worden.",
"components.Settings.Notifications.discordsettingssaved": "Discord notificatie instellingen zijn opgeslagen!",
"components.Settings.Notifications.discordsettingsfailed": "Discord notificatie instellingen konden niet opgeslagen worden."
}