diff --git a/src/components/NotificationTypeSelector/index.tsx b/src/components/NotificationTypeSelector/index.tsx index b6591edcd..c84631671 100644 --- a/src/components/NotificationTypeSelector/index.tsx +++ b/src/components/NotificationTypeSelector/index.tsx @@ -5,15 +5,17 @@ import NotificationType from './NotificationType'; const messages = defineMessages({ mediarequested: 'Media Requested', mediarequestedDescription: - 'Sends a notification when new media is requested. For certain agents, this will only send the notification to admins or users with the "Manage Requests" permission.', + 'Sends a notification when media is requested and requires approval.', mediaapproved: 'Media Approved', - mediaapprovedDescription: 'Sends a notification when media is approved.', + mediaapprovedDescription: + 'Sends a notification when media is approved.\ + By default, automatically approved requests will not trigger notifications.', mediaavailable: 'Media Available', mediaavailableDescription: 'Sends a notification when media becomes available.', mediafailed: 'Media Failed', mediafailedDescription: - 'Sends a notification when media fails to be added to services (Radarr/Sonarr). For certain agents, this will only send the notification to admins or users with the "Manage Requests" permission.', + 'Sends a notification when media fails to be added to Radarr or Sonarr.', mediadeclined: 'Media Declined', mediadeclinedDescription: 'Sends a notification when a request is declined.', }); diff --git a/src/components/PermissionEdit/index.tsx b/src/components/PermissionEdit/index.tsx index 86faa7e20..2f856e1a2 100644 --- a/src/components/PermissionEdit/index.tsx +++ b/src/components/PermissionEdit/index.tsx @@ -6,7 +6,7 @@ import { useIntl, defineMessages } from 'react-intl'; export const messages = defineMessages({ admin: 'Admin', adminDescription: - 'Full administrator access. Bypasses all permission checks.', + 'Full administrator access. Bypasses all other permission checks.', users: 'Manage Users', usersDescription: 'Grants permission to manage Overseerr users. Users with this permission cannot modify users with or grant the Admin privilege.', diff --git a/src/components/Settings/Notifications/NotificationsDiscord.tsx b/src/components/Settings/Notifications/NotificationsDiscord.tsx index 25f7d813b..fcd67943b 100644 --- a/src/components/Settings/Notifications/NotificationsDiscord.tsx +++ b/src/components/Settings/Notifications/NotificationsDiscord.tsx @@ -15,7 +15,7 @@ const messages = defineMessages({ agentenabled: 'Enable Agent', webhookUrl: 'Webhook URL', webhookUrlPlaceholder: 'Server Settings → Integrations → Webhooks', - discordsettingssaved: 'Discord notification settings saved!', + discordsettingssaved: 'Discord notification settings saved successfully!', discordsettingsfailed: 'Discord notification settings failed to save.', testsent: 'Test notification sent!', test: 'Test', diff --git a/src/components/Settings/Notifications/NotificationsEmail.tsx b/src/components/Settings/Notifications/NotificationsEmail.tsx index f7080afa8..ad9313f17 100644 --- a/src/components/Settings/Notifications/NotificationsEmail.tsx +++ b/src/components/Settings/Notifications/NotificationsEmail.tsx @@ -8,6 +8,7 @@ import axios from 'axios'; import * as Yup from 'yup'; import { useToasts } from 'react-toast-notifications'; import NotificationTypeSelector from '../../NotificationTypeSelector'; +import Alert from '../../Common/Alert'; const messages = defineMessages({ save: 'Save Changes', @@ -21,7 +22,7 @@ const messages = defineMessages({ enableSsl: 'Enable SSL', authUser: 'SMTP Username', authPass: 'SMTP Password', - emailsettingssaved: 'Email notification settings saved!', + emailsettingssaved: 'Email notification settings saved successfully!', emailsettingsfailed: 'Email notification settings failed to save.', test: 'Test', testsent: 'Test notification sent!', @@ -31,6 +32,10 @@ const messages = defineMessages({ senderName: 'Sender Name', notificationtypes: 'Notification Types', validationEmail: 'You must provide a valid email address', + emailNotificationTypesAlert: 'Notification Email Recipients', + emailNotificationTypesAlertDescription: + 'For the "Media Requested" and "Media Failed" notification types,\ + notifications will only be sent to users with the "Manage Requests" permission.', }); const NotificationsEmail: React.FC = () => { @@ -124,180 +129,193 @@ const NotificationsEmail: React.FC = () => { }; return ( -
-
- -
- -
-
-
- -
-
- + <> + + {intl.formatMessage( + messages.emailNotificationTypesAlertDescription + )} + + +
+ +
+
- {errors.emailFrom && touched.emailFrom && ( -
{errors.emailFrom}
- )}
-
-
- -
-
- +
+ +
+
+ +
+ {errors.emailFrom && touched.emailFrom && ( +
{errors.emailFrom}
+ )}
-
-
- -
-
- +
+ +
+
+ +
- {errors.smtpHost && touched.smtpHost && ( -
{errors.smtpHost}
- )}
-
-
- -
-
- +
+ +
+
+ +
+ {errors.smtpHost && touched.smtpHost && ( +
{errors.smtpHost}
+ )}
- {errors.smtpPort && touched.smtpPort && ( -
{errors.smtpPort}
- )} -
-
-
- -
-
-
-
- -
- +
+ +
+
+ +
+ {errors.smtpPort && touched.smtpPort && ( +
{errors.smtpPort}
+ )} +
-
-
- -
-
- +
+ +
+
-
-
- -
-
+
+ +
-
-
- - {intl.formatMessage(messages.notificationtypes)} - +
-
- setFieldValue('types', newTypes)} +
+ +
+
+
+
+ +
+
+
-
-
-
- - - - - - + testSettings(); + }} + > + {intl.formatMessage(messages.test)} + + + + + +
-
- + + ); }} diff --git a/src/components/Settings/Notifications/NotificationsPushbullet/index.tsx b/src/components/Settings/Notifications/NotificationsPushbullet/index.tsx index 9a44e0eb0..5fbc053e5 100644 --- a/src/components/Settings/Notifications/NotificationsPushbullet/index.tsx +++ b/src/components/Settings/Notifications/NotificationsPushbullet/index.tsx @@ -15,14 +15,15 @@ const messages = defineMessages({ saving: 'Saving…', agentEnabled: 'Enable Agent', accessToken: 'Access Token', - validationAccessTokenRequired: 'You must provide an access token.', - pushbulletSettingsSaved: 'Pushbullet notification settings saved!', + validationAccessTokenRequired: 'You must provide an access token', + pushbulletSettingsSaved: + 'Pushbullet notification settings saved successfully!', pushbulletSettingsFailed: 'Pushbullet notification settings failed to save.', testSent: 'Test notification sent!', test: 'Test', settingUpPushbullet: 'Setting Up Pushbullet Notifications', settingUpPushbulletDescription: - 'To configure Pushbullet notifications, you need to create an access token and enter it below.', + 'To configure Pushbullet notifications, you will need to create an access token and enter it below.', notificationTypes: 'Notification Types', }); diff --git a/src/components/Settings/Notifications/NotificationsPushover/index.tsx b/src/components/Settings/Notifications/NotificationsPushover/index.tsx index b89f21579..f86746d0b 100644 --- a/src/components/Settings/Notifications/NotificationsPushover/index.tsx +++ b/src/components/Settings/Notifications/NotificationsPushover/index.tsx @@ -14,19 +14,19 @@ const messages = defineMessages({ save: 'Save Changes', saving: 'Saving…', agentenabled: 'Enable Agent', - accessToken: 'Access Token', - userToken: 'User Token', - validationAccessTokenRequired: 'You must provide an access token.', - validationUserTokenRequired: 'You must provide a user token.', - pushoversettingssaved: 'Pushover notification settings saved!', + accessToken: 'Application/API Token', + userToken: 'User Key', + validationAccessTokenRequired: 'You must provide a valid application token', + validationUserTokenRequired: 'You must provide a valid user key', + pushoversettingssaved: 'Pushover notification settings saved successfully!', pushoversettingsfailed: 'Pushover notification settings failed to save.', testsent: 'Test notification sent!', test: 'Test', settinguppushover: 'Setting Up Pushover Notifications', settinguppushoverDescription: - 'To configure Pushover notifications, you need to register an application and get the access token.\ - When setting up the application, you can use one of the icons in the public folder on GitHub.\ - You also need the Pushover user token, which can be found on the start page when you log in.', + 'To configure Pushover notifications, you will need to register an application and enter the API key below.\ + (You can use one of our official icons on GitHub.)\ + You will need also need your user key.', notificationtypes: 'Notification Types', }); @@ -38,12 +38,18 @@ const NotificationsPushover: React.FC = () => { ); const NotificationsPushoverSchema = Yup.object().shape({ - accessToken: Yup.string().required( - intl.formatMessage(messages.validationAccessTokenRequired) - ), - userToken: Yup.string().required( - intl.formatMessage(messages.validationUserTokenRequired) - ), + accessToken: Yup.string() + .required(intl.formatMessage(messages.validationAccessTokenRequired)) + .matches( + /^a[A-Za-z0-9]{29}$/, + intl.formatMessage(messages.validationAccessTokenRequired) + ), + userToken: Yup.string() + .required(intl.formatMessage(messages.validationUserTokenRequired)) + .matches( + /^[ug][A-Za-z0-9]{29}$/, + intl.formatMessage(messages.validationUserTokenRequired) + ), }); if (!data && !error) { diff --git a/src/components/Settings/Notifications/NotificationsSlack/index.tsx b/src/components/Settings/Notifications/NotificationsSlack/index.tsx index 1091be71d..98b66adb5 100644 --- a/src/components/Settings/Notifications/NotificationsSlack/index.tsx +++ b/src/components/Settings/Notifications/NotificationsSlack/index.tsx @@ -15,8 +15,7 @@ const messages = defineMessages({ saving: 'Saving…', agentenabled: 'Enable Agent', webhookUrl: 'Webhook URL', - webhookUrlPlaceholder: 'Webhook URL', - slacksettingssaved: 'Slack notification settings saved!', + slacksettingssaved: 'Slack notification settings saved successfully!', slacksettingsfailed: 'Slack notification settings failed to save.', testsent: 'Test notification sent!', test: 'Test', @@ -131,14 +130,7 @@ const NotificationsSlack: React.FC = () => {
- +
{errors.webhookUrl && touched.webhookUrl && (
{errors.webhookUrl}
diff --git a/src/components/Settings/Notifications/NotificationsTelegram.tsx b/src/components/Settings/Notifications/NotificationsTelegram.tsx index 737db9847..bc626fd55 100644 --- a/src/components/Settings/Notifications/NotificationsTelegram.tsx +++ b/src/components/Settings/Notifications/NotificationsTelegram.tsx @@ -14,19 +14,19 @@ const messages = defineMessages({ save: 'Save Changes', saving: 'Saving…', agentenabled: 'Enable Agent', - botAPI: 'Bot API', + botAPI: 'Bot Authentication Token', chatId: 'Chat ID', - validationBotAPIRequired: 'You must provide a Bot API key.', - validationChatIdRequired: 'You must provide a Chat ID.', - telegramsettingssaved: 'Telegram notification settings saved!', + validationBotAPIRequired: 'You must provide a bot authentication token', + validationChatIdRequired: 'You must provide a valid chat ID', + telegramsettingssaved: 'Telegram notification settings saved successfully!', telegramsettingsfailed: 'Telegram notification settings failed to save.', testsent: 'Test notification sent!', test: 'Test', settinguptelegram: 'Setting Up Telegram Notifications', settinguptelegramDescription: - 'To configure Telegram notifications, you need to create a bot and get the bot API key.\ - Additionally, you need the chat ID for the chat where you would like the bot to send notifications.\ - You can get this by adding @get_id_bot to the chat or group chat.', + 'To configure Telegram notifications, you will need to create a bot and get the bot API key.\ + Additionally, you will need the chat ID for the chat to which you would like to send notifications.\ + You can get this by adding @get_id_bot to the chat.', notificationtypes: 'Notification Types', sendSilently: 'Send Silently', sendSilentlyTip: 'Send notifications with no sound', @@ -43,9 +43,9 @@ const NotificationsTelegram: React.FC = () => { botAPI: Yup.string().required( intl.formatMessage(messages.validationBotAPIRequired) ), - chatId: Yup.string().required( - intl.formatMessage(messages.validationChatIdRequired) - ), + chatId: Yup.string() + .required(intl.formatMessage(messages.validationChatIdRequired)) + .matches(/^\d+$/, intl.formatMessage(messages.validationChatIdRequired)), }); if (!data && !error) { diff --git a/src/components/Settings/Notifications/NotificationsWebhook/index.tsx b/src/components/Settings/Notifications/NotificationsWebhook/index.tsx index f8c9b9fe1..e1a63fca4 100644 --- a/src/components/Settings/Notifications/NotificationsWebhook/index.tsx +++ b/src/components/Settings/Notifications/NotificationsWebhook/index.tsx @@ -40,16 +40,15 @@ const messages = defineMessages({ agentenabled: 'Enable Agent', webhookUrl: 'Webhook URL', authheader: 'Authorization Header', - validationJsonPayloadRequired: 'You must provide a JSON Payload', - webhookUrlPlaceholder: 'Remote webhook URL', - webhooksettingssaved: 'Webhook notification settings saved!', + validationJsonPayloadRequired: 'You must provide a valid JSON payload', + webhooksettingssaved: 'Webhook notification settings saved successfully!', webhooksettingsfailed: 'Webhook notification settings failed to save.', testsent: 'Test notification sent!', test: 'Test', notificationtypes: 'Notification Types', - resetPayload: 'Reset to Default JSON Payload', - resetPayloadSuccess: 'JSON reset to default payload.', - customJson: 'Custom JSON Payload', + resetPayload: 'Reset to Default', + resetPayloadSuccess: 'JSON payload reset successfully!', + customJson: 'JSON Payload', templatevariablehelp: 'Template Variable Help', validationWebhookUrl: 'You must provide a valid URL', }); @@ -71,14 +70,18 @@ const NotificationsWebhook: React.FC = () => { ), jsonPayload: Yup.string() .required(intl.formatMessage(messages.validationJsonPayloadRequired)) - .test('validate-json', 'Invalid JSON', (value) => { - try { - JSON.parse(value ?? ''); - return true; - } catch (e) { - return false; + .test( + 'validate-json', + intl.formatMessage(messages.validationJsonPayloadRequired), + (value) => { + try { + JSON.parse(value ?? ''); + return true; + } catch (e) { + return false; + } } - }), + ), }); if (!data && !error) { @@ -173,14 +176,7 @@ const NotificationsWebhook: React.FC = () => {
- +
{errors.webhookUrl && touched.webhookUrl && (
{errors.webhookUrl}
diff --git a/src/components/Settings/SettingsNotifications.tsx b/src/components/Settings/SettingsNotifications.tsx index 0dd690ad8..d849eb647 100644 --- a/src/components/Settings/SettingsNotifications.tsx +++ b/src/components/Settings/SettingsNotifications.tsx @@ -25,10 +25,12 @@ const messages = defineMessages({ notificationAgentsSettings: 'Notification Agents', notificationAgentSettingsDescription: 'Choose the types of notifications to send, and which notification agents to use.', - notificationsettingssaved: 'Notification settings saved!', + notificationsettingssaved: 'Notification settings saved successfully!', notificationsettingsfailed: 'Notification settings failed to save.', enablenotifications: 'Enable Notifications', autoapprovedrequests: 'Enable Notifications for Automatic Approvals', + email: 'Email', + webhook: 'Webhook', }); interface SettingsRoute { @@ -38,107 +40,106 @@ interface SettingsRoute { regex: RegExp; } -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/, - }, - { - text: 'Telegram', - content: ( - - - Telegram - - ), - route: '/settings/notifications/telegram', - regex: /^\/settings\/notifications\/telegram/, - }, - { - text: 'Pushbullet', - content: ( - - - Pushbullet - - ), - route: '/settings/notifications/pushbullet', - regex: /^\/settings\/notifications\/pushbullet/, - }, - { - text: 'Pushover', - content: ( - - - Pushover - - ), - route: '/settings/notifications/pushover', - regex: /^\/settings\/notifications\/pushover/, - }, - { - text: 'Webhook', - content: ( - - - Webhook - - ), - route: '/settings/notifications/webhook', - regex: /^\/settings\/notifications\/webhook/, - }, -]; - const SettingsNotifications: React.FC = ({ children }) => { const router = useRouter(); const intl = useIntl(); const { addToast } = useToasts(); const { data, error, revalidate } = useSWR('/api/v1/settings/notifications'); - const activeLinkColor = 'bg-indigo-700'; + const settingsRoutes: SettingsRoute[] = [ + { + text: intl.formatMessage(messages.email), + content: ( + + + + + {intl.formatMessage(messages.email)} + + ), + route: '/settings/notifications/email', + regex: /^\/settings\/notifications\/email/, + }, + { + text: 'Discord', + content: ( + + + Discord + + ), + route: '/settings/notifications/discord', + regex: /^\/settings\/notifications\/discord/, + }, + { + text: 'Pushbullet', + content: ( + + + Pushbullet + + ), + route: '/settings/notifications/pushbullet', + regex: /^\/settings\/notifications\/pushbullet/, + }, + { + text: 'Pushover', + content: ( + + + Pushover + + ), + route: '/settings/notifications/pushover', + regex: /^\/settings\/notifications\/pushover/, + }, + { + text: 'Slack', + content: ( + + + Slack + + ), + route: '/settings/notifications/slack', + regex: /^\/settings\/notifications\/slack/, + }, + { + text: 'Telegram', + content: ( + + + Telegram + + ), + route: '/settings/notifications/telegram', + regex: /^\/settings\/notifications\/telegram/, + }, + { + text: intl.formatMessage(messages.webhook), + content: ( + + + {intl.formatMessage(messages.webhook)} + + ), + route: '/settings/notifications/webhook', + regex: /^\/settings\/notifications\/webhook/, + }, + ]; + const activeLinkColor = 'bg-indigo-700'; const inactiveLinkColor = 'bg-gray-800'; const SettingsLink: React.FC<{ diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 43632edbf..5c1fbaf56 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -88,17 +88,17 @@ "components.MovieDetails.viewfullcrew": "View Full Crew", "components.MovieDetails.watchtrailer": "Watch Trailer", "components.NotificationTypeSelector.mediaapproved": "Media Approved", - "components.NotificationTypeSelector.mediaapprovedDescription": "Sends a notification when media is approved.", + "components.NotificationTypeSelector.mediaapprovedDescription": "Sends a notification when media is approved. By default, automatically approved requests will not trigger notifications.", "components.NotificationTypeSelector.mediaavailable": "Media Available", "components.NotificationTypeSelector.mediaavailableDescription": "Sends a notification when media becomes available.", "components.NotificationTypeSelector.mediadeclined": "Media Declined", "components.NotificationTypeSelector.mediadeclinedDescription": "Sends a notification when a request is declined.", "components.NotificationTypeSelector.mediafailed": "Media Failed", - "components.NotificationTypeSelector.mediafailedDescription": "Sends a notification when media fails to be added to services (Radarr/Sonarr). For certain agents, this will only send the notification to admins or users with the \"Manage Requests\" permission.", + "components.NotificationTypeSelector.mediafailedDescription": "Sends a notification when media fails to be added to Radarr or Sonarr.", "components.NotificationTypeSelector.mediarequested": "Media Requested", - "components.NotificationTypeSelector.mediarequestedDescription": "Sends a notification when new media is requested. For certain agents, this will only send the notification to admins or users with the \"Manage Requests\" permission.", + "components.NotificationTypeSelector.mediarequestedDescription": "Sends a notification when media is requested and requires approval.", "components.PermissionEdit.admin": "Admin", - "components.PermissionEdit.adminDescription": "Full administrator access. Bypasses all permission checks.", + "components.PermissionEdit.adminDescription": "Full administrator access. Bypasses all other permission checks.", "components.PermissionEdit.advancedrequest": "Advanced Requests", "components.PermissionEdit.advancedrequestDescription": "Grants permission to use advanced request options (e.g., changing servers, profiles, or paths).", "components.PermissionEdit.autoapprove": "Auto-Approve", @@ -246,28 +246,28 @@ "components.Settings.Notifications.NotificationsPushbullet.agentEnabled": "Enable Agent", "components.Settings.Notifications.NotificationsPushbullet.notificationTypes": "Notification Types", "components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsFailed": "Pushbullet notification settings failed to save.", - "components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsSaved": "Pushbullet notification settings saved!", + "components.Settings.Notifications.NotificationsPushbullet.pushbulletSettingsSaved": "Pushbullet notification settings saved successfully!", "components.Settings.Notifications.NotificationsPushbullet.save": "Save Changes", "components.Settings.Notifications.NotificationsPushbullet.saving": "Saving…", "components.Settings.Notifications.NotificationsPushbullet.settingUpPushbullet": "Setting Up Pushbullet Notifications", - "components.Settings.Notifications.NotificationsPushbullet.settingUpPushbulletDescription": "To configure Pushbullet notifications, you need to create an access token and enter it below.", + "components.Settings.Notifications.NotificationsPushbullet.settingUpPushbulletDescription": "To configure Pushbullet notifications, you will need to create an access token and enter it below.", "components.Settings.Notifications.NotificationsPushbullet.test": "Test", "components.Settings.Notifications.NotificationsPushbullet.testSent": "Test notification sent!", "components.Settings.Notifications.NotificationsPushbullet.validationAccessTokenRequired": "You must provide an access token", - "components.Settings.Notifications.NotificationsPushover.accessToken": "Access Token", + "components.Settings.Notifications.NotificationsPushover.accessToken": "Application/API Token", "components.Settings.Notifications.NotificationsPushover.agentenabled": "Enable Agent", "components.Settings.Notifications.NotificationsPushover.notificationtypes": "Notification Types", "components.Settings.Notifications.NotificationsPushover.pushoversettingsfailed": "Pushover notification settings failed to save.", - "components.Settings.Notifications.NotificationsPushover.pushoversettingssaved": "Pushover notification settings saved!", + "components.Settings.Notifications.NotificationsPushover.pushoversettingssaved": "Pushover notification settings saved successfully!", "components.Settings.Notifications.NotificationsPushover.save": "Save Changes", "components.Settings.Notifications.NotificationsPushover.saving": "Saving…", "components.Settings.Notifications.NotificationsPushover.settinguppushover": "Setting Up Pushover Notifications", - "components.Settings.Notifications.NotificationsPushover.settinguppushoverDescription": "To configure Pushover notifications, you need to register an application and get the access token. When setting up the application, you can use one of the icons in the public folder on GitHub. You also need the Pushover user token, which can be found on the start page when you log in.", + "components.Settings.Notifications.NotificationsPushover.settinguppushoverDescription": "To configure Pushover notifications, you will need to register an application and enter the API key below. (You can use one of our official icons on GitHub.) You will need also need your user key.", "components.Settings.Notifications.NotificationsPushover.test": "Test", "components.Settings.Notifications.NotificationsPushover.testsent": "Test notification sent!", - "components.Settings.Notifications.NotificationsPushover.userToken": "User Token", - "components.Settings.Notifications.NotificationsPushover.validationAccessTokenRequired": "You must provide an access token", - "components.Settings.Notifications.NotificationsPushover.validationUserTokenRequired": "You must provide a user token", + "components.Settings.Notifications.NotificationsPushover.userToken": "User Key", + "components.Settings.Notifications.NotificationsPushover.validationAccessTokenRequired": "You must provide a valid application token", + "components.Settings.Notifications.NotificationsPushover.validationUserTokenRequired": "You must provide a valid user key", "components.Settings.Notifications.NotificationsSlack.agentenabled": "Enable Agent", "components.Settings.Notifications.NotificationsSlack.notificationtypes": "Notification Types", "components.Settings.Notifications.NotificationsSlack.save": "Save Changes", @@ -275,40 +275,40 @@ "components.Settings.Notifications.NotificationsSlack.settingupslack": "Setting Up Slack Notifications", "components.Settings.Notifications.NotificationsSlack.settingupslackDescription": "To configure Slack notifications, you will need to create an Incoming Webhook integration and enter the 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.slacksettingssaved": "Slack notification settings saved successfully!", "components.Settings.Notifications.NotificationsSlack.test": "Test", "components.Settings.Notifications.NotificationsSlack.testsent": "Test notification sent!", "components.Settings.Notifications.NotificationsSlack.validationWebhookUrl": "You must provide a valid URL", "components.Settings.Notifications.NotificationsSlack.webhookUrl": "Webhook URL", - "components.Settings.Notifications.NotificationsSlack.webhookUrlPlaceholder": "Webhook URL", "components.Settings.Notifications.NotificationsWebhook.agentenabled": "Enable Agent", "components.Settings.Notifications.NotificationsWebhook.authheader": "Authorization Header", - "components.Settings.Notifications.NotificationsWebhook.customJson": "Custom JSON Payload", + "components.Settings.Notifications.NotificationsWebhook.customJson": "JSON Payload", "components.Settings.Notifications.NotificationsWebhook.notificationtypes": "Notification Types", "components.Settings.Notifications.NotificationsWebhook.resetPayload": "Reset to Default", - "components.Settings.Notifications.NotificationsWebhook.resetPayloadSuccess": "JSON payload successfully reset.", + "components.Settings.Notifications.NotificationsWebhook.resetPayloadSuccess": "JSON payload reset successfully!", "components.Settings.Notifications.NotificationsWebhook.save": "Save Changes", "components.Settings.Notifications.NotificationsWebhook.saving": "Saving…", "components.Settings.Notifications.NotificationsWebhook.templatevariablehelp": "Template Variable Help", "components.Settings.Notifications.NotificationsWebhook.test": "Test", "components.Settings.Notifications.NotificationsWebhook.testsent": "Test notification sent!", - "components.Settings.Notifications.NotificationsWebhook.validationJsonPayloadRequired": "You must provide a JSON payload", + "components.Settings.Notifications.NotificationsWebhook.validationJsonPayloadRequired": "You must provide a valid JSON payload", "components.Settings.Notifications.NotificationsWebhook.validationWebhookUrl": "You must provide a valid URL", "components.Settings.Notifications.NotificationsWebhook.webhookUrl": "Webhook URL", - "components.Settings.Notifications.NotificationsWebhook.webhookUrlPlaceholder": "Remote webhook URL", "components.Settings.Notifications.NotificationsWebhook.webhooksettingsfailed": "Webhook notification settings failed to save.", - "components.Settings.Notifications.NotificationsWebhook.webhooksettingssaved": "Webhook notification settings saved!", + "components.Settings.Notifications.NotificationsWebhook.webhooksettingssaved": "Webhook notification settings saved successfully!", "components.Settings.Notifications.agentenabled": "Enable Agent", "components.Settings.Notifications.allowselfsigned": "Allow Self-Signed Certificates", "components.Settings.Notifications.authPass": "SMTP Password", "components.Settings.Notifications.authUser": "SMTP Username", - "components.Settings.Notifications.botAPI": "Bot API", + "components.Settings.Notifications.botAPI": "Bot Authentication Token", "components.Settings.Notifications.chatId": "Chat ID", "components.Settings.Notifications.discordsettingsfailed": "Discord notification settings failed to save.", - "components.Settings.Notifications.discordsettingssaved": "Discord notification settings saved!", + "components.Settings.Notifications.discordsettingssaved": "Discord notification settings saved successfully!", + "components.Settings.Notifications.emailNotificationTypesAlert": "Notification Email Recipients", + "components.Settings.Notifications.emailNotificationTypesAlertDescription": "For the \"Media Requested\" and \"Media Failed\" notification types, notifications will only be sent to users with the \"Manage Requests\" permission.", "components.Settings.Notifications.emailsender": "Sender Address", "components.Settings.Notifications.emailsettingsfailed": "Email notification settings failed to save.", - "components.Settings.Notifications.emailsettingssaved": "Email notification settings saved!", + "components.Settings.Notifications.emailsettingssaved": "Email notification settings saved successfully!", "components.Settings.Notifications.enableSsl": "Enable SSL", "components.Settings.Notifications.notificationtypes": "Notification Types", "components.Settings.Notifications.save": "Save Changes", @@ -317,16 +317,16 @@ "components.Settings.Notifications.sendSilentlyTip": "Send notifications with no sound", "components.Settings.Notifications.senderName": "Sender Name", "components.Settings.Notifications.settinguptelegram": "Setting Up Telegram Notifications", - "components.Settings.Notifications.settinguptelegramDescription": "To configure Telegram notifications, you need to create a bot and get the bot API key. Additionally, you need the chat ID for the chat where you would like the bot to send notifications. You can get this by adding @get_id_bot to the chat or group chat.", + "components.Settings.Notifications.settinguptelegramDescription": "To configure Telegram notifications, you will need to create a bot and get the bot API key. Additionally, you will need the chat ID for the chat to which you would like to send notifications. You can get this by adding @get_id_bot to the chat.", "components.Settings.Notifications.smtpHost": "SMTP Host", "components.Settings.Notifications.smtpPort": "SMTP Port", "components.Settings.Notifications.ssldisabletip": "SSL should be disabled on standard TLS connections (port 587)", "components.Settings.Notifications.telegramsettingsfailed": "Telegram notification settings failed to save.", - "components.Settings.Notifications.telegramsettingssaved": "Telegram notification settings saved!", + "components.Settings.Notifications.telegramsettingssaved": "Telegram notification settings saved successfully!", "components.Settings.Notifications.test": "Test", "components.Settings.Notifications.testsent": "Test notification sent!", - "components.Settings.Notifications.validationBotAPIRequired": "You must provide a Bot API key", - "components.Settings.Notifications.validationChatIdRequired": "You must provide a Chat ID", + "components.Settings.Notifications.validationBotAPIRequired": "You must provide a bot authentication token", + "components.Settings.Notifications.validationChatIdRequired": "You must provide a valid chat ID", "components.Settings.Notifications.validationEmail": "You must provide a valid email address", "components.Settings.Notifications.validationSmtpHostRequired": "You must provide an SMTP host", "components.Settings.Notifications.validationSmtpPortRequired": "You must provide an SMTP port", @@ -491,6 +491,7 @@ "components.Settings.delete": "Delete", "components.Settings.deleteserverconfirm": "Are you sure you want to delete this server?", "components.Settings.edit": "Edit", + "components.Settings.email": "Email", "components.Settings.enablenotifications": "Enable Notifications", "components.Settings.generalsettings": "General Settings", "components.Settings.generalsettingsDescription": "Configure global and default settings for Overseerr.", @@ -514,7 +515,7 @@ "components.Settings.notificationsettings": "Notification Settings", "components.Settings.notificationsettingsDescription": "Configure global notification settings. The options below will apply to all notification agents.", "components.Settings.notificationsettingsfailed": "Notification settings failed to save.", - "components.Settings.notificationsettingssaved": "Notification settings saved!", + "components.Settings.notificationsettingssaved": "Notification settings saved successfully!", "components.Settings.notrunning": "Not Running", "components.Settings.originallanguage": "Discover Language", "components.Settings.originallanguageTip": "Filter content by original language (only applies to the \"Popular\" and \"Upcoming\" categories)", @@ -567,6 +568,7 @@ "components.Settings.validationApplicationUrlTrailingSlash": "URL must not end in a trailing slash", "components.Settings.validationHostnameRequired": "You must provide a hostname/IP", "components.Settings.validationPortRequired": "You must provide a port", + "components.Settings.webhook": "Webhook", "components.Setup.configureplex": "Configure Plex", "components.Setup.configureservices": "Configure Services", "components.Setup.continue": "Continue",