-
+
= ({
>
-
+
{season.seasonNumber === 0
? intl.formatMessage(messages.extras)
: intl.formatMessage(messages.seasonnumber, {
number: season.seasonNumber,
})}
-
+
{season.episodeCount}
-
+
{!seasonRequest && !mediaSeason && (
{intl.formatMessage(messages.notrequested)}
@@ -346,10 +346,8 @@ const TvRequestModal: React.FC = ({
{!mediaSeason &&
seasonRequest?.status ===
MediaRequestStatus.APPROVED && (
-
- {intl.formatMessage(
- globalMessages.unavailable
- )}
+
+ {intl.formatMessage(globalMessages.requested)}
)}
{!mediaSeason &&
diff --git a/src/components/Settings/Notifications/NotificationsSlack/index.tsx b/src/components/Settings/Notifications/NotificationsSlack/index.tsx
new file mode 100644
index 00000000..9808f210
--- /dev/null
+++ b/src/components/Settings/Notifications/NotificationsSlack/index.tsx
@@ -0,0 +1,189 @@
+import React from 'react';
+import { Field, Form, Formik } from 'formik';
+import useSWR from 'swr';
+import LoadingSpinner from '../../../Common/LoadingSpinner';
+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';
+import Alert from '../../../Common/Alert';
+
+const messages = defineMessages({
+ save: 'Save Changes',
+ saving: 'Saving...',
+ agentenabled: 'Agent Enabled',
+ webhookUrl: 'Webhook URL',
+ validationWebhookUrlRequired: 'You must provide a webhook URL',
+ webhookUrlPlaceholder: 'Webhook URL',
+ slacksettingssaved: 'Slack notification settings saved!',
+ slacksettingsfailed: 'Slack notification settings failed to save.',
+ testsent: 'Test notification sent!',
+ test: 'Test',
+ settingupslack: 'Setting up Slack Notifications',
+ settingupslackDescription:
+ 'To use Slack notifications, you will need to create an Incoming Webhook integration and use the provided webhook URL below.',
+});
+
+const NotificationsSlack: React.FC = () => {
+ const intl = useIntl();
+ const { addToast } = useToasts();
+ const { data, error, revalidate } = useSWR(
+ '/api/v1/settings/notifications/slack'
+ );
+
+ const NotificationsSlackSchema = Yup.object().shape({
+ webhookUrl: Yup.string().required(
+ intl.formatMessage(messages.validationWebhookUrlRequired)
+ ),
+ });
+
+ if (!data && !error) {
+ return ;
+ }
+
+ return (
+ <>
+
+
+ {intl.formatMessage(messages.settingupslackDescription, {
+ WebhookLink: function WebhookLink(msg) {
+ return (
+
+ {msg}
+
+ );
+ },
+ })}
+
+
+ {
+ try {
+ await axios.post('/api/v1/settings/notifications/slack', {
+ enabled: values.enabled,
+ types: values.types,
+ options: {
+ webhookUrl: values.webhookUrl,
+ },
+ });
+ addToast(intl.formatMessage(messages.slacksettingssaved), {
+ appearance: 'success',
+ autoDismiss: true,
+ });
+ } catch (e) {
+ addToast(intl.formatMessage(messages.slacksettingsfailed), {
+ appearance: 'error',
+ autoDismiss: true,
+ });
+ } finally {
+ revalidate();
+ }
+ }}
+ >
+ {({ errors, touched, isSubmitting, values, isValid }) => {
+ const testSettings = async () => {
+ await axios.post('/api/v1/settings/notifications/slack/test', {
+ enabled: true,
+ types: values.types,
+ options: {
+ webhookUrl: values.webhookUrl,
+ },
+ });
+
+ addToast(intl.formatMessage(messages.testsent), {
+ appearance: 'info',
+ autoDismiss: true,
+ });
+ };
+
+ return (
+
+ );
+ }}
+
+ >
+ );
+};
+
+export default NotificationsSlack;
diff --git a/src/components/Settings/SettingsAbout/Releases/index.tsx b/src/components/Settings/SettingsAbout/Releases/index.tsx
index c570f12f..1e27c07d 100644
--- a/src/components/Settings/SettingsAbout/Releases/index.tsx
+++ b/src/components/Settings/SettingsAbout/Releases/index.tsx
@@ -7,7 +7,7 @@ import Badge from '../../../Common/Badge';
import Button from '../../../Common/Button';
import Modal from '../../../Common/Modal';
import Transition from '../../../Transition';
-import { defineMessages, useIntl } from 'react-intl';
+import { defineMessages, FormattedRelativeTime, useIntl } from 'react-intl';
import globalMessages from '../../../../i18n/globalMessages';
const messages = defineMessages({
@@ -59,7 +59,7 @@ const Release: React.FC = ({
const intl = useIntl();
const [isModalOpen, setModalOpen] = useState(false);
return (
-
+
= ({
-
+
+
+
+
{release.name}
{isLatest && (
@@ -147,7 +156,7 @@ const Releases: React.FC = ({ currentVersion }) => {
return (
-
+
{intl.formatMessage(messages.releases)}
{currentVersion.startsWith('develop-') && (
@@ -159,7 +168,7 @@ const Releases: React.FC
= ({ currentVersion }) => {
href="https://github.com/sct/overseerr"
target="_blank"
rel="noreferrer"
- className="text-yellow-100 underline hover:text-white transition duration-300"
+ className="text-yellow-100 underline transition duration-300 hover:text-white"
>
{msg}
diff --git a/src/components/Settings/SettingsMain.tsx b/src/components/Settings/SettingsMain.tsx
index b5d163af..8875cbea 100644
--- a/src/components/Settings/SettingsMain.tsx
+++ b/src/components/Settings/SettingsMain.tsx
@@ -10,7 +10,7 @@ import { defineMessages, useIntl } from 'react-intl';
import { useUser, Permission } from '../../hooks/useUser';
import { useToasts } from 'react-toast-notifications';
import { messages as permissionMessages } from '../UserEdit';
-import { hasPermission } from '../../../server/lib/permissions';
+import PermissionOption, { PermissionItem } from '../PermissionOption';
const messages = defineMessages({
generalsettings: 'General Settings',
@@ -27,13 +27,6 @@ const messages = defineMessages({
defaultPermissions: 'Default User Permissions',
});
-interface PermissionOption {
- id: string;
- name: string;
- description: string;
- permission: Permission;
-}
-
const SettingsMain: React.FC = () => {
const { addToast } = useToasts();
const { hasPermission: userHasPermission } = useUser();
@@ -63,7 +56,7 @@ const SettingsMain: React.FC = () => {
return ;
}
- const permissionList: PermissionOption[] = [
+ const permissionList: PermissionItem[] = [
{
id: 'admin',
name: intl.formatMessage(permissionMessages.admin),
@@ -96,12 +89,6 @@ const SettingsMain: React.FC = () => {
description: intl.formatMessage(permissionMessages.requestDescription),
permission: Permission.REQUEST,
},
- {
- id: 'vote',
- name: intl.formatMessage(permissionMessages.vote),
- description: intl.formatMessage(permissionMessages.voteDescription),
- permission: Permission.VOTE,
- },
{
id: 'autoapprove',
name: intl.formatMessage(permissionMessages.autoapprove),
@@ -109,6 +96,24 @@ const SettingsMain: React.FC = () => {
permissionMessages.autoapproveDescription
),
permission: Permission.AUTO_APPROVE,
+ children: [
+ {
+ id: 'autoapprovemovies',
+ name: intl.formatMessage(permissionMessages.autoapproveMovies),
+ description: intl.formatMessage(
+ permissionMessages.autoapproveMoviesDescription
+ ),
+ permission: Permission.AUTO_APPROVE_MOVIE,
+ },
+ {
+ id: 'autoapprovetv',
+ name: intl.formatMessage(permissionMessages.autoapproveSeries),
+ description: intl.formatMessage(
+ permissionMessages.autoapproveSeriesDescription
+ ),
+ permission: Permission.AUTO_APPROVE_TV,
+ },
+ ],
},
];
@@ -230,65 +235,18 @@ const SettingsMain: React.FC = () => {
- {permissionList.map((permissionOption) => (
-
(
+
+ setFieldValue(
+ 'defaultPermissions',
+ newPermissions
)
- ? 'opacity-50'
- : ''
- }`}
- key={`permission-option-${permissionOption.id}`}
- >
-
- {
- setFieldValue(
- 'defaultPermissions',
- hasPermission(
- permissionOption.permission,
- values.defaultPermissions
- )
- ? values.defaultPermissions -
- permissionOption.permission
- : values.defaultPermissions +
- permissionOption.permission
- );
- }}
- checked={hasPermission(
- permissionOption.permission,
- values.defaultPermissions
- )}
- />
-
-
-
- {permissionOption.name}
-
-
- {permissionOption.description}
-
-
-
+ }
+ />
))}
diff --git a/src/components/Settings/SettingsNotifications.tsx b/src/components/Settings/SettingsNotifications.tsx
index 75059589..034c9e5e 100644
--- a/src/components/Settings/SettingsNotifications.tsx
+++ b/src/components/Settings/SettingsNotifications.tsx
@@ -2,6 +2,8 @@ import Link from 'next/link';
import { useRouter } from 'next/router';
import React from 'react';
import { defineMessages, useIntl } from 'react-intl';
+import DiscordLogo from '../../assets/extlogos/discord_white.svg';
+import SlackLogo from '../../assets/extlogos/slack.svg';
const messages = defineMessages({
notificationsettings: 'Notification Settings',
@@ -11,6 +13,7 @@ const messages = defineMessages({
interface SettingsRoute {
text: string;
+ content: React.ReactNode;
route: string;
regex: RegExp;
}
@@ -18,23 +21,59 @@ interface SettingsRoute {
const settingsRoutes: SettingsRoute[] = [
{
text: 'Email',
+ content: (
+
+
+
+
+ Email
+
+ ),
route: '/settings/notifications/email',
regex: /^\/settings\/notifications\/email/,
},
{
text: 'Discord',
+ content: (
+
+
+ Discord
+
+ ),
route: '/settings/notifications/discord',
regex: /^\/settings\/notifications\/discord/,
},
+ {
+ text: 'Slack',
+ content: (
+
+
+ Slack
+
+ ),
+ route: '/settings/notifications/slack',
+ regex: /^\/settings\/notifications\/slack/,
+ },
];
const SettingsNotifications: React.FC = ({ children }) => {
const router = useRouter();
const intl = useIntl();
- const activeLinkColor = 'bg-gray-700';
+ const activeLinkColor = 'bg-indigo-700';
- const inactiveLinkColor = '';
+ const inactiveLinkColor = 'bg-gray-800';
const SettingsLink: React.FC<{
route: string;
@@ -62,10 +101,10 @@ const SettingsNotifications: React.FC = ({ children }) => {
return (
<>
-
+
{intl.formatMessage(messages.notificationsettings)}
-
+
{intl.formatMessage(messages.notificationsettingsDescription)}
@@ -87,7 +126,7 @@ const SettingsNotifications: React.FC = ({ children }) => {
)?.route
}
aria-label="Selected tab"
- className="bg-gray-800 text-white mt-1 rounded-md form-select block w-full pl-3 pr-10 py-2 text-base leading-6 border-gray-700 focus:outline-none focus:ring-blue focus:border-blue-300 sm:text-sm sm:leading-5 transition ease-in-out duration-150"
+ className="block w-full py-2 pl-3 pr-10 mt-1 text-base leading-6 text-white transition duration-150 ease-in-out bg-gray-800 border-gray-700 rounded-md form-select focus:outline-none focus:ring-blue focus:border-blue-300 sm:text-sm sm:leading-5"
>
{settingsRoutes.map((route, index) => (
{
regex={route.regex}
key={`standard-settings-link-${index}`}
>
- {route.text}
+ {route.content}
))}
diff --git a/src/components/StatusBadge/index.tsx b/src/components/StatusBadge/index.tsx
index f56e8ae3..66037d7f 100644
--- a/src/components/StatusBadge/index.tsx
+++ b/src/components/StatusBadge/index.tsx
@@ -5,36 +5,40 @@ import { useIntl } from 'react-intl';
import globalMessages from '../../i18n/globalMessages';
interface StatusBadgeProps {
- status: MediaStatus;
+ status?: MediaStatus;
}
const StatusBadge: React.FC
= ({ status }) => {
const intl = useIntl();
- return (
- <>
- {status === MediaStatus.AVAILABLE && (
+ switch (status) {
+ case MediaStatus.AVAILABLE:
+ return (
{intl.formatMessage(globalMessages.available)}
- )}
- {status === MediaStatus.PARTIALLY_AVAILABLE && (
+ );
+ case MediaStatus.PARTIALLY_AVAILABLE:
+ return (
{intl.formatMessage(globalMessages.partiallyavailable)}
- )}
- {status === MediaStatus.PROCESSING && (
-
- {intl.formatMessage(globalMessages.unavailable)}
+ );
+ case MediaStatus.PROCESSING:
+ return (
+
+ {intl.formatMessage(globalMessages.requested)}
- )}
- {status === MediaStatus.PENDING && (
+ );
+ case MediaStatus.PENDING:
+ return (
{intl.formatMessage(globalMessages.pending)}
- )}
- >
- );
+ );
+ default:
+ return null;
+ }
};
export default StatusBadge;
diff --git a/src/components/TitleCard/index.tsx b/src/components/TitleCard/index.tsx
index c460a9f9..1130af53 100644
--- a/src/components/TitleCard/index.tsx
+++ b/src/components/TitleCard/index.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useCallback } from 'react';
+import React, { useState, useCallback, useEffect } from 'react';
import type { MediaType } from '../../../server/models/Search';
import Available from '../../assets/available.svg';
import Requested from '../../assets/requested.svg';
@@ -51,6 +51,10 @@ const TitleCard: React.FC = ({
year = year.slice(0, 4);
}
+ useEffect(() => {
+ setCurrentStatus(status);
+ }, [status]);
+
const requestComplete = useCallback((newStatus: MediaStatus) => {
setCurrentStatus(newStatus);
setShowRequestModal(false);
@@ -74,7 +78,7 @@ const TitleCard: React.FC = ({
onCancel={closeModal}
/>
= ({
role="link"
tabIndex={0}
>
-
+
-
+
{mediaType === 'movie'
? intl.formatMessage(messages.movie)
: intl.formatMessage(messages.tvshow)}
@@ -107,7 +111,7 @@ const TitleCard: React.FC = ({
= ({
leaveFrom="opacity-100"
leaveTo="opacity-0"
>
-
+
diff --git a/src/components/TvDetails/index.tsx b/src/components/TvDetails/index.tsx
index 4d4330d6..07ec3ddc 100644
--- a/src/components/TvDetails/index.tsx
+++ b/src/components/TvDetails/index.tsx
@@ -19,7 +19,6 @@ import { useUser, Permission } from '../../hooks/useUser';
import { TvDetails as TvDetailsType } from '../../../server/models/Tv';
import { MediaStatus } from '../../../server/constants/media';
import RequestModal from '../RequestModal';
-import Badge from '../Common/Badge';
import ButtonWithDropdown from '../Common/ButtonWithDropdown';
import axios from 'axios';
import SlideOver from '../Common/SlideOver';
@@ -32,11 +31,11 @@ import RTAudFresh from '../../assets/rt_aud_fresh.svg';
import RTAudRotten from '../../assets/rt_aud_rotten.svg';
import type { RTRating } from '../../../server/api/rottentomatoes';
import Head from 'next/head';
-import globalMessages from '../../i18n/globalMessages';
import { ANIME_KEYWORD_ID } from '../../../server/api/themoviedb';
import ExternalLinkBlock from '../ExternalLinkBlock';
import { sortCrewPriority } from '../../utils/creditHelpers';
import { Crew } from '../../../server/models/common';
+import StatusBadge from '../StatusBadge';
const messages = defineMessages({
firstAirDate: 'First Air Date',
@@ -48,6 +47,7 @@ const messages = defineMessages({
recommendations: 'Recommendations',
similar: 'Similar Series',
cancelrequest: 'Cancel Request',
+ watchtrailer: 'Watch Trailer',
available: 'Available',
unavailable: 'Unavailable',
request: 'Request',
@@ -130,6 +130,11 @@ const TvDetails: React.FC
= ({ tv }) => {
(request) => request.status === MediaRequestStatus.PENDING
);
+ const trailerUrl = data.relatedVideos
+ ?.filter((r) => r.type === 'Trailer')
+ .sort((a, b) => a.size - b.size)
+ .pop()?.url;
+
const modifyRequests = async (type: 'approve' | 'decline'): Promise => {
if (!activeRequests) {
return;
@@ -221,38 +226,19 @@ const TvDetails: React.FC = ({ tv }) => {
)}
-
-
+
+
-
+
- {data.mediaInfo?.status === MediaStatus.AVAILABLE && (
-
- {intl.formatMessage(globalMessages.available)}
-
- )}
- {data.mediaInfo?.status === MediaStatus.PARTIALLY_AVAILABLE && (
-
- {intl.formatMessage(globalMessages.partiallyavailable)}
-
- )}
- {data.mediaInfo?.status === MediaStatus.PROCESSING && (
-
- {intl.formatMessage(globalMessages.unavailable)}
-
- )}
- {data.mediaInfo?.status === MediaStatus.PENDING && (
-
- {intl.formatMessage(globalMessages.pending)}
-
- )}
+
-
+
{data.name}
{data.firstAirDate && (
@@ -260,19 +246,47 @@ const TvDetails: React.FC = ({ tv }) => {
)}
-
+
{data.genres.map((g) => g.name).join(', ')}
-
+
+ {trailerUrl && (
+
+
+
+
+
+
+
+
+
+ )}
{(!data.mediaInfo ||
data.mediaInfo.status === MediaStatus.UNKNOWN) && (
setShowRequestModal(true)}
>
= ({ tv }) => {
text={
<>
= ({ tv }) => {
>
}
+ className="ml-2"
onClick={() => setShowRequestModal(true)}
>
{hasPermission(Permission.MANAGE_REQUESTS) &&
diff --git a/src/components/UserEdit/index.tsx b/src/components/UserEdit/index.tsx
index df7f3615..e59eb21a 100644
--- a/src/components/UserEdit/index.tsx
+++ b/src/components/UserEdit/index.tsx
@@ -2,12 +2,12 @@ import React, { useState, useEffect } from 'react';
import { useRouter } from 'next/router';
import LoadingSpinner from '../Common/LoadingSpinner';
import { Permission, useUser } from '../../hooks/useUser';
-import { hasPermission } from '../../../server/lib/permissions';
import Button from '../Common/Button';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import axios from 'axios';
import { useToasts } from 'react-toast-notifications';
import Header from '../Common/Header';
+import PermissionOption, { PermissionItem } from '../PermissionOption';
export const messages = defineMessages({
edituser: 'Edit User',
@@ -35,25 +35,24 @@ export const messages = defineMessages({
autoapprove: 'Auto Approve',
autoapproveDescription:
'Grants auto approval for any requests made by this user.',
+ autoapproveMovies: 'Auto Approve Movies',
+ autoapproveMoviesDescription:
+ 'Grants auto approve for movie requests made by this user.',
+ autoapproveSeries: 'Auto Approve Series',
+ autoapproveSeriesDescription:
+ 'Grants auto approve for series requests made by this user.',
save: 'Save',
saving: 'Saving...',
usersaved: 'User saved',
userfail: 'Something went wrong saving the user.',
});
-interface PermissionOption {
- id: string;
- name: string;
- description: string;
- permission: Permission;
-}
-
const UserEdit: React.FC = () => {
const router = useRouter();
const intl = useIntl();
const { addToast } = useToasts();
const [isUpdating, setIsUpdating] = useState(false);
- const { user: currentUser, hasPermission: currentHasPermission } = useUser();
+ const { user: currentUser } = useUser();
const { user, error, revalidate } = useUser({
id: Number(router.query.userId),
});
@@ -97,7 +96,7 @@ const UserEdit: React.FC = () => {
return ;
}
- const permissionList: PermissionOption[] = [
+ const permissionList: PermissionItem[] = [
{
id: 'admin',
name: intl.formatMessage(messages.admin),
@@ -128,17 +127,29 @@ const UserEdit: React.FC = () => {
description: intl.formatMessage(messages.requestDescription),
permission: Permission.REQUEST,
},
- {
- id: 'vote',
- name: intl.formatMessage(messages.vote),
- description: intl.formatMessage(messages.voteDescription),
- permission: Permission.VOTE,
- },
{
id: 'autoapprove',
name: intl.formatMessage(messages.autoapprove),
description: intl.formatMessage(messages.autoapproveDescription),
permission: Permission.AUTO_APPROVE,
+ children: [
+ {
+ id: 'autoapprovemovies',
+ name: intl.formatMessage(messages.autoapproveMovies),
+ description: intl.formatMessage(
+ messages.autoapproveMoviesDescription
+ ),
+ permission: Permission.AUTO_APPROVE_MOVIE,
+ },
+ {
+ id: 'autoapprovetv',
+ name: intl.formatMessage(messages.autoapproveSeries),
+ description: intl.formatMessage(
+ messages.autoapproveSeriesDescription
+ ),
+ permission: Permission.AUTO_APPROVE_TV,
+ },
+ ],
},
];
@@ -231,74 +242,16 @@ const UserEdit: React.FC = () => {
- {permissionList.map((permissionOption) => (
-
-
- {
- setCurrentPermission((current) =>
- hasPermission(
- permissionOption.permission,
- currentPermission
- )
- ? current - permissionOption.permission
- : current + permissionOption.permission
- );
- }}
- checked={hasPermission(
- permissionOption.permission,
- currentPermission
- )}
- />
-
-
-
- {permissionOption.name}
-
-
- {permissionOption.description}
-
-
-
+ {permissionList.map((permissionItem) => (
+
+ setCurrentPermission(newPermission)
+ }
+ />
))}
diff --git a/src/i18n/globalMessages.ts b/src/i18n/globalMessages.ts
index 447131e9..44f44b37 100644
--- a/src/i18n/globalMessages.ts
+++ b/src/i18n/globalMessages.ts
@@ -5,6 +5,8 @@ const globalMessages = defineMessages({
partiallyavailable: 'Partially Available',
processing: 'Processing',
unavailable: 'Unavailable',
+ requested: 'Requested',
+ failed: 'Failed',
pending: 'Pending',
declined: 'Declined',
approved: 'Approved',
@@ -14,6 +16,7 @@ const globalMessages = defineMessages({
approve: 'Approve',
decline: 'Decline',
delete: 'Delete',
+ retry: 'Retry',
deleting: 'Deleting…',
close: 'Close',
});
diff --git a/src/i18n/locale/de.json b/src/i18n/locale/de.json
index 75c20262..cc0ad7d9 100644
--- a/src/i18n/locale/de.json
+++ b/src/i18n/locale/de.json
@@ -5,28 +5,28 @@
"components.Discover.popularmovies": "Beliebte Filme",
"components.Discover.populartv": "Beliebte Serien",
"components.Discover.recentlyAdded": "Kürzlich hinzugefügt",
- "components.Discover.recentrequests": "Aktuelle Anfragen",
+ "components.Discover.recentrequests": "Kürzliche Anfragen",
"components.Discover.trending": "Trends",
"components.Discover.upcoming": "Bald erscheinende Filme",
"components.Discover.upcomingmovies": "Bald erscheinende Filme",
"components.Layout.LanguagePicker.changelanguage": "Sprache ändern",
"components.Layout.SearchInput.searchPlaceholder": "Nach Filmen und Serien suchen",
"components.Layout.Sidebar.dashboard": "Entdecken",
- "components.Layout.Sidebar.requests": "Anträge",
+ "components.Layout.Sidebar.requests": "Anfragen",
"components.Layout.Sidebar.settings": "Einstellungen",
"components.Layout.Sidebar.users": "Benutzer",
"components.Layout.UserDropdown.signout": "Abmelden",
- "components.Layout.alphawarning": "Dies ist ALPHA-Software. Fast alles kann kaputt und/oder instabil sein. Bitte melde Probleme auf der GitHub-Seite!",
- "components.Login.signinplex": "Melden Sie sich an, um fortzufahren",
+ "components.Layout.alphawarning": "Dies ist eine ALPHA-Software. Fast alles kann kaputt und/oder instabil sein. Bitte melde Probleme auf der GitHub-Seite!",
+ "components.Login.signinplex": "Melde dich an, um fortzufahren",
"components.MovieDetails.approve": "Genehmigen",
"components.MovieDetails.available": "Verfügbar",
"components.MovieDetails.budget": "Budget",
- "components.MovieDetails.cancelrequest": "Anfrage zurücknehmen",
+ "components.MovieDetails.cancelrequest": "Anfrage abbrechen",
"components.MovieDetails.cast": "Besetzung",
"components.MovieDetails.decline": "Ablehnen",
"components.MovieDetails.manageModalClearMedia": "Alle Mediendaten löschen",
"components.MovieDetails.manageModalClearMediaWarning": "Dadurch werden alle Mediendaten einschließlich aller Anfragen für dieses Element entfernt. Diese Aktion ist irreversibel. Wenn dieses Element in Ihrer Plex-Bibliothek vorhanden ist, werden die Medieninformationen bei der nächsten Synchronisierung neu erstellt.",
- "components.MovieDetails.manageModalNoRequests": "Keine Anträge",
+ "components.MovieDetails.manageModalNoRequests": "Keine Anfragen",
"components.MovieDetails.manageModalRequests": "Anfragen",
"components.MovieDetails.manageModalTitle": "Film verwalten",
"components.MovieDetails.originallanguage": "Originalsprache",
@@ -36,7 +36,7 @@
"components.MovieDetails.recommendations": "Empfehlungen",
"components.MovieDetails.recommendationssubtext": "Wenn dir {title} gefallen hat, könnte dir auch gefallen …",
"components.MovieDetails.releasedate": "Erscheinungsdatum",
- "components.MovieDetails.request": "Anfrage",
+ "components.MovieDetails.request": "Anfragen",
"components.MovieDetails.revenue": "Einnahmen",
"components.MovieDetails.runtime": "{minutes} Minuten",
"components.MovieDetails.similar": "Ähnliche Titel",
@@ -53,7 +53,7 @@
"components.PlexLoginButton.loginwithplex": "Anmeldung mit Plex",
"components.RequestBlock.seasons": "Staffeln",
"components.RequestCard.all": "Alle",
- "components.RequestCard.requestedby": "Anfrage von {username}",
+ "components.RequestCard.requestedby": "Angefragt von {username}",
"components.RequestCard.seasons": "Staffeln",
"components.RequestList.RequestItem.notavailable": "entf.",
"components.RequestList.RequestItem.requestedby": "Angefragt von {username}",
@@ -64,7 +64,7 @@
"components.RequestList.previous": "Vorherige",
"components.RequestList.requestedAt": "Angefragt am",
"components.RequestList.requests": "Anfragen",
- "components.RequestList.showingresults": "Anzeigen von
{from} bis
{to} von
{total} Ergebnissen",
+ "components.RequestList.showingresults": "Zeigt
{from} bis
{to} von
{total} Ergebnissen",
"components.RequestList.status": "Status",
"components.RequestModal.cancel": "Anfrage abbrechen",
"components.RequestModal.cancelling": "Abbrechen …",
@@ -77,10 +77,10 @@
"components.RequestModal.request": "Anfrage",
"components.RequestModal.requestCancel": "Anfrage für
{title} abgebrochen",
"components.RequestModal.requestSuccess": "
{title} angefragt.",
- "components.RequestModal.requestadmin": "Deine Anfrage wird direkt genehmigt.",
+ "components.RequestModal.requestadmin": "Deine Anfrage wird direkt genehmigt werden.",
"components.RequestModal.requestfrom": "Derzeit steht eine Anfrage von {username} aus",
- "components.RequestModal.requesting": "Wird angefragt…",
- "components.RequestModal.requestseasons": "{seasonCount} {seasonCount, plural, one {Season} other {Seasons}} anfragen",
+ "components.RequestModal.requesting": "Wird angefragt …",
+ "components.RequestModal.requestseasons": "{seasonCount} {seasonCount, plural, one {Staffel} other {Staffeln}} anfragen",
"components.RequestModal.requesttitle": "{title} anfragen",
"components.RequestModal.season": "Staffel",
"components.RequestModal.seasonnumber": "Staffel {number}",
@@ -96,15 +96,15 @@
"components.Settings.Notifications.saving": "Speichern …",
"components.Settings.Notifications.smtpHost": "SMTP-Host",
"components.Settings.Notifications.smtpPort": "SMTP-Port",
- "components.Settings.Notifications.validationFromRequired": "Sie müssen eine E-Mail-Absenderadresse angeben",
- "components.Settings.Notifications.validationSmtpHostRequired": "Sie müssen einen SMTP-Host bereitstellen",
- "components.Settings.Notifications.validationSmtpPortRequired": "Sie müssen einen SMTP-Port bereitstellen",
- "components.Settings.Notifications.validationWebhookUrlRequired": "Sie müssen eine Webhook-URL angeben",
+ "components.Settings.Notifications.validationFromRequired": "Du musst eine E-Mail-Absenderadresse angeben",
+ "components.Settings.Notifications.validationSmtpHostRequired": "Du musst einen SMTP-Host bereitstellen",
+ "components.Settings.Notifications.validationSmtpPortRequired": "Du musst einen SMTP-Port bereitstellen",
+ "components.Settings.Notifications.validationWebhookUrlRequired": "Du musst eine Webhook-URL angeben",
"components.Settings.Notifications.webhookUrl": "Webhook-URL",
"components.Settings.Notifications.webhookUrlPlaceholder": "Servereinstellungen -> Integrationen -> Webhooks",
"components.Settings.RadarrModal.add": "Server hinzufügen",
"components.Settings.RadarrModal.apiKey": "API-Schlüssel",
- "components.Settings.RadarrModal.apiKeyPlaceholder": "Ihr Radarr-API-Schlüssel",
+ "components.Settings.RadarrModal.apiKeyPlaceholder": "Dein Radarr-API-Schlüssel",
"components.Settings.RadarrModal.baseUrl": "Basis-URL",
"components.Settings.RadarrModal.baseUrlPlaceholder": "Beispiel: /radarr",
"components.Settings.RadarrModal.createradarr": "Einen neuen Radarr-Server erstellen",
@@ -117,9 +117,9 @@
"components.Settings.RadarrModal.rootfolder": "Stammordner",
"components.Settings.RadarrModal.save": "Änderungen speichern",
"components.Settings.RadarrModal.saving": "Speichern …",
- "components.Settings.RadarrModal.selectMinimumAvailability": "Wählen Sie die Mindestverfügbarkeit",
- "components.Settings.RadarrModal.selectQualityProfile": "Wählen Sie ein Qualitätsprofil",
- "components.Settings.RadarrModal.selectRootFolder": "Wählen Sie einen Stammordner",
+ "components.Settings.RadarrModal.selectMinimumAvailability": "Wähle die Mindestverfügbarkeit",
+ "components.Settings.RadarrModal.selectQualityProfile": "Wähle ein Qualitätsprofil",
+ "components.Settings.RadarrModal.selectRootFolder": "Wähle einen Stammordner",
"components.Settings.RadarrModal.server4k": "4K-Server",
"components.Settings.RadarrModal.servername": "Servername",
"components.Settings.RadarrModal.servernamePlaceholder": "Ein Radarr-Server",
@@ -128,14 +128,14 @@
"components.Settings.RadarrModal.testing": "Testen …",
"components.Settings.RadarrModal.toastRadarrTestFailure": "Verbindung zum Radarr-Server fehlgeschlagen",
"components.Settings.RadarrModal.toastRadarrTestSuccess": "Radarr-Verbindung hergestellt!",
- "components.Settings.RadarrModal.validationApiKeyRequired": "Sie müssen einen API-Schlüssel angeben",
- "components.Settings.RadarrModal.validationHostnameRequired": "Sie müssen einen Hostnamen/IP angeben",
- "components.Settings.RadarrModal.validationPortRequired": "Sie müssen einen Port angeben",
- "components.Settings.RadarrModal.validationProfileRequired": "Sie müssen ein Profil auswählen",
- "components.Settings.RadarrModal.validationRootFolderRequired": "Sie müssen einen Stammordner auswählen",
+ "components.Settings.RadarrModal.validationApiKeyRequired": "Du musst einen API-Schlüssel angeben",
+ "components.Settings.RadarrModal.validationHostnameRequired": "Du musst einen Hostnamen/IP angeben",
+ "components.Settings.RadarrModal.validationPortRequired": "Du musst einen Port angeben",
+ "components.Settings.RadarrModal.validationProfileRequired": "Du musst ein Profil auswählen",
+ "components.Settings.RadarrModal.validationRootFolderRequired": "Du musst einen Stammordner auswählen",
"components.Settings.SonarrModal.add": "Server hinzufügen",
"components.Settings.SonarrModal.apiKey": "API-Schlüssel",
- "components.Settings.SonarrModal.apiKeyPlaceholder": "Ihr Sonarr-API-Schlüssel",
+ "components.Settings.SonarrModal.apiKeyPlaceholder": "Dein Sonarr-API-Schlüssel",
"components.Settings.SonarrModal.baseUrl": "Basis-URL",
"components.Settings.SonarrModal.baseUrlPlaceholder": "Beispiel: /sonarr",
"components.Settings.SonarrModal.createsonarr": "Neuen Sonarr-Server erstellen",
@@ -147,22 +147,22 @@
"components.Settings.SonarrModal.rootfolder": "Stammordner",
"components.Settings.SonarrModal.save": "Änderungen speichern",
"components.Settings.SonarrModal.saving": "Speichern …",
- "components.Settings.SonarrModal.seasonfolders": "Staffelnordner",
- "components.Settings.SonarrModal.selectQualityProfile": "Wählen Sie ein Qualitätsprofil",
- "components.Settings.SonarrModal.selectRootFolder": "Wählen Sie einen Stammordner",
+ "components.Settings.SonarrModal.seasonfolders": "Staffel Ordner",
+ "components.Settings.SonarrModal.selectQualityProfile": "Wähle ein Qualitätsprofil",
+ "components.Settings.SonarrModal.selectRootFolder": "Wähle einen Stammordner",
"components.Settings.SonarrModal.server4k": "4K-Server",
"components.Settings.SonarrModal.servername": "Servername",
"components.Settings.SonarrModal.servernamePlaceholder": "Ein Sonarr-Server",
"components.Settings.SonarrModal.ssl": "SSL",
"components.Settings.SonarrModal.test": "Test",
"components.Settings.SonarrModal.testing": "Testen …",
- "components.Settings.SonarrModal.toastRadarrTestFailure": "Es konnte keine Verbindung zu Sonarr-Server hergestellt werden",
+ "components.Settings.SonarrModal.toastRadarrTestFailure": "Es konnte keine Verbindung zum Sonarr-Server hergestellt werden",
"components.Settings.SonarrModal.toastRadarrTestSuccess": "Sonarr-Verbindung hergestellt!",
- "components.Settings.SonarrModal.validationApiKeyRequired": "Sie müssen einen API-Schlüssel angeben",
- "components.Settings.SonarrModal.validationHostnameRequired": "Sie müssen einen Hostnamen/IP angeben",
- "components.Settings.SonarrModal.validationPortRequired": "Sie müssen einen Port angeben",
- "components.Settings.SonarrModal.validationProfileRequired": "Sie müssen ein Profil auswählen",
- "components.Settings.SonarrModal.validationRootFolderRequired": "Sie müssen einen Stammordner auswählen",
+ "components.Settings.SonarrModal.validationApiKeyRequired": "Du musst einen API-Schlüssel angeben",
+ "components.Settings.SonarrModal.validationHostnameRequired": "Du musst einen Hostnamen/IP angeben",
+ "components.Settings.SonarrModal.validationPortRequired": "Du musst einen Port angeben",
+ "components.Settings.SonarrModal.validationProfileRequired": "Du musst ein Profil auswählen",
+ "components.Settings.SonarrModal.validationRootFolderRequired": "Du musst einen Stammordner auswählen",
"components.Settings.activeProfile": "Aktives Profil",
"components.Settings.addradarr": "Radarr-Server hinzufügen",
"components.Settings.address": "Adresse",
@@ -170,44 +170,44 @@
"components.Settings.apikey": "API-Schlüssel",
"components.Settings.applicationurl": "Anwendungs-URL",
"components.Settings.cancelscan": "Scan abbrechen",
- "components.Settings.copied": "Kopierter API-Schlüssel in die Zwischenablage",
+ "components.Settings.copied": "API-Schlüssel in die Zwischenablage kopiert",
"components.Settings.currentlibrary": "Aktuelle Bibliothek: {name}",
"components.Settings.default": "Standardmäßig",
"components.Settings.default4k": "Standard-4K",
"components.Settings.delete": "Löschen",
- "components.Settings.deleteserverconfirm": "Sind Sie sicher, dass Sie diesen Server löschen möchten?",
+ "components.Settings.deleteserverconfirm": "Bist du sicher, dass du diesen Server löschen möchtest?",
"components.Settings.edit": "Bearbeiten",
"components.Settings.generalsettings": "Allgemeine Einstellungen",
"components.Settings.generalsettingsDescription": "Dies sind Einstellungen, die sich auf die allgemeine Overseerr-Konfiguration beziehen.",
"components.Settings.hostname": "Hostname/IP",
- "components.Settings.jobname": "Auftragsname",
+ "components.Settings.jobname": "Aufgabenname",
"components.Settings.librariesRemaining": "Verbleibende Bibliotheken: {count}",
"components.Settings.manualscan": "Manueller Bibliotheksscan",
"components.Settings.manualscanDescription": "Normalerweise wird dies nur einmal alle 24 Stunden ausgeführt. Overseerr überprüft die kürzlich hinzugefügten Plex-Server aggressiver. Wenn Sie Plex zum ersten Mal konfigurieren, wird ein einmaliger vollständiger manueller Bibliotheksscan empfohlen!",
"components.Settings.menuAbout": "Über",
"components.Settings.menuGeneralSettings": "Allgemeine Einstellungen",
- "components.Settings.menuJobs": "Anträge",
+ "components.Settings.menuJobs": "Aufgaben",
"components.Settings.menuLogs": "Protokolle",
"components.Settings.menuNotifications": "Benachrichtigungen",
"components.Settings.menuPlexSettings": "Plex",
"components.Settings.menuServices": "Dienste",
"components.Settings.nextexecution": "Nächste Ausführung",
"components.Settings.notificationsettings": "Benachrichtigungseinstellungen",
- "components.Settings.notificationsettingsDescription": "Hier können Sie auswählen, welche Arten von Benachrichtigungen gesendet werden sollen und über welche Arten von Diensten.",
+ "components.Settings.notificationsettingsDescription": "Hier kannst du auswählen, welche Arten von Benachrichtigungen gesendet werden sollen und über welche Arten von Diensten.",
"components.Settings.notrunning": "Nicht aktiv",
"components.Settings.plexlibraries": "Plex-Bibliotheken",
- "components.Settings.plexlibrariesDescription": "Die Bibliotheken-Overseerr sucht nach Titeln. Richten Sie Ihre Plex-Verbindungseinstellungen ein und speichern Sie sie, und klicken Sie auf die Schaltfläche unten, wenn keine aufgeführt sind.",
+ "components.Settings.plexlibrariesDescription": "Die Bibliotheken-Overseerr sucht nach Titeln. Richte deine Plex-Verbindungseinstellungen ein und speichere sie, klicke auf die Schaltfläche unten, wenn keine aufgeführt sind.",
"components.Settings.plexsettings": "Plex-Einstellungen",
- "components.Settings.plexsettingsDescription": "Konfigurieren Sie die Einstellungen für Ihren Plex-Server. Overseerr verwendet Ihren Plex-Server, um Ihre Bibliothek in regelmäßigen Abständen zu scannen und festzustellen, welche Inhalte verfügbar sind.",
+ "components.Settings.plexsettingsDescription": "Konfiguriere die Einstellungen für deinen Plex-Server. Overseerr verwendet den Plex-Server, um deine Bibliothek in regelmäßigen Abständen zu scannen und festzustellen, welche Inhalte verfügbar sind.",
"components.Settings.port": "Port",
- "components.Settings.radarrSettingsDescription": "Richten Sie unten Ihre Radarr-Verbindung ein. Sie können jederzeit mehrere, aber nur zwei standardmäßig aktiv haben (eine für Standard-HD und eine für 4K). Administratoren können überschreiben, welcher Server für neue Anforderungen verwendet wird.",
+ "components.Settings.radarrSettingsDescription": "Richte unten deine Radarr-Verbindung ein. Du kannst mehrere, aber nur zwei standardmäßig, aktiv haben (eine für Standard-HD und eine für 4K). Administratoren können überschreiben, welcher Server für neue Anfragen verwendet wird.",
"components.Settings.radarrsettings": "Radarr-Einstellungen",
"components.Settings.runnow": "Jetzt ausführen",
"components.Settings.save": "Änderungen speichern",
"components.Settings.saving": "Speichern …",
"components.Settings.servername": "Servername (Wird nach dem Speichern automatisch festgelegt)",
"components.Settings.servernamePlaceholder": "Plex-Servername",
- "components.Settings.sonarrSettingsDescription": "Richten Sie unten Ihre Sonarr-Verbindung ein. Sie können jederzeit mehrere, aber nur zwei standardmäßig aktiv haben (eine für Standard-HD und eine für 4K). Administratoren können überschreiben, welcher Server für neue Anforderungen verwendet wird.",
+ "components.Settings.sonarrSettingsDescription": "Richte unten deine Sonarr-Verbindung ein. Du kannst mehrere, aber nur zwei standardmäßig, aktiv haben (eine für Standard-HD und eine für 4K). Administratoren können überschreiben, welcher Server für neue Anfragen verwendet wird.",
"components.Settings.sonarrsettings": "Sonarr-Einstellungen",
"components.Settings.ssl": "SSL",
"components.Settings.startscan": "Scan starten",
@@ -219,69 +219,69 @@
"components.Setup.finish": "Konfiguration beenden",
"components.Setup.finishing": "Fertigstellung …",
"components.Setup.loginwithplex": "Anmeldung mit Plex",
- "components.Setup.signinMessage": "Melden Sie sich zunächst mit Ihrem Plex-Konto an",
+ "components.Setup.signinMessage": "Melde dich zunächst mit deinem Plex-Konto an",
"components.Setup.welcome": "Willkommen bei Overseerr",
"components.Slider.noresults": "Keine Ergebnisse",
"components.TitleCard.movie": "Film",
"components.TitleCard.tvshow": "Serie",
"components.TvDetails.approve": "Genehmigen",
- "components.TvDetails.approverequests": "{requestCount} {requestCount, plural, one {Request} other {Requests}} genehmigen",
+ "components.TvDetails.approverequests": "{requestCount} {requestCount, plural, one {Anfrage} other {Anfragen}} genehmigen",
"components.TvDetails.available": "Verfügbar",
- "components.TvDetails.cancelrequest": "Antrag abbrechen",
+ "components.TvDetails.cancelrequest": "Anfrage abbrechen",
"components.TvDetails.cast": "Besetzung",
"components.TvDetails.decline": "Ablehnen",
- "components.TvDetails.declinerequests": "{requestCount} {requestCount, plural, one {Request} andere {Requests}} ablehnen",
+ "components.TvDetails.declinerequests": "{requestCount} {requestCount, plural, one {Anfrage} andere {Anfragen}} ablehnen",
"components.TvDetails.manageModalClearMedia": "Alle Mediendaten löschen",
- "components.TvDetails.manageModalClearMediaWarning": "Dadurch werden alle Mediendaten einschließlich aller Anträge für dieses Element irreversibel entfernt. Wenn dieses Element in Ihrer Plex-Bibliothek vorhanden ist, werden die Medieninformationen bei der nächsten Synchronisierung neu erstellt.",
- "components.TvDetails.manageModalNoRequests": "Keine Anträge",
- "components.TvDetails.manageModalRequests": "Anträge",
- "components.TvDetails.manageModalTitle": "Serien verwalten",
+ "components.TvDetails.manageModalClearMediaWarning": "Dadurch werden alle Mediendaten einschließlich aller Anfragen für dieses Element irreversibel entfernt. Wenn dieses Element in deiner Plex-Bibliothek vorhanden ist, werden die Medieninformationen bei der nächsten Synchronisierung neu erstellt.",
+ "components.TvDetails.manageModalNoRequests": "Keine Anfragen",
+ "components.TvDetails.manageModalRequests": "Anfragen",
+ "components.TvDetails.manageModalTitle": "Serie verwalten",
"components.TvDetails.originallanguage": "Originalsprache",
"components.TvDetails.overview": "Übersicht",
"components.TvDetails.overviewunavailable": "Übersicht nicht verfügbar",
"components.TvDetails.pending": "Ausstehend",
"components.TvDetails.recommendations": "Empfehlungen",
- "components.TvDetails.recommendationssubtext": "Wenn Ihnen {title} gefallen hat, könnte Ihnen auch gefallen …",
- "components.TvDetails.request": "Antrag",
- "components.TvDetails.requestmore": "Mehr anfordern",
+ "components.TvDetails.recommendationssubtext": "Wenn dir {title} gefallen hat, könnte dir auch gefallen …",
+ "components.TvDetails.request": "Anfragen",
+ "components.TvDetails.requestmore": "Mehr anfragen",
"components.TvDetails.similar": "Ähnliche Serien",
- "components.TvDetails.similarsubtext": "Andere Serien {title} ähnlich",
+ "components.TvDetails.similarsubtext": "Andere Serien, die {title} ähneln",
"components.TvDetails.status": "Status",
"components.TvDetails.unavailable": "Nicht verfügbar",
"components.TvDetails.userrating": "Benutzerbewertung",
- "components.UserEdit.admin": "Administrator/in",
+ "components.UserEdit.admin": "Administrator",
"components.UserEdit.adminDescription": "Voller Administratorzugriff. Umgeht alle Berechtigungsprüfungen.",
"components.UserEdit.autoapprove": "Automatische Genehmigung",
- "components.UserEdit.autoapproveDescription": "Gewährt die automatische Genehmigung für alle Anträge dieses Benutzers.",
+ "components.UserEdit.autoapproveDescription": "Gewährt die automatische Genehmigung für alle Anfragen dieses Benutzers.",
"components.UserEdit.avatar": "Avatar",
- "components.UserEdit.edituser": "Benutzer/in bearbeiten",
+ "components.UserEdit.edituser": "Benutzer bearbeiten",
"components.UserEdit.email": "E-Mail",
- "components.UserEdit.managerequests": "Anträge verwalten",
- "components.UserEdit.managerequestsDescription": "Erteilt die Berechtigung zum Verwalten von Overseerr-Anträgen. Dies umfasst das Genehmigen und Ablehnen von Anträgen.",
+ "components.UserEdit.managerequests": "Anfragen verwalten",
+ "components.UserEdit.managerequestsDescription": "Erteilt die Berechtigung zum Verwalten von Overseerr-Anfragen. Dies umfasst das Genehmigen und Ablehnen von Anfragen.",
"components.UserEdit.permissions": "Berechtigungen",
- "components.UserEdit.request": "Antrag",
- "components.UserEdit.requestDescription": "Erteilt die Berechtigung zum Anfordern von Filmen und Serien.",
+ "components.UserEdit.request": "Anfragen",
+ "components.UserEdit.requestDescription": "Erteilt die Berechtigung zum Anfragen von Filmen und Serien.",
"components.UserEdit.save": "Speichern",
"components.UserEdit.saving": "Speichern …",
"components.UserEdit.settings": "Einstellungen verwalten",
- "components.UserEdit.settingsDescription": "Erteilt die Berechtigung zum Ändern aller Overseerr-Einstellungen. Ein/e Benutzer/in muss über diese Berechtigung verfügen, um sie anderen Personen erteilen zu können.",
- "components.UserEdit.userfail": "Beim Speichern des Benutzers ist ein Fehler aufgetreten.",
+ "components.UserEdit.settingsDescription": "Erteilt die Berechtigung zum Ändern aller Overseerr-Einstellungen. Ein Benutzer muss über diese Berechtigung verfügen, um sie anderen Benutzern erteilen zu können.",
+ "components.UserEdit.userfail": "Beim Speichern des Benutzers ist etwas schief gelaufen.",
"components.UserEdit.username": "Benutzername",
"components.UserEdit.users": "Benutzer verwalten",
- "components.UserEdit.usersDescription": "Erteilt die Berechtigung zum Verwalten von Overseerr-Benutzern. Benutzer/innen mit dieser Berechtigung können Benutzer/innen mit Administratorrechten nicht ändern oder gewähren.",
- "components.UserEdit.usersaved": "Benutzer/in gespeichert",
+ "components.UserEdit.usersDescription": "Erteilt die Berechtigung zum Verwalten von Overseerr-Benutzern. Benutzer mit dieser Berechtigung können Benutzer mit Administratorrechten nicht bearbeiten oder es gewähren.",
+ "components.UserEdit.usersaved": "Benutzer gespeichert",
"components.UserEdit.vote": "Abstimmen",
- "components.UserEdit.voteDescription": "Erteilt die Erlaubnis, über Anträge abzustimmen (Abstimmung noch nicht durchgeführt)",
+ "components.UserEdit.voteDescription": "Erteilt die Erlaubnis, über Anfragen abzustimmen (Abstimmungen noch nicht implementiert)",
"components.UserList.admin": "Admin",
"components.UserList.created": "Erstellt",
"components.UserList.delete": "Löschen",
"components.UserList.edit": "Bearbeiten",
"components.UserList.lastupdated": "Zuletzt aktualisiert",
- "components.UserList.plexuser": "Plex-Benutzer/in",
+ "components.UserList.plexuser": "Plex-Benutzer",
"components.UserList.role": "Rolle",
- "components.UserList.totalrequests": "Anträge insgesamt",
- "components.UserList.user": "Benutzer/in",
- "components.UserList.userlist": "Benutzer/innen-Liste",
+ "components.UserList.totalrequests": "Anfragen insgesamt",
+ "components.UserList.user": "Benutzer",
+ "components.UserList.userlist": "Benutzer-Liste",
"components.UserList.username": "Benutzername",
"components.UserList.usertype": "Benutzertyp",
"i18n.approve": "Genehmigen",
@@ -291,10 +291,10 @@
"i18n.decline": "Ablehnen",
"i18n.declined": "Abgelehnt",
"i18n.delete": "Löschen",
- "i18n.movies": "Films",
+ "i18n.movies": "Filme",
"i18n.partiallyavailable": "Teilweise verfügbar",
"i18n.pending": "Ausstehend",
- "i18n.processing": "Verarbeitung …",
+ "i18n.processing": "Verarbeiten …",
"i18n.tvshows": "Serien",
"i18n.unavailable": "Nicht verfügbar",
"pages.internalServerError": "{statusCode} – Interner Serverfehler",
@@ -302,62 +302,62 @@
"pages.pageNotFound": "404 – Seite nicht gefunden",
"pages.returnHome": "Zur Startseite",
"pages.serviceUnavailable": "{statusCode} – Dienst nicht verfügbar",
- "pages.somethingWentWrong": "{statusCode} – Es ist ein Fehler aufgetreten",
- "components.TvDetails.TvCast.fullseriescast": "Vollserienbesetzung",
- "components.MovieDetails.MovieCast.fullcast": "Vollständige Besetzung",
+ "pages.somethingWentWrong": "{statusCode} – Es ist etwas schief gelaufen",
+ "components.TvDetails.TvCast.fullseriescast": "Komplette Serien Besetzung",
+ "components.MovieDetails.MovieCast.fullcast": "Komplette Besetzung",
"components.Settings.Notifications.emailsettingssaved": "E-Mail-Benachrichtigungseinstellungen gespeichert!",
"components.Settings.Notifications.emailsettingsfailed": "Fehler beim Speichern der E-Mail-Benachrichtigungseinstellungen.",
"components.Settings.Notifications.discordsettingssaved": "Discord-Benachrichtigungseinstellungen gespeichert!",
"components.Settings.Notifications.discordsettingsfailed": "Fehler beim Speichern der Discord-Benachrichtigungseinstellungen.",
- "components.Settings.validationPortRequired": "Sie müssen einen Port angeben",
- "components.Settings.validationHostnameRequired": "Sie müssen einen Hostnamen/IP angeben",
- "components.Settings.SonarrModal.validationNameRequired": "Sie müssen einen Servernamen angeben",
+ "components.Settings.validationPortRequired": "Du musst einen Port angeben",
+ "components.Settings.validationHostnameRequired": "Du musst einen Hostnamen/IP angeben",
+ "components.Settings.SonarrModal.validationNameRequired": "Du musst einen Servernamen angeben",
"components.Settings.SettingsAbout.version": "Version",
- "components.Settings.SettingsAbout.totalrequests": "Anträge insgesamt",
+ "components.Settings.SettingsAbout.totalrequests": "Anfragen insgesamt",
"components.Settings.SettingsAbout.totalmedia": "Medien insgesamt",
"components.Settings.SettingsAbout.overseerrinformation": "Overseerr-Informationen",
"components.Settings.SettingsAbout.githubdiscussions": "GitHub-Diskussionen",
"components.Settings.SettingsAbout.gettingsupport": "Hilfe erhalten",
- "components.Settings.SettingsAbout.clickheretojoindiscord": "Klicken Sie hier, um unserem Discord-Server beizutreten.",
- "components.Settings.RadarrModal.validationNameRequired": "Sie müssen einen Servernamen angeben",
+ "components.Settings.SettingsAbout.clickheretojoindiscord": "Klicke hier, um unserem Discord-Server beizutreten.",
+ "components.Settings.RadarrModal.validationNameRequired": "Du musst einen Servernamen angeben",
"components.Setup.tip": "Tipp",
- "components.Setup.syncingbackground": "Die Synchronisierung wird im Hintergrund ausgeführt. Sie können die Konfiguration in der Zwischenzeit fortsetzen.",
+ "components.Setup.syncingbackground": "Die Synchronisierung wird im Hintergrund ausgeführt. Du kannst die Konfiguration in der Zwischenzeit fortsetzen.",
"i18n.deleting": "Löschen …",
- "components.UserList.userdeleteerror": "Beim Löschen des Benutzers ist ein Fehler aufgetreten",
+ "components.UserList.userdeleteerror": "Beim Löschen des Benutzers ist etwas schief gelaufen",
"components.UserList.userdeleted": "Benutzer gelöscht",
"components.UserList.deleteuser": "Benutzer löschen",
- "components.UserList.deleteconfirm": "Wollen Sie diesen Benutzer wirklich löschen? Alle vorhandenen Anforderungsdaten dieses Benutzers werden entfernt.",
- "components.Settings.nodefaultdescription": "Mindestens ein Server muss als Standard markiert sein, bevor Anforderungen an Ihre Dienste weitergeleitet werden.",
+ "components.UserList.deleteconfirm": "Willst du diesen Benutzer wirklich löschen? Alle vorhandenen Anfragendaten dieses Benutzers werden entfernt.",
+ "components.Settings.nodefaultdescription": "Mindestens ein Server muss als Standard markiert sein, bevor Anfragen an deine Dienste weitergeleitet werden.",
"components.Settings.nodefault": "Kein Standardserver ausgewählt!",
"components.Settings.no4kimplemented": "(Standard-4K-Server sind derzeit nicht implementiert.)",
- "components.Settings.SonarrModal.testFirstRootFolders": "Testen Sie Ihre Verbindung, um Stammordner zu laden",
- "components.Settings.SonarrModal.testFirstQualityProfiles": "Testen Sie Ihre Verbindung, um Qualitätsprofile zu laden",
- "components.Settings.SonarrModal.loadingrootfolders": "Laden von Stammordnern…",
- "components.Settings.SonarrModal.loadingprofiles": "Qualitätsprofile werden geladen…",
- "components.Settings.RadarrModal.validationMinimumAvailabilityRequired": "Sie müssen die Mindestverfügbarkeit auswählen",
- "components.Settings.RadarrModal.testFirstRootFolders": "Testen Sie Ihre Verbindung, um Stammordner zu laden",
- "components.Settings.RadarrModal.testFirstQualityProfiles": "Testen Sie Ihre Verbindung zu Lastqualitätsprofilen",
- "components.Settings.RadarrModal.loadingrootfolders": "Laden von Stammordnern…",
- "components.Settings.RadarrModal.loadingprofiles": "Qualitätsprofile werden geladen…",
+ "components.Settings.SonarrModal.testFirstRootFolders": "Teste die Verbindung, um Stammordner zu laden",
+ "components.Settings.SonarrModal.testFirstQualityProfiles": "Teste die Verbindung, um Qualitätsprofile zu laden",
+ "components.Settings.SonarrModal.loadingrootfolders": "Stammordner werden geladen …",
+ "components.Settings.SonarrModal.loadingprofiles": "Qualitätsprofile werden geladen …",
+ "components.Settings.RadarrModal.validationMinimumAvailabilityRequired": "Du musst die Mindestverfügbarkeit auswählen",
+ "components.Settings.RadarrModal.testFirstRootFolders": "Teste die Verbindung, um Stammordner zu laden",
+ "components.Settings.RadarrModal.testFirstQualityProfiles": "Teste die Verbindung, um Qualitätsprofile zu laden",
+ "components.Settings.RadarrModal.loadingrootfolders": "Stammordner werden geladen …",
+ "components.Settings.RadarrModal.loadingprofiles": "Qualitätsprofile werden geladen …",
"components.TvDetails.anime": "Anime",
"components.Settings.toastApiKeySuccess": "Neuer API-Schlüssel generiert!",
"components.TvDetails.showtype": "Serientyp",
"components.TvDetails.network": "Netzwerk",
"components.Settings.toastSettingsSuccess": "Einstellungen gespeichert.",
- "components.Settings.toastSettingsFailure": "Beim Speichern der Einstellungen ging etwas schief.",
- "components.Settings.toastApiKeyFailure": "Bei der Generierung eines neuen API-Schlüssels kam es zu einem Fehler.",
+ "components.Settings.toastSettingsFailure": "Beim Speichern der Einstellungen ist etwas schief gelaufen.",
+ "components.Settings.toastApiKeyFailure": "Bei der Generierung eines neuen API-Schlüssels ist etwas schief gelaufen.",
"components.Settings.SonarrModal.animerootfolder": "Animestammverzeichnis",
"components.Settings.SonarrModal.animequalityprofile": "Animequalitätsprofil",
"components.MovieDetails.studio": "Studio",
"i18n.close": "Schließen",
"components.Settings.SettingsAbout.timezone": "Zeitzone",
- "components.Settings.SettingsAbout.supportoverseerr": "Unterstützen Sie Overseerr",
- "components.Settings.SettingsAbout.helppaycoffee": "Helfen Sie uns, für Kaffee zu bezahlen",
- "components.Settings.SettingsAbout.Releases.viewongithub": "Ansicht auf GitHub",
+ "components.Settings.SettingsAbout.supportoverseerr": "Unterstütze Overseerr",
+ "components.Settings.SettingsAbout.helppaycoffee": "Hilf uns Kaffee zu bezahlen",
+ "components.Settings.SettingsAbout.Releases.viewongithub": "Auf GitHub anzeigen",
"components.Settings.SettingsAbout.Releases.viewchangelog": "Änderungsprotokoll anzeigen",
"components.Settings.SettingsAbout.Releases.versionChangelog": "Änderungsprotokoll",
- "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "Die Änderungen in Ihrer Version sind unten nicht verfügbar. Die neuesten Aktualisierungen finden Sie im
GitHub-Repository .",
- "components.Settings.SettingsAbout.Releases.runningDevelop": "Sie führen eine Entwicklungsversion von Overseerr aus!",
+ "components.Settings.SettingsAbout.Releases.runningDevelopMessage": "Die Änderungen in deiner Version sind unten nicht verfügbar. Die neuesten Aktualisierungen findest du im
GitHub-Repository .",
+ "components.Settings.SettingsAbout.Releases.runningDevelop": "Du führst eine Entwicklungsversion von Overseerr aus!",
"components.Settings.SettingsAbout.Releases.releases": "Veröffentlichungen",
"components.Settings.SettingsAbout.Releases.releasedataMissing": "Informationen der Version nicht verfügbar. Ist GitHub offline?",
"components.Settings.SettingsAbout.Releases.latestversion": "Neuste Version",
@@ -365,15 +365,31 @@
"components.Settings.Notifications.testsent": "Testbenachrichtigung gesendet!",
"components.Settings.Notifications.test": "Test",
"components.Settings.defaultPermissions": "Standardbenutzerberechtigungen",
- "components.UserList.importfromplexerror": "Beim Importieren von Benutzern aus Plex ist ein Fehler aufgetreten",
- "components.UserList.importfromplex": "Benutzer/innen aus Plex importieren",
- "components.TvDetails.viewfullcrew": "Volles Team anzeigen",
- "components.TvDetails.TvCrew.fullseriescrew": "Volles Serienteam",
+ "components.UserList.importfromplexerror": "Beim Importieren von Benutzern aus Plex ist etwas schief gelaufen",
+ "components.UserList.importfromplex": "Benutzer aus Plex importieren",
+ "components.TvDetails.viewfullcrew": "Komplettes Team anzeigen",
+ "components.TvDetails.TvCrew.fullseriescrew": "Komplettes Serien Team",
"components.PersonDetails.crewmember": "Teammitglied",
- "components.MovieDetails.viewfullcrew": "Volles Team anzeigen",
- "components.MovieDetails.MovieCrew.fullcrew": "Volles Team",
- "components.UserList.importedfromplex": "{userCount, plural, =0 {Keine neue Benutzer} one {# neuer Benutzer} other {# neue Benutzer}} aus Plex importiert",
- "components.TvDetails.firstAirDate": "Erster Sendetermin",
+ "components.MovieDetails.viewfullcrew": "Komplettes Team anzeigen",
+ "components.MovieDetails.MovieCrew.fullcrew": "Komplettes Team",
+ "components.UserList.importedfromplex": "{userCount, plural, =0 {Keine neuen Benutzer} one {# neuer Benutzer} other {# neue Benutzer}} aus Plex importiert",
+ "components.TvDetails.firstAirDate": "Erstausstrahlung",
"components.Settings.Notifications.ssldisabletip": "SSL sollte bei Standard-TLS-Verbindungen deaktiviert werden (Port 587)",
- "components.Settings.Notifications.allowselfsigned": "Selbstsignierte Zertifikate zulassen"
+ "components.Settings.Notifications.allowselfsigned": "Selbstsignierte Zertifikate zulassen",
+ "components.TvDetails.watchtrailer": "Trailer ansehen",
+ "components.MovieDetails.watchtrailer": "Trailer ansehen",
+ "components.MovieDetails.view": "Ansehen",
+ "components.CollectionDetails.requestswillbecreated": "Für die folgenden Titel werden Anfragen erstellt:",
+ "components.CollectionDetails.requesting": "Anfragen …",
+ "components.CollectionDetails.requestcollection": "Sammlung anfragen",
+ "components.CollectionDetails.requestSuccess": "
{title} erfolgreich angefragt!",
+ "components.CollectionDetails.request": "Anfragen",
+ "components.CollectionDetails.overviewunavailable": "Übersicht nicht verfügbar",
+ "components.CollectionDetails.overview": "Übersicht",
+ "components.CollectionDetails.numberofmovies": "Anzahl der Filme: {count}",
+ "components.CollectionDetails.movies": "Filme",
+ "i18n.requested": "Angefragt",
+ "i18n.retry": "Wiederholen",
+ "i18n.failed": "Fehlgeschlagen",
+ "components.RequestList.RequestItem.failedretry": "Beim Wiederholen der Anfrage ist etwas schief gelaufen"
}
diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json
index 19cb5083..d1065626 100644
--- a/src/i18n/locale/en.json
+++ b/src/i18n/locale/en.json
@@ -1,4 +1,13 @@
{
+ "components.CollectionDetails.movies": "Movies",
+ "components.CollectionDetails.numberofmovies": "Number of Movies: {count}",
+ "components.CollectionDetails.overview": "Overview",
+ "components.CollectionDetails.overviewunavailable": "Overview unavailable",
+ "components.CollectionDetails.request": "Request",
+ "components.CollectionDetails.requestSuccess": "
{title} successfully requested!",
+ "components.CollectionDetails.requestcollection": "Request Collection",
+ "components.CollectionDetails.requesting": "Requesting…",
+ "components.CollectionDetails.requestswillbecreated": "The following titles will have requests created for them:",
"components.Discover.discovermovies": "Popular Movies",
"components.Discover.discovertv": "Popular Series",
"components.Discover.nopending": "No Pending Requests",
@@ -47,8 +56,10 @@
"components.MovieDetails.studio": "Studio",
"components.MovieDetails.unavailable": "Unavailable",
"components.MovieDetails.userrating": "User Rating",
+ "components.MovieDetails.view": "View",
"components.MovieDetails.viewfullcrew": "View Full Crew",
"components.MovieDetails.viewrequest": "View Request",
+ "components.MovieDetails.watchtrailer": "Watch Trailer",
"components.PersonDetails.appearsin": "Appears in",
"components.PersonDetails.ascharacter": "as {character}",
"components.PersonDetails.crewmember": "Crew Member",
@@ -60,6 +71,7 @@
"components.RequestCard.all": "All",
"components.RequestCard.requestedby": "Requested by {username}",
"components.RequestCard.seasons": "Seasons",
+ "components.RequestList.RequestItem.failedretry": "Something went wrong retrying the request",
"components.RequestList.RequestItem.notavailable": "N/A",
"components.RequestList.RequestItem.requestedby": "Requested by {username}",
"components.RequestList.RequestItem.seasons": "Seasons",
@@ -92,6 +104,18 @@
"components.RequestModal.selectseason": "Select season(s)",
"components.RequestModal.status": "Status",
"components.Search.searchresults": "Search Results",
+ "components.Settings.Notifications.NotificationsSlack.agentenabled": "Agent Enabled",
+ "components.Settings.Notifications.NotificationsSlack.save": "Save Changes",
+ "components.Settings.Notifications.NotificationsSlack.saving": "Saving...",
+ "components.Settings.Notifications.NotificationsSlack.settingupslack": "Setting up Slack Notifications",
+ "components.Settings.Notifications.NotificationsSlack.settingupslackDescription": "To use Slack notifications, you will need to create an
Incoming Webhook integration and use the provided webhook URL below.",
+ "components.Settings.Notifications.NotificationsSlack.slacksettingsfailed": "Slack notification settings failed to save.",
+ "components.Settings.Notifications.NotificationsSlack.slacksettingssaved": "Slack notification settings saved!",
+ "components.Settings.Notifications.NotificationsSlack.test": "Test",
+ "components.Settings.Notifications.NotificationsSlack.testsent": "Test notification sent!",
+ "components.Settings.Notifications.NotificationsSlack.validationWebhookUrlRequired": "You must provide a webhook URL",
+ "components.Settings.Notifications.NotificationsSlack.webhookUrl": "Webhook URL",
+ "components.Settings.Notifications.NotificationsSlack.webhookUrlPlaceholder": "Webhook URL",
"components.Settings.Notifications.agentenabled": "Agent Enabled",
"components.Settings.Notifications.allowselfsigned": "Allow Self-Signed Certificates",
"components.Settings.Notifications.authPass": "Auth Pass",
@@ -313,10 +337,15 @@
"components.TvDetails.unavailable": "Unavailable",
"components.TvDetails.userrating": "User Rating",
"components.TvDetails.viewfullcrew": "View Full Crew",
+ "components.TvDetails.watchtrailer": "Watch Trailer",
"components.UserEdit.admin": "Admin",
"components.UserEdit.adminDescription": "Full administrator access. Bypasses all permission checks.",
"components.UserEdit.autoapprove": "Auto Approve",
"components.UserEdit.autoapproveDescription": "Grants auto approval for any requests made by this user.",
+ "components.UserEdit.autoapproveMovies": "Auto Approve Movies",
+ "components.UserEdit.autoapproveMoviesDescription": "Grants auto approve for movie requests made by this user.",
+ "components.UserEdit.autoapproveSeries": "Auto Approve Series",
+ "components.UserEdit.autoapproveSeriesDescription": "Grants auto approve for series requests made by this user.",
"components.UserEdit.avatar": "Avatar",
"components.UserEdit.edituser": "Edit User",
"components.UserEdit.email": "Email",
@@ -364,10 +393,13 @@
"i18n.declined": "Declined",
"i18n.delete": "Delete",
"i18n.deleting": "Deleting…",
+ "i18n.failed": "Failed",
"i18n.movies": "Movies",
"i18n.partiallyavailable": "Partially Available",
"i18n.pending": "Pending",
"i18n.processing": "Processing…",
+ "i18n.requested": "Requested",
+ "i18n.retry": "Retry",
"i18n.tvshows": "Series",
"i18n.unavailable": "Unavailable",
"pages.internalServerError": "{statusCode} - Internal Server Error",
diff --git a/src/i18n/locale/es.json b/src/i18n/locale/es.json
index 0bd7ba30..4f17588a 100644
--- a/src/i18n/locale/es.json
+++ b/src/i18n/locale/es.json
@@ -304,7 +304,7 @@
"components.Settings.menuJobs": "Tareas",
"components.Settings.menuGeneralSettings": "Ajustes Generales",
"components.Settings.menuAbout": "Acerca de",
- "components.Settings.manualscanDescription": "Normalmente, esto sólo se ejecutará una vez cada 6 horas. Overseerr comprobará de forma más agresiva los añadidos recientemente de su servidor Plex. ¡Si es la primera vez que configura Plex se recomienda un escaneo manual completo de la biblioteca!",
+ "components.Settings.manualscanDescription": "Normalmente, esto sólo se ejecutará una vez cada 24 horas. Overseerr comprobará de forma más agresiva los añadidos recientemente de su servidor Plex. ¡Si es la primera vez que configura Plex se recomienda un escaneo manual completo de la biblioteca!",
"components.Settings.manualscan": "Escaneo manual de biblioteca",
"components.Settings.librariesRemaining": "Bibliotecas restantes: {count}",
"components.Settings.hostname": "Nombre de host / IP",
@@ -364,5 +364,25 @@
"components.Settings.SettingsAbout.Releases.currentversion": "Versión Actual",
"components.Settings.Notifications.testsent": "¡Notificación de prueba enviada!",
"components.Settings.Notifications.test": "Comprobar",
- "components.MovieDetails.studio": "Estudio"
+ "components.MovieDetails.studio": "Estudio",
+ "components.UserList.importfromplexerror": "Algo salió mal importando usuarios de Plex",
+ "components.UserList.importfromplex": "Importar usuarios de Plex",
+ "components.UserList.importedfromplex": "{userCount, plural, =0 {Ningún} one {# Nuevo usuario} other {# Nuevos usuarios}} importado/s de Plex",
+ "components.TvDetails.viewfullcrew": "Ver Equipo Completo",
+ "components.TvDetails.firstAirDate": "Primera fecha de emisión",
+ "components.TvDetails.TvCrew.fullseriescrew": "Equipo completo de la serie",
+ "components.Settings.Notifications.ssldisabletip": "SSL debe estar deshabilitado en conexiones TLS estándar (puerto 587)",
+ "components.Settings.Notifications.allowselfsigned": "Permitir certificados autofirmados",
+ "components.PersonDetails.crewmember": "Miembro del Equipo",
+ "components.MovieDetails.viewfullcrew": "Ver Equipo Completo",
+ "components.MovieDetails.MovieCrew.fullcrew": "Equipo Completo",
+ "components.CollectionDetails.requestswillbecreated": "Los siguientes títulos tendrán solicitudes creadas para ellos:",
+ "components.CollectionDetails.requesting": "Solicitando…",
+ "components.CollectionDetails.requestcollection": "Solicitar Colección",
+ "components.CollectionDetails.requestSuccess": "
{title} solicitado correctamente!",
+ "components.CollectionDetails.request": "Solicitar",
+ "components.CollectionDetails.overviewunavailable": "Resumen no disponible",
+ "components.CollectionDetails.overview": "Resumen",
+ "components.CollectionDetails.numberofmovies": "Número de películas: {count}",
+ "components.CollectionDetails.movies": "Películas"
}
diff --git a/src/i18n/locale/fr.json b/src/i18n/locale/fr.json
index 665cf7fa..297f48a7 100644
--- a/src/i18n/locale/fr.json
+++ b/src/i18n/locale/fr.json
@@ -375,5 +375,18 @@
"components.MovieDetails.MovieCrew.fullcrew": "Équipe complète",
"components.TvDetails.firstAirDate": "Date de première diffusion",
"components.Settings.Notifications.ssldisabletip": "Le SSL doit être désactivé sur les connexions TLS standard (Port 587)",
- "components.Settings.Notifications.allowselfsigned": "Autoriser les certificats autosignés"
+ "components.Settings.Notifications.allowselfsigned": "Autoriser les certificats autosignés",
+ "components.TvDetails.watchtrailer": "Regarder la bande-annonce",
+ "components.MovieDetails.watchtrailer": "Regarder la bande-annonce",
+ "components.MovieDetails.view": "Voir",
+ "components.CollectionDetails.requestswillbecreated": "Des demandes seront créées pour les titres suivants :",
+ "components.CollectionDetails.requesting": "Demande en cours…",
+ "components.CollectionDetails.requestcollection": "Demander une collection",
+ "components.CollectionDetails.requestSuccess": "
{title} demandé avec succès !",
+ "components.CollectionDetails.request": "Demander",
+ "components.CollectionDetails.overviewunavailable": "Résumé indisponible",
+ "components.CollectionDetails.overview": "Résumé",
+ "components.CollectionDetails.numberofmovies": "Nombre de films : {count}",
+ "components.CollectionDetails.movies": "Films",
+ "i18n.requested": "Demandé"
}
diff --git a/src/i18n/locale/it.json b/src/i18n/locale/it.json
index 959dddbb..7f3818f4 100644
--- a/src/i18n/locale/it.json
+++ b/src/i18n/locale/it.json
@@ -108,7 +108,7 @@
"components.UserEdit.saving": "Salvataggio…",
"components.UserEdit.save": "Salva",
"components.UserEdit.usersaved": "Utente salvato",
- "components.UserEdit.usersDescription": "Concede l'autorizzazione per gestire gli utenti di Overseerr. Gli utenti con questa autorizzazione non possono modificare gli utenti con privilegi di amministratore o concederla.",
+ "components.UserEdit.usersDescription": "Concede l'autorizzazione per gestire gli utenti di Overseerr. Gli utenti con questa autorizzazione non possono modificare gli utenti con privilegi di amministratore, né concederli.",
"components.UserEdit.users": "Gestisci gli utenti",
"components.UserEdit.username": "Nome utente",
"components.UserList.deleteconfirm": "Eliminare l'utente? Tutti i dati di richiesta esistenti da questo utente verranno rimossi.",
@@ -293,14 +293,14 @@
"components.RequestModal.requestseasons": "Richiedi {seasonCount} {seasonCount, plural, one {Season} other {Seasons}}",
"components.RequestList.showingresults": "Visualizzazione dei risultati da
{from} a
{to} di
{total} ",
"components.UserEdit.userfail": "Qualcosa è andato storto salvando l'utente.",
- "components.UserEdit.requestDescription": "Concede l'autorizzazione per richiedere film e serie.",
+ "components.UserEdit.requestDescription": "Concede il permesso di richiedere film e serie.",
"components.UserEdit.request": "Richiesta",
"components.UserEdit.permissions": "Autorizzazioni",
- "components.UserEdit.managerequestsDescription": "Concede l'autorizzazione per gestire le richieste Overseerr. Ciò include l'approvazione e la negazione delle richieste.",
+ "components.UserEdit.managerequestsDescription": "Concede il permesso di gestire le richieste di Overseerr. Ciò include l'approvazione e la negazione delle richieste.",
"components.UserEdit.managerequests": "Gestisci le richieste",
"components.UserEdit.autoapproveDescription": "Concede l'approvazione automatica per tutte le richieste effettuate da questo utente.",
"components.UserEdit.autoapprove": "Approvazione automatica",
- "components.UserEdit.adminDescription": "Accesso completo all'amministratore. Ignora tutti i controlli delle autorizzazioni.",
+ "components.UserEdit.adminDescription": "Accesso amministratore completo. Bypassa tutti gli altri permessi.",
"components.UserEdit.admin": "Amministratore",
"components.TvDetails.userrating": "Voto pubblico",
"components.TvDetails.unavailable": "Non disponibile",
@@ -322,7 +322,7 @@
"components.Settings.jobname": "Nome Task",
"components.UserEdit.voteDescription": "Concede il permesso di votare sulle richieste (sistema di voto non acora implementato)",
"components.UserEdit.vote": "Vota",
- "components.UserEdit.settingsDescription": "Concede l'autorizzazione a modificare tutte le impostazioni di Overseerr. Un utente deve disporre di questa autorizzazione per concederla ad altri.",
+ "components.UserEdit.settingsDescription": "Permette di modificare tutte le impostazioni di Overseerr. Un utente deve avere questa autorizzazione per poterla concedere ad altri.",
"components.TvDetails.manageModalClearMediaWarning": "Questo rimuoverà tutti i dati, incluse le richieste per questo elemento in modo irreversibile. Se questo elemento esiste nella tua libreria di Plex, i dati verranno ricreati alla prossima sincronizzazione.",
"components.Setup.syncingbackground": "La sincronizzazione verrà eseguita in background. Nel frattempo puoi continuare il processo di configurazione.",
"components.Setup.signinMessage": "Comincia accedendo con il tuo account Plex",
@@ -364,7 +364,7 @@
"components.Settings.SettingsAbout.Releases.currentversion": "Versione attuale",
"components.Settings.Notifications.testsent": "Notifica di prova inviata!",
"components.Settings.Notifications.test": "Test",
- "components.Settings.defaultPermissions": "Autorizzazioni utente predefinite",
+ "components.Settings.defaultPermissions": "Autorizzazioni predefinite per nuovi utenti",
"components.UserList.importfromplexerror": "Qualcosa è andato storto durante l'importazione degli utenti da Plex",
"components.UserList.importfromplex": "Importa utenti da Plex",
"components.UserList.importedfromplex": "{userCount, plural, =0 {Nessun utente importato} one {# nuovo utente importato} other {# nuovi utenti importati}} da Plex",
@@ -374,5 +374,19 @@
"components.MovieDetails.MovieCrew.fullcrew": "Troupe completa",
"components.MovieDetails.viewfullcrew": "Vedi troupe completa",
"components.Settings.Notifications.ssldisabletip": "SSL dovrebbe essere disabilitato sulle connessioni standard TLS (Porta 587)",
- "components.Settings.Notifications.allowselfsigned": "Consenti i certificati autofirmati"
+ "components.Settings.Notifications.allowselfsigned": "Consenti i certificati autofirmati",
+ "components.TvDetails.firstAirDate": "Prima data di messa in onda",
+ "components.CollectionDetails.requestswillbecreated": "Per i titoli seguenti verranno create richieste:",
+ "components.CollectionDetails.requesting": "Richiesta in corso…",
+ "components.CollectionDetails.requestcollection": "Richiedi raccolta",
+ "components.CollectionDetails.requestSuccess": "
{titolo} richiesto con successo!",
+ "components.CollectionDetails.request": "Richiedi",
+ "components.CollectionDetails.overviewunavailable": "Trama non disponibile",
+ "components.CollectionDetails.overview": "Trama",
+ "components.CollectionDetails.numberofmovies": "Numero di film: {count}",
+ "components.CollectionDetails.movies": "Film",
+ "components.TvDetails.watchtrailer": "Guarda il trailer",
+ "components.MovieDetails.watchtrailer": "Guarda il trailer",
+ "components.MovieDetails.view": "Visualizza",
+ "i18n.requested": "Richiesto"
}
diff --git a/src/i18n/locale/ja.json b/src/i18n/locale/ja.json
index 0d50e814..e939bec4 100644
--- a/src/i18n/locale/ja.json
+++ b/src/i18n/locale/ja.json
@@ -183,7 +183,7 @@
"components.Settings.jobname": "ジョブ名",
"components.Settings.librariesRemaining": "残りのライブラリー: {count}",
"components.Settings.manualscan": "手動ライブラリースキャン",
- "components.Settings.manualscanDescription": "通常は6時間に一度しか実行されません。Overseerr は、Plex サーバーの最近追加されたフォルダをより頻繁にチェックします。初めて Plex を設定する場合は、一度手動でライブラリーをスキャンすることをお勧めします。",
+ "components.Settings.manualscanDescription": "通常は24時間に一度しか実行されません。Overseerr は、Plex サーバーの最近追加されたフォルダをより頻繁にチェックします。初めて Plex を設定する場合は、一度手動でライブラリーをスキャンすることをお勧めします。",
"components.Settings.menuAbout": "Overseerrについて",
"components.Settings.menuGeneralSettings": "一般設定",
"components.Settings.menuJobs": "ジョブ",
@@ -365,5 +365,28 @@
"components.Settings.SettingsAbout.Releases.latestversion": "最新バージョン",
"components.Settings.SettingsAbout.Releases.currentversion": "現在のバージョン",
"components.Settings.Notifications.testsent": "テスト通知が送信されました。",
- "components.MovieDetails.MovieCrew.fullcrew": "フルクルー"
+ "components.MovieDetails.MovieCrew.fullcrew": "フルクルー",
+ "components.MovieDetails.viewfullcrew": "フルクルーを表示",
+ "components.CollectionDetails.requestswillbecreated": "以下のタイトルをリクエストします。",
+ "components.CollectionDetails.requesting": "リクエスト中…",
+ "components.CollectionDetails.requestcollection": "リクエストコレクション",
+ "components.CollectionDetails.requestSuccess": "
{title} をリクエストしました!",
+ "components.CollectionDetails.request": "リクエスト",
+ "components.CollectionDetails.overviewunavailable": "ストーリー情報ありません",
+ "components.CollectionDetails.overview": "ストーリー",
+ "components.CollectionDetails.numberofmovies": "作品数: {count}",
+ "components.CollectionDetails.movies": "映画",
+ "i18n.requested": "リクエスト済み",
+ "components.TvDetails.watchtrailer": "予告編を見る",
+ "components.MovieDetails.watchtrailer": "予告編を見る",
+ "components.MovieDetails.view": "表示",
+ "components.UserList.importfromplexerror": "Plexからユーザーをインポート中に問題が発生しました",
+ "components.UserList.importfromplex": "Plexからユーザーをインポート",
+ "components.UserList.importedfromplex": "Plexから{userCount, plural, =0 {新ユーザーはインポートされませんでした。} one {新ユーザー #名をインポートしました。} other {新ユーザー #名をインポートしました。}}",
+ "components.TvDetails.viewfullcrew": "フルクルーを表示",
+ "components.TvDetails.firstAirDate": "初放送日",
+ "components.TvDetails.TvCrew.fullseriescrew": "フルシリーズクルー",
+ "components.Settings.Notifications.ssldisabletip": "標準TLS接続(ポート587)ではSSLを無効にすることをおすすめします。",
+ "components.Settings.Notifications.allowselfsigned": "自己署名証明書を許可する",
+ "components.PersonDetails.crewmember": "クルーメンバー"
}
diff --git a/src/pages/collection/[collectionId]/index.tsx b/src/pages/collection/[collectionId]/index.tsx
new file mode 100644
index 00000000..e4a9073c
--- /dev/null
+++ b/src/pages/collection/[collectionId]/index.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { GetServerSideProps, NextPage } from 'next';
+import type { Collection } from '../../../../server/models/Collection';
+import axios from 'axios';
+import { parseCookies } from 'nookies';
+import CollectionDetails from '../../../components/CollectionDetails';
+
+interface CollectionPageProps {
+ collection?: Collection;
+}
+
+const CollectionPage: NextPage
= ({ collection }) => {
+ return ;
+};
+
+export const getServerSideProps: GetServerSideProps = async (
+ ctx
+) => {
+ const cookies = parseCookies(ctx);
+ const response = await axios.get(
+ `http://localhost:${process.env.PORT || 5055}/api/v1/collection/${
+ ctx.query.collectionId
+ }${cookies.locale ? `?language=${cookies.locale}` : ''}`,
+ {
+ headers: ctx.req?.headers?.cookie
+ ? { cookie: ctx.req.headers.cookie }
+ : undefined,
+ }
+ );
+
+ return {
+ props: {
+ collection: response.data,
+ },
+ };
+};
+
+export default CollectionPage;
diff --git a/src/pages/settings/notifications/slack.tsx b/src/pages/settings/notifications/slack.tsx
new file mode 100644
index 00000000..bee2e813
--- /dev/null
+++ b/src/pages/settings/notifications/slack.tsx
@@ -0,0 +1,17 @@
+import { NextPage } from 'next';
+import React from 'react';
+import NotificationsSlack from '../../../components/Settings/Notifications/NotificationsSlack';
+import SettingsLayout from '../../../components/Settings/SettingsLayout';
+import SettingsNotifications from '../../../components/Settings/SettingsNotifications';
+
+const NotificationsSlackPage: NextPage = () => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default NotificationsSlackPage;
diff --git a/yarn.lock b/yarn.lock
index 47865d02..a941d705 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6114,6 +6114,13 @@ file-entry-cache@^6.0.0:
dependencies:
flat-cache "^3.0.4"
+file-stream-rotator@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz#868a2e5966f7640a17dd86eda0e4467c089f6286"
+ integrity sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ==
+ dependencies:
+ moment "^2.11.2"
+
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
@@ -9050,7 +9057,7 @@ moment-timezone@^0.5.31:
dependencies:
moment ">= 2.9.0"
-"moment@>= 2.9.0":
+"moment@>= 2.9.0", moment@^2.11.2:
version "2.29.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
@@ -9828,7 +9835,7 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
-object-hash@^2.0.3:
+object-hash@^2.0.1, object-hash@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
@@ -14157,7 +14164,17 @@ widest-line@^3.1.0:
dependencies:
string-width "^4.0.0"
-winston-transport@^4.4.0:
+winston-daily-rotate-file@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/winston-daily-rotate-file/-/winston-daily-rotate-file-4.5.0.tgz#3914ac57c4bdae1138170bec85af0c2217b253b1"
+ integrity sha512-/HqeWiU48dzGqcrABRlxYWVMdL6l3uKCtFSJyrqK+E2rLnSFNsgYpvwx15EgTitBLNzH69lQd/+z2ASryV2aqw==
+ dependencies:
+ file-stream-rotator "^0.5.7"
+ object-hash "^2.0.1"
+ triple-beam "^1.3.0"
+ winston-transport "^4.2.0"
+
+winston-transport@^4.2.0, winston-transport@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59"
integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==