diff --git a/package.json b/package.json
index c85d34071..51dfd15e4 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
"build": "yarn build:next && yarn build:server",
"lint": "eslint \"./server/**/*.{ts,tsx}\" \"./src/**/*.{ts,tsx}\"",
"start": "NODE_ENV=production node dist/index.js",
- "i18n:extract": "extract-messages -l=en -o src/i18n/locale -d en --flat true --overwriteDefault false \"./src/**/!(*.test).{ts,tsx}\"",
+ "i18n:extract": "extract-messages -l=en -o src/i18n/locale -d en --flat true --overwriteDefault true \"./src/**/!(*.test).{ts,tsx}\"",
"migration:generate": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:generate",
"migration:create": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:create",
"migration:run": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:run",
diff --git a/src/components/Login/LocalLogin.tsx b/src/components/Login/LocalLogin.tsx
index 365cb334d..f4d4e51d5 100644
--- a/src/components/Login/LocalLogin.tsx
+++ b/src/components/Login/LocalLogin.tsx
@@ -1,16 +1,16 @@
+import axios from 'axios';
+import { Field, Form, Formik } from 'formik';
+import Link from 'next/link';
import React, { useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
-import Button from '../Common/Button';
-import { Field, Form, Formik } from 'formik';
import * as Yup from 'yup';
-import axios from 'axios';
-import Link from 'next/link';
+import Button from '../Common/Button';
const messages = defineMessages({
email: 'Email Address',
password: 'Password',
- validationemailrequired: 'Not a valid email address',
- validationpasswordrequired: 'Password required',
+ validationemailrequired: 'You must provide a valid email address',
+ validationpasswordrequired: 'You must provide a password',
loginerror: 'Something went wrong while trying to sign in.',
signingin: 'Signing in…',
signin: 'Sign In',
diff --git a/src/components/MovieDetails/index.tsx b/src/components/MovieDetails/index.tsx
index eefc5cdf3..f5aaf18b6 100644
--- a/src/components/MovieDetails/index.tsx
+++ b/src/components/MovieDetails/index.tsx
@@ -1,37 +1,37 @@
-import React, { useState, useContext, useMemo } from 'react';
-import { defineMessages, useIntl } from 'react-intl';
-import type { MovieDetails as MovieDetailsType } from '../../../server/models/Movie';
-import useSWR from 'swr';
-import { useRouter } from 'next/router';
-import Button from '../Common/Button';
-import Link from 'next/link';
-import Slider from '../Slider';
-import PersonCard from '../PersonCard';
-import { LanguageContext } from '../../context/LanguageContext';
-import LoadingSpinner from '../Common/LoadingSpinner';
-import { useUser, Permission } from '../../hooks/useUser';
-import { MediaStatus } from '../../../server/constants/media';
import axios from 'axios';
-import SlideOver from '../Common/SlideOver';
-import RequestBlock from '../RequestBlock';
-import TmdbLogo from '../../assets/tmdb_logo.svg';
-import RTFresh from '../../assets/rt_fresh.svg';
-import RTRotten from '../../assets/rt_rotten.svg';
+import Link from 'next/link';
+import { useRouter } from 'next/router';
+import React, { useContext, useMemo, useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+import useSWR from 'swr';
+import type { RTRating } from '../../../server/api/rottentomatoes';
+import { MediaStatus } from '../../../server/constants/media';
+import type { MovieDetails as MovieDetailsType } from '../../../server/models/Movie';
import RTAudFresh from '../../assets/rt_aud_fresh.svg';
import RTAudRotten from '../../assets/rt_aud_rotten.svg';
-import type { RTRating } from '../../../server/api/rottentomatoes';
-import Error from '../../pages/_error';
-import ExternalLinkBlock from '../ExternalLinkBlock';
-import { sortCrewPriority } from '../../utils/creditHelpers';
-import StatusBadge from '../StatusBadge';
-import RequestButton from '../RequestButton';
-import MediaSlider from '../MediaSlider';
-import ConfirmButton from '../Common/ConfirmButton';
-import DownloadBlock from '../DownloadBlock';
-import PageTitle from '../Common/PageTitle';
+import RTFresh from '../../assets/rt_fresh.svg';
+import RTRotten from '../../assets/rt_rotten.svg';
+import TmdbLogo from '../../assets/tmdb_logo.svg';
+import { LanguageContext } from '../../context/LanguageContext';
import useSettings from '../../hooks/useSettings';
-import PlayButton, { PlayButtonLink } from '../Common/PlayButton';
+import { Permission, useUser } from '../../hooks/useUser';
+import Error from '../../pages/_error';
+import { sortCrewPriority } from '../../utils/creditHelpers';
+import Button from '../Common/Button';
import CachedImage from '../Common/CachedImage';
+import ConfirmButton from '../Common/ConfirmButton';
+import LoadingSpinner from '../Common/LoadingSpinner';
+import PageTitle from '../Common/PageTitle';
+import PlayButton, { PlayButtonLink } from '../Common/PlayButton';
+import SlideOver from '../Common/SlideOver';
+import DownloadBlock from '../DownloadBlock';
+import ExternalLinkBlock from '../ExternalLinkBlock';
+import MediaSlider from '../MediaSlider';
+import PersonCard from '../PersonCard';
+import RequestBlock from '../RequestBlock';
+import RequestButton from '../RequestButton';
+import Slider from '../Slider';
+import StatusBadge from '../StatusBadge';
const messages = defineMessages({
releasedate: 'Release Date',
@@ -56,8 +56,7 @@ const messages = defineMessages({
manageModalNoRequests: 'No Requests',
manageModalClearMedia: 'Clear All Media Data',
manageModalClearMediaWarning:
- 'This will irreversibly remove all data for this movie, including any requests.\
- If this item exists in your Plex library, the media information will be recreated during the next scan.',
+ '* This will irreversibly remove all data for this movie, including any requests. If this item exists in your Plex library, the media information will be recreated during the next scan.',
approve: 'Approve',
decline: 'Decline',
studio: '{studioCount, plural, one {Studio} other {Studios}}',
diff --git a/src/components/PermissionEdit/index.tsx b/src/components/PermissionEdit/index.tsx
index 369b53f31..5c0f60fe8 100644
--- a/src/components/PermissionEdit/index.tsx
+++ b/src/components/PermissionEdit/index.tsx
@@ -1,7 +1,7 @@
import React from 'react';
-import PermissionOption, { PermissionItem } from '../PermissionOption';
+import { defineMessages, useIntl } from 'react-intl';
import { Permission, User } from '../../hooks/useUser';
-import { useIntl, defineMessages } from 'react-intl';
+import PermissionOption, { PermissionItem } from '../PermissionOption';
export const messages = defineMessages({
admin: 'Admin',
@@ -9,18 +9,15 @@ export const messages = defineMessages({
'Full administrator access. Bypasses all other permission checks.',
users: 'Manage Users',
usersDescription:
- 'Grant permission to manage Overseerr users.\
- Users with this permission cannot modify users with or grant the Admin privilege.',
+ 'Grant permission to manage Overseerr users. Users with this permission cannot modify users with or grant the Admin privilege.',
settings: 'Manage Settings',
settingsDescription:
- 'Grant permission to modify all Overseerr settings.\
- A user must have this permission to grant it to others.',
+ 'Grant permission to modify all Overseerr settings. A user must have this permission to grant it to others.',
managerequests: 'Manage Requests',
managerequestsDescription:
- 'Grant permission to manage Overseerr requests (includes approving and denying requests).\
- All requests made by a user with this permission will be automatically approved.',
+ 'Grant permission to manage Overseerr requests (includes approving and denying requests). All requests made by a user with this permission will be automatically approved.',
request: 'Request',
- requestDescription: 'Grants permission to request movies and series.',
+ requestDescription: 'Grant permission to request movies and series.',
vote: 'Vote',
voteDescription:
'Grant permission to vote on requests (voting not yet implemented).',
diff --git a/src/components/RequestBlock/index.tsx b/src/components/RequestBlock/index.tsx
index 0a95377e4..c23370e94 100644
--- a/src/components/RequestBlock/index.tsx
+++ b/src/components/RequestBlock/index.tsx
@@ -1,19 +1,19 @@
-import React, { useState } from 'react';
-import type { MediaRequest } from '../../../server/entity/MediaRequest';
-import { useIntl, defineMessages } from 'react-intl';
-import Badge from '../Common/Badge';
-import { MediaRequestStatus } from '../../../server/constants/media';
-import Button from '../Common/Button';
import axios from 'axios';
-import globalMessages from '../../i18n/globalMessages';
-import RequestModal from '../RequestModal';
+import React, { useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+import { MediaRequestStatus } from '../../../server/constants/media';
+import type { MediaRequest } from '../../../server/entity/MediaRequest';
import useRequestOverride from '../../hooks/useRequestOverride';
+import globalMessages from '../../i18n/globalMessages';
+import Badge from '../Common/Badge';
+import Button from '../Common/Button';
+import RequestModal from '../RequestModal';
const messages = defineMessages({
seasons: '{seasonCount, plural, one {Season} other {Seasons}}',
requestoverrides: 'Request Overrides',
- server: 'Server',
- profilechanged: 'Profile Changed',
+ server: 'Destination Server',
+ profilechanged: 'Quality Profile',
rootfolder: 'Root Folder',
});
diff --git a/src/components/RequestModal/MovieRequestModal.tsx b/src/components/RequestModal/MovieRequestModal.tsx
index 6ec1f2b88..df9e397f9 100644
--- a/src/components/RequestModal/MovieRequestModal.tsx
+++ b/src/components/RequestModal/MovieRequestModal.tsx
@@ -1,40 +1,40 @@
-import React, { useCallback, useState, useEffect } from 'react';
-import Modal from '../Common/Modal';
-import { useUser } from '../../hooks/useUser';
-import { Permission } from '../../../server/lib/permissions';
-import { defineMessages, useIntl } from 'react-intl';
-import { MediaRequest } from '../../../server/entity/MediaRequest';
-import useSWR from 'swr';
-import { MovieDetails } from '../../../server/models/Movie';
-import { useToasts } from 'react-toast-notifications';
import axios from 'axios';
+import React, { useCallback, useEffect, useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+import { useToasts } from 'react-toast-notifications';
+import useSWR from 'swr';
import {
- MediaStatus,
MediaRequestStatus,
+ MediaStatus,
} from '../../../server/constants/media';
+import { MediaRequest } from '../../../server/entity/MediaRequest';
+import { Permission } from '../../../server/lib/permissions';
+import { MovieDetails } from '../../../server/models/Movie';
import DownloadIcon from '../../assets/download.svg';
-import Alert from '../Common/Alert';
-import AdvancedRequester, { RequestOverrides } from './AdvancedRequester';
+import { useUser } from '../../hooks/useUser';
import globalMessages from '../../i18n/globalMessages';
+import Alert from '../Common/Alert';
+import Modal from '../Common/Modal';
+import AdvancedRequester, { RequestOverrides } from './AdvancedRequester';
const messages = defineMessages({
requestadmin: 'Your request will be immediately approved.',
cancelrequest:
'This will remove your request. Are you sure you want to continue?',
requestSuccess: '{title} requested successfully!',
- requestCancel: 'Request for {title} canceled',
+ requestCancel: 'Request for {title} canceled.',
requesttitle: 'Request {title}',
request4ktitle: 'Request {title} in 4K',
close: 'Close',
cancel: 'Cancel Request',
cancelling: 'Canceling…',
- pendingrequest: 'Pending request for {title}',
- pending4krequest: 'Pending request for {title} in 4K',
+ pendingrequest: 'Pending Request for {title}',
+ pending4krequest: 'Pending Request for {title} in 4K',
requesting: 'Requesting…',
request: 'Request',
request4k: 'Request 4K',
- requestfrom: 'There is a pending request from {username}.',
- request4kfrom: 'There is a pending 4K request from {username}.',
+ requestfrom: 'There is currently a pending request from {username}.',
+ request4kfrom: 'There is currently a pending 4K request from {username}.',
errorediting: 'Something went wrong while editing the request.',
requestedited: 'Request edited.',
autoapproval: 'Automatic Approval',
diff --git a/src/components/RequestModal/SearchByNameModal/index.tsx b/src/components/RequestModal/SearchByNameModal/index.tsx
index e0f13808f..6f862cf95 100644
--- a/src/components/RequestModal/SearchByNameModal/index.tsx
+++ b/src/components/RequestModal/SearchByNameModal/index.tsx
@@ -1,17 +1,16 @@
import React from 'react';
-import Alert from '../../Common/Alert';
-import Modal from '../../Common/Modal';
-import { SmallLoadingSpinner } from '../../Common/LoadingSpinner';
-import useSWR from 'swr';
import { defineMessages, useIntl } from 'react-intl';
+import useSWR from 'swr';
import { SonarrSeries } from '../../../../server/api/sonarr';
+import Alert from '../../Common/Alert';
+import { SmallLoadingSpinner } from '../../Common/LoadingSpinner';
+import Modal from '../../Common/Modal';
const messages = defineMessages({
next: 'Next',
notvdbid: 'Manual Match Required',
notvdbiddescription:
- "We couldn't automatically match your request.\
- Please select the correct match from the list below.",
+ "We couldn't automatically match your request. Please select the correct match from the list below.",
nosummary: 'No summary for this title was found.',
});
diff --git a/src/components/ResetPassword/RequestResetLink.tsx b/src/components/ResetPassword/RequestResetLink.tsx
index 02cd4b8d8..f9359772d 100644
--- a/src/components/ResetPassword/RequestResetLink.tsx
+++ b/src/components/ResetPassword/RequestResetLink.tsx
@@ -1,19 +1,19 @@
-import React, { useState } from 'react';
-import ImageFader from '../Common/ImageFader';
-import { defineMessages, useIntl } from 'react-intl';
-import LanguagePicker from '../Layout/LanguagePicker';
-import Button from '../Common/Button';
-import { Field, Form, Formik } from 'formik';
-import * as Yup from 'yup';
import axios from 'axios';
+import { Field, Form, Formik } from 'formik';
import Link from 'next/link';
+import React, { useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+import * as Yup from 'yup';
+import Button from '../Common/Button';
+import ImageFader from '../Common/ImageFader';
import PageTitle from '../Common/PageTitle';
+import LanguagePicker from '../Layout/LanguagePicker';
const messages = defineMessages({
passwordreset: 'Password Reset',
resetpassword: 'Reset your password',
emailresetlink: 'Email a Recovery Link',
- email: 'Email',
+ email: 'Email Address',
validationemailrequired: 'You must provide a valid email address',
gobacklogin: 'Return to Sign-In Page',
requestresetlinksuccessmessage:
diff --git a/src/components/Settings/Notifications/NotificationsEmail.tsx b/src/components/Settings/Notifications/NotificationsEmail.tsx
index d0ce112d4..494029735 100644
--- a/src/components/Settings/Notifications/NotificationsEmail.tsx
+++ b/src/components/Settings/Notifications/NotificationsEmail.tsx
@@ -1,16 +1,16 @@
-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 { Field, Form, Formik } from 'formik';
+import React from 'react';
+import { defineMessages, useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
-import NotificationTypeSelector from '../../NotificationTypeSelector';
+import useSWR from 'swr';
+import * as Yup from 'yup';
+import globalMessages from '../../../i18n/globalMessages';
import Alert from '../../Common/Alert';
import Badge from '../../Common/Badge';
-import globalMessages from '../../../i18n/globalMessages';
+import Button from '../../Common/Button';
+import LoadingSpinner from '../../Common/LoadingSpinner';
+import NotificationTypeSelector from '../../NotificationTypeSelector';
const messages = defineMessages({
save: 'Save Changes',
@@ -36,11 +36,9 @@ const messages = defineMessages({
validationEmail: 'You must provide a valid email address',
emailNotificationTypesAlert: 'Email Notification Recipients',
emailNotificationTypesAlertDescription:
- 'Media Requested, Media Automatically Approved, and Media Failed\
- email notifications are sent to all users with the Manage Requests permission.',
+ 'Media Requested, Media Automatically Approved, and Media Failed email notifications are sent to all users with the Manage Requests permission.',
emailNotificationTypesAlertDescriptionPt2:
- 'Media Approved, Media Declined, and Media Available\
- email notifications are sent to the user who submitted the request.',
+ 'Media Approved, Media Declined, and Media Available email notifications are sent to the user who submitted the request.',
pgpPrivateKey: 'PGP Private Key',
pgpPrivateKeyTip:
'Sign encrypted email messages (PGP password is also required)',
diff --git a/src/components/Settings/Notifications/NotificationsPushover/index.tsx b/src/components/Settings/Notifications/NotificationsPushover/index.tsx
index 1d0361dff..6d6c20b10 100644
--- a/src/components/Settings/Notifications/NotificationsPushover/index.tsx
+++ b/src/components/Settings/Notifications/NotificationsPushover/index.tsx
@@ -1,13 +1,13 @@
-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 { Field, Form, Formik } from 'formik';
+import React from 'react';
+import { defineMessages, useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
+import useSWR from 'swr';
+import * as Yup from 'yup';
import Alert from '../../../Common/Alert';
+import Button from '../../../Common/Button';
+import LoadingSpinner from '../../../Common/LoadingSpinner';
import NotificationTypeSelector from '../../../NotificationTypeSelector';
const messages = defineMessages({
@@ -24,9 +24,7 @@ const messages = defineMessages({
test: 'Test',
settinguppushover: 'Setting Up Pushover Notifications',
settinguppushoverDescription:
- 'To configure Pushover notifications, you will need to register an application and enter the API token below.\
- (You can use one of our official icons on GitHub.)\
- You will also need your user key.',
+ 'To configure Pushover notifications, you will need to register an application and enter the API token below. (You can use one of our official icons on GitHub.) You will also need your user key.',
notificationtypes: 'Notification Types',
});
diff --git a/src/components/Settings/Notifications/NotificationsTelegram.tsx b/src/components/Settings/Notifications/NotificationsTelegram.tsx
index e34860182..be1fd26cc 100644
--- a/src/components/Settings/Notifications/NotificationsTelegram.tsx
+++ b/src/components/Settings/Notifications/NotificationsTelegram.tsx
@@ -1,13 +1,13 @@
-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 { Field, Form, Formik } from 'formik';
+import React from 'react';
+import { defineMessages, useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
+import useSWR from 'swr';
+import * as Yup from 'yup';
import Alert from '../../Common/Alert';
+import Button from '../../Common/Button';
+import LoadingSpinner from '../../Common/LoadingSpinner';
import NotificationTypeSelector from '../../NotificationTypeSelector';
const messages = defineMessages({
@@ -25,9 +25,7 @@ const messages = defineMessages({
test: 'Test',
settinguptelegram: 'Setting Up Telegram 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 find this by adding @get_id_bot to the chat and issuing the /my_id
command.',
+ '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 find this by adding @get_id_bot to the chat and issuing the /my_id
command.',
notificationtypes: 'Notification Types',
sendSilently: 'Send Silently',
sendSilentlyTip: 'Send notifications with no sound',
diff --git a/src/components/Settings/RadarrModal/index.tsx b/src/components/Settings/RadarrModal/index.tsx
index 47add7ef5..de622225c 100644
--- a/src/components/Settings/RadarrModal/index.tsx
+++ b/src/components/Settings/RadarrModal/index.tsx
@@ -1,12 +1,12 @@
-import React, { useState, useEffect, useCallback, useRef } from 'react';
-import Transition from '../../Transition';
-import Modal from '../../Common/Modal';
-import { Formik, Field } from 'formik';
-import type { RadarrSettings } from '../../../../server/lib/settings';
-import * as Yup from 'yup';
import axios from 'axios';
-import { useToasts } from 'react-toast-notifications';
+import { Field, Formik } from 'formik';
+import React, { useCallback, useEffect, useRef, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
+import { useToasts } from 'react-toast-notifications';
+import * as Yup from 'yup';
+import type { RadarrSettings } from '../../../../server/lib/settings';
+import Modal from '../../Common/Modal';
+import Transition from '../../Transition';
const messages = defineMessages({
createradarr: 'Add New Radarr Server',
@@ -16,8 +16,9 @@ const messages = defineMessages({
validationPortRequired: 'You must provide a valid port number',
validationApiKeyRequired: 'You must provide an API key',
validationRootFolderRequired: 'You must select a root folder',
- validationProfileRequired: 'You must select a profile',
- validationMinimumAvailabilityRequired: 'You must select minimum availability',
+ validationProfileRequired: 'You must select a quality profile',
+ validationMinimumAvailabilityRequired:
+ 'You must select a minimum availability',
toastRadarrTestSuccess: 'Radarr connection established successfully!',
toastRadarrTestFailure: 'Failed to connect to Radarr.',
saving: 'Saving…',
diff --git a/src/components/Settings/SettingsAbout/Releases/index.tsx b/src/components/Settings/SettingsAbout/Releases/index.tsx
index 78a02e439..1e7015807 100644
--- a/src/components/Settings/SettingsAbout/Releases/index.tsx
+++ b/src/components/Settings/SettingsAbout/Releases/index.tsx
@@ -1,14 +1,14 @@
import React, { useState } from 'react';
-import useSWR from 'swr';
+import { defineMessages, FormattedRelativeTime, useIntl } from 'react-intl';
import ReactMarkdown from 'react-markdown';
-import LoadingSpinner from '../../../Common/LoadingSpinner';
+import useSWR from 'swr';
+import globalMessages from '../../../../i18n/globalMessages';
import Alert from '../../../Common/Alert';
import Badge from '../../../Common/Badge';
import Button from '../../../Common/Button';
+import LoadingSpinner from '../../../Common/LoadingSpinner';
import Modal from '../../../Common/Modal';
import Transition from '../../../Transition';
-import { defineMessages, FormattedRelativeTime, useIntl } from 'react-intl';
-import globalMessages from '../../../../i18n/globalMessages';
const messages = defineMessages({
releases: 'Releases',
@@ -20,8 +20,7 @@ const messages = defineMessages({
viewchangelog: 'View Changelog',
runningDevelop: 'Development Version',
runningDevelopMessage:
- 'The latest changes to the develop
branch of Overseerr are not shown below.\
- Please see the commit history for this branch on GitHub for details.',
+ 'The latest changes to the develop
branch of Overseerr are not shown below. Please see the commit history for this branch on GitHub for details.',
});
const REPO_RELEASE_API =
diff --git a/src/components/Settings/SettingsJobsCache/index.tsx b/src/components/Settings/SettingsJobsCache/index.tsx
index f876ab726..46d0cd9d7 100644
--- a/src/components/Settings/SettingsJobsCache/index.tsx
+++ b/src/components/Settings/SettingsJobsCache/index.tsx
@@ -1,30 +1,28 @@
-import React from 'react';
-import useSWR from 'swr';
-import LoadingSpinner from '../../Common/LoadingSpinner';
-import {
- FormattedRelativeTime,
- defineMessages,
- useIntl,
- MessageDescriptor,
-} from 'react-intl';
-import Button from '../../Common/Button';
-import Table from '../../Common/Table';
-import Spinner from '../../../assets/spinner.svg';
import axios from 'axios';
+import React from 'react';
+import {
+ defineMessages,
+ FormattedRelativeTime,
+ MessageDescriptor,
+ useIntl,
+} from 'react-intl';
import { useToasts } from 'react-toast-notifications';
-import Badge from '../../Common/Badge';
+import useSWR from 'swr';
import { CacheItem } from '../../../../server/interfaces/api/settingsInterfaces';
-import { formatBytes } from '../../../utils/numberHelpers';
-import PageTitle from '../../Common/PageTitle';
+import Spinner from '../../../assets/spinner.svg';
import globalMessages from '../../../i18n/globalMessages';
+import { formatBytes } from '../../../utils/numberHelpers';
+import Badge from '../../Common/Badge';
+import Button from '../../Common/Button';
+import LoadingSpinner from '../../Common/LoadingSpinner';
+import PageTitle from '../../Common/PageTitle';
+import Table from '../../Common/Table';
const messages: { [messageName: string]: MessageDescriptor } = defineMessages({
jobsandcache: 'Jobs & Cache',
jobs: 'Jobs',
jobsDescription:
- 'Overseerr performs certain maintenance tasks as regularly-scheduled jobs,\
- but they can also be manually triggered below.\
- Manually running a job will not alter its schedule.',
+ 'Overseerr performs certain maintenance tasks as regularly-scheduled jobs, but they can also be manually triggered below. Manually running a job will not alter its schedule.',
jobname: 'Job Name',
jobtype: 'Type',
nextexecution: 'Next Execution',
diff --git a/src/components/Settings/SettingsMain.tsx b/src/components/Settings/SettingsMain.tsx
index 9152a4b7e..a059cf452 100644
--- a/src/components/Settings/SettingsMain.tsx
+++ b/src/components/Settings/SettingsMain.tsx
@@ -1,19 +1,19 @@
-import React, { useMemo } from 'react';
-import useSWR from 'swr';
-import LoadingSpinner from '../Common/LoadingSpinner';
-import type { MainSettings, Language } from '../../../server/lib/settings';
-import CopyButton from './CopyButton';
-import { Form, Formik, Field } from 'formik';
import axios from 'axios';
-import Button from '../Common/Button';
+import { Field, Form, Formik } from 'formik';
+import React, { useMemo } from 'react';
import { defineMessages, useIntl } from 'react-intl';
-import { useUser, Permission } from '../../hooks/useUser';
import { useToasts } from 'react-toast-notifications';
-import Badge from '../Common/Badge';
-import globalMessages from '../../i18n/globalMessages';
+import useSWR from 'swr';
import * as Yup from 'yup';
-import RegionSelector from '../RegionSelector';
+import type { Language, MainSettings } from '../../../server/lib/settings';
+import { Permission, useUser } from '../../hooks/useUser';
+import globalMessages from '../../i18n/globalMessages';
+import Badge from '../Common/Badge';
+import Button from '../Common/Button';
+import LoadingSpinner from '../Common/LoadingSpinner';
import PageTitle from '../Common/PageTitle';
+import RegionSelector from '../RegionSelector';
+import CopyButton from './CopyButton';
const messages = defineMessages({
general: 'General',
@@ -36,8 +36,7 @@ const messages = defineMessages({
hideAvailable: 'Hide Available Media',
csrfProtection: 'Enable CSRF Protection',
csrfProtectionTip:
- 'Set external API access to read-only\
- (requires HTTPS, and Overseerr must be reloaded for changes to take effect)',
+ 'Set external API access to read-only (requires HTTPS, and Overseerr must be reloaded for changes to take effect)',
csrfProtectionHoverTip:
'Do NOT enable this setting unless you understand what you are doing!',
cacheImages: 'Enable Image Caching',
@@ -45,8 +44,7 @@ const messages = defineMessages({
'Optimize and store all images locally (consumes a significant amount of disk space)',
trustProxy: 'Enable Proxy Support',
trustProxyTip:
- 'Allow Overseerr to correctly register client IP addresses behind a proxy\
- (Overseerr must be reloaded for changes to take effect)',
+ 'Allow Overseerr to correctly register client IP addresses behind a proxy (Overseerr must be reloaded for changes to take effect)',
validationApplicationTitle: 'You must provide an application title',
validationApplicationUrl: 'You must provide a valid URL',
validationApplicationUrlTrailingSlash: 'URL must not end in a trailing slash',
diff --git a/src/components/Settings/SettingsPlex.tsx b/src/components/Settings/SettingsPlex.tsx
index f34783728..25bc2e833 100644
--- a/src/components/Settings/SettingsPlex.tsx
+++ b/src/components/Settings/SettingsPlex.tsx
@@ -1,20 +1,20 @@
-import React, { useMemo, useState } from 'react';
-import LoadingSpinner from '../Common/LoadingSpinner';
-import type { PlexSettings } from '../../../server/lib/settings';
-import type { PlexDevice } from '../../../server/interfaces/api/plexInterfaces';
-import useSWR from 'swr';
-import { useToasts } from 'react-toast-notifications';
-import { Formik, Field } from 'formik';
-import Button from '../Common/Button';
import axios from 'axios';
-import LibraryItem from './LibraryItem';
-import Badge from '../Common/Badge';
+import { Field, Formik } from 'formik';
+import React, { useMemo, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
+import { useToasts } from 'react-toast-notifications';
+import useSWR from 'swr';
import * as Yup from 'yup';
-import Alert from '../Common/Alert';
+import type { PlexDevice } from '../../../server/interfaces/api/plexInterfaces';
+import type { PlexSettings } from '../../../server/lib/settings';
import Spinner from '../../assets/spinner.svg';
-import PageTitle from '../Common/PageTitle';
import globalMessages from '../../i18n/globalMessages';
+import Alert from '../Common/Alert';
+import Badge from '../Common/Badge';
+import Button from '../Common/Button';
+import LoadingSpinner from '../Common/LoadingSpinner';
+import PageTitle from '../Common/PageTitle';
+import LibraryItem from './LibraryItem';
const messages = defineMessages({
plex: 'Plex',
@@ -32,7 +32,7 @@ const messages = defineMessages({
serverpresetManualMessage: 'Manual configuration',
serverpresetRefreshing: 'Retrieving servers…',
serverpresetLoad: 'Press the button to load available servers',
- toastPlexRefresh: 'Retrieving server list from Plex',
+ toastPlexRefresh: 'Retrieving server list from Plex…',
toastPlexRefreshSuccess: 'Plex server list retrieved successfully!',
toastPlexRefreshFailure: 'Failed to retrieve Plex server list.',
toastPlexConnecting: 'Attempting to connect to Plex…',
@@ -40,9 +40,7 @@ const messages = defineMessages({
toastPlexConnectingFailure: 'Failed to connect to Plex.',
settingUpPlex: 'Setting Up Plex',
settingUpPlexDescription:
- 'To set up Plex, you can either enter your details manually \
- or select a server retrieved from plex.tv.\
- Press the button to the right of the dropdown to check connectivity and retrieve available servers.',
+ 'To set up Plex, you can either enter your details manually or select a server retrieved from plex.tv. Press the button to the right of the dropdown to check connectivity and retrieve available servers.',
hostname: 'Hostname or IP Address',
port: 'Port',
enablessl: 'Enable SSL',
diff --git a/src/components/Setup/LoginWithPlex.tsx b/src/components/Setup/LoginWithPlex.tsx
index 30a49a7a8..d79e66c22 100644
--- a/src/components/Setup/LoginWithPlex.tsx
+++ b/src/components/Setup/LoginWithPlex.tsx
@@ -1,12 +1,12 @@
+import axios from 'axios';
import React, { useEffect, useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
import { useUser } from '../../hooks/useUser';
import PlexLoginButton from '../PlexLoginButton';
-import axios from 'axios';
-import { defineMessages, useIntl } from 'react-intl';
const messages = defineMessages({
welcome: 'Welcome to Overseerr',
- signinMessage: 'Get started by logging in with your Plex account',
+ signinMessage: 'Get started by signing in with your Plex account',
});
interface LoginWithPlexProps {
diff --git a/src/components/Setup/index.tsx b/src/components/Setup/index.tsx
index fca2fea2f..eb9a11f7c 100644
--- a/src/components/Setup/index.tsx
+++ b/src/components/Setup/index.tsx
@@ -1,30 +1,29 @@
+import axios from 'axios';
import { useRouter } from 'next/router';
import React, { useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+import AppDataWarning from '../AppDataWarning';
+import Badge from '../Common/Badge';
import Button from '../Common/Button';
import ImageFader from '../Common/ImageFader';
+import PageTitle from '../Common/PageTitle';
+import LanguagePicker from '../Layout/LanguagePicker';
import SettingsPlex from '../Settings/SettingsPlex';
import SettingsServices from '../Settings/SettingsServices';
import LoginWithPlex from './LoginWithPlex';
import SetupSteps from './SetupSteps';
-import axios from 'axios';
-import { defineMessages, useIntl } from 'react-intl';
-import Badge from '../Common/Badge';
-import LanguagePicker from '../Layout/LanguagePicker';
-import PageTitle from '../Common/PageTitle';
-import AppDataWarning from '../AppDataWarning';
const messages = defineMessages({
setup: 'Setup',
finish: 'Finish Setup',
finishing: 'Finishing…',
continue: 'Continue',
- loginwithplex: 'Login with Plex',
+ loginwithplex: 'Sign in with Plex',
configureplex: 'Configure Plex',
configureservices: 'Configure Services',
tip: 'Tip',
scanbackground:
- 'Scanning will run in the background.\
- You can continue the setup process in the meantime.',
+ 'Scanning will run in the background. You can continue the setup process in the meantime.',
});
const Setup: React.FC = () => {
diff --git a/src/components/TvDetails/index.tsx b/src/components/TvDetails/index.tsx
index 7abc645e8..eed115851 100644
--- a/src/components/TvDetails/index.tsx
+++ b/src/components/TvDetails/index.tsx
@@ -1,40 +1,40 @@
-import React, { useState, useContext, useMemo } from 'react';
+import axios from 'axios';
+import Link from 'next/link';
+import { useRouter } from 'next/router';
+import React, { useContext, useMemo, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import useSWR from 'swr';
-import { useRouter } from 'next/router';
-import Button from '../Common/Button';
-import Link from 'next/link';
-import Slider from '../Slider';
-import PersonCard from '../PersonCard';
-import { LanguageContext } from '../../context/LanguageContext';
-import LoadingSpinner from '../Common/LoadingSpinner';
-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 axios from 'axios';
-import SlideOver from '../Common/SlideOver';
-import RequestBlock from '../RequestBlock';
-import Error from '../../pages/_error';
-import TmdbLogo from '../../assets/tmdb_logo.svg';
-import RTFresh from '../../assets/rt_fresh.svg';
-import RTRotten from '../../assets/rt_rotten.svg';
-import RTAudFresh from '../../assets/rt_aud_fresh.svg';
-import RTAudRotten from '../../assets/rt_aud_rotten.svg';
import type { RTRating } from '../../../server/api/rottentomatoes';
import { ANIME_KEYWORD_ID } from '../../../server/api/themoviedb/constants';
-import ExternalLinkBlock from '../ExternalLinkBlock';
-import { sortCrewPriority } from '../../utils/creditHelpers';
+import { MediaStatus } from '../../../server/constants/media';
import { Crew } from '../../../server/models/common';
-import StatusBadge from '../StatusBadge';
-import RequestButton from '../RequestButton';
-import MediaSlider from '../MediaSlider';
-import ConfirmButton from '../Common/ConfirmButton';
-import DownloadBlock from '../DownloadBlock';
-import PageTitle from '../Common/PageTitle';
+import { TvDetails as TvDetailsType } from '../../../server/models/Tv';
+import RTAudFresh from '../../assets/rt_aud_fresh.svg';
+import RTAudRotten from '../../assets/rt_aud_rotten.svg';
+import RTFresh from '../../assets/rt_fresh.svg';
+import RTRotten from '../../assets/rt_rotten.svg';
+import TmdbLogo from '../../assets/tmdb_logo.svg';
+import { LanguageContext } from '../../context/LanguageContext';
import useSettings from '../../hooks/useSettings';
-import PlayButton, { PlayButtonLink } from '../Common/PlayButton';
+import { Permission, useUser } from '../../hooks/useUser';
+import Error from '../../pages/_error';
+import { sortCrewPriority } from '../../utils/creditHelpers';
+import Button from '../Common/Button';
import CachedImage from '../Common/CachedImage';
+import ConfirmButton from '../Common/ConfirmButton';
+import LoadingSpinner from '../Common/LoadingSpinner';
+import PageTitle from '../Common/PageTitle';
+import PlayButton, { PlayButtonLink } from '../Common/PlayButton';
+import SlideOver from '../Common/SlideOver';
+import DownloadBlock from '../DownloadBlock';
+import ExternalLinkBlock from '../ExternalLinkBlock';
+import MediaSlider from '../MediaSlider';
+import PersonCard from '../PersonCard';
+import RequestBlock from '../RequestBlock';
+import RequestButton from '../RequestButton';
+import RequestModal from '../RequestModal';
+import Slider from '../Slider';
+import StatusBadge from '../StatusBadge';
const messages = defineMessages({
firstAirDate: 'First Air Date',
@@ -57,8 +57,7 @@ const messages = defineMessages({
manageModalNoRequests: 'No Requests',
manageModalClearMedia: 'Clear All Media Data',
manageModalClearMediaWarning:
- 'This will irreversibly remove all data for this TV series, including any requests.\
- If this item exists in your Plex library, the media information will be recreated during the next scan.',
+ '* This will irreversibly remove all data for this TV series, including any requests. If this item exists in your Plex library, the media information will be recreated during the next scan.',
approve: 'Approve',
decline: 'Decline',
showtype: 'Series Type',
diff --git a/src/components/UserList/index.tsx b/src/components/UserList/index.tsx
index 8d65b2531..66668ec17 100644
--- a/src/components/UserList/index.tsx
+++ b/src/components/UserList/index.tsx
@@ -1,27 +1,27 @@
-import React, { useState } from 'react';
-import useSWR from 'swr';
-import LoadingSpinner from '../Common/LoadingSpinner';
-import Badge from '../Common/Badge';
-import { defineMessages, useIntl } from 'react-intl';
-import Button from '../Common/Button';
-import { hasPermission } from '../../../server/lib/permissions';
-import { Permission, User, UserType, useUser } from '../../hooks/useUser';
+import axios from 'axios';
+import { Field, Form, Formik } from 'formik';
+import Link from 'next/link';
import { useRouter } from 'next/router';
+import React, { useState } from 'react';
+import { defineMessages, useIntl } from 'react-intl';
+import { useToasts } from 'react-toast-notifications';
+import useSWR from 'swr';
+import * as Yup from 'yup';
+import type { UserResultsResponse } from '../../../server/interfaces/api/userInterfaces';
+import { hasPermission } from '../../../server/lib/permissions';
+import AddUserIcon from '../../assets/useradd.svg';
+import { Permission, User, UserType, useUser } from '../../hooks/useUser';
+import globalMessages from '../../i18n/globalMessages';
+import Alert from '../Common/Alert';
+import Badge from '../Common/Badge';
+import Button from '../Common/Button';
import Header from '../Common/Header';
+import LoadingSpinner from '../Common/LoadingSpinner';
+import Modal from '../Common/Modal';
+import PageTitle from '../Common/PageTitle';
import Table from '../Common/Table';
import Transition from '../Transition';
-import Modal from '../Common/Modal';
-import axios from 'axios';
-import { useToasts } from 'react-toast-notifications';
-import globalMessages from '../../i18n/globalMessages';
-import { Field, Form, Formik } from 'formik';
-import * as Yup from 'yup';
-import AddUserIcon from '../../assets/useradd.svg';
-import Alert from '../Common/Alert';
import BulkEditModal from './BulkEditModal';
-import PageTitle from '../Common/PageTitle';
-import Link from 'next/link';
-import type { UserResultsResponse } from '../../../server/interfaces/api/userInterfaces';
const messages = defineMessages({
users: 'Users',
@@ -29,7 +29,7 @@ const messages = defineMessages({
importfromplex: 'Import Users from Plex',
importfromplexerror: 'Something went wrong while importing users from Plex.',
importedfromplex:
- '{userCount, plural, =0 {No new users} one {# new user} other {# new users}} imported from Plex.',
+ '{userCount, plural, =0 {No new users} one {# new user} other {# new users}} imported from Plex successfully!',
user: 'User',
totalrequests: 'Total Requests',
accounttype: 'Account Type',
@@ -43,7 +43,7 @@ const messages = defineMessages({
admin: 'Admin',
plexuser: 'Plex User',
deleteuser: 'Delete User',
- userdeleted: 'User deleted',
+ userdeleted: 'User deleted successfully!',
userdeleteerror: 'Something went wrong while deleting the user.',
deleteconfirm:
'Are you sure you want to delete this user? All existing request data from this user will be removed.',
diff --git a/src/components/UserProfile/UserSettings/UserNotificationSettings/index.tsx b/src/components/UserProfile/UserSettings/UserNotificationSettings/index.tsx
index 386e5e6df..8d57684e3 100644
--- a/src/components/UserProfile/UserSettings/UserNotificationSettings/index.tsx
+++ b/src/components/UserProfile/UserSettings/UserNotificationSettings/index.tsx
@@ -5,22 +5,22 @@ import React from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
import useSWR from 'swr';
+import * as Yup from 'yup';
+import { UserSettingsNotificationsResponse } from '../../../../../server/interfaces/api/userSettingsInterfaces';
import { useUser } from '../../../../hooks/useUser';
+import globalMessages from '../../../../i18n/globalMessages';
import Error from '../../../../pages/_error';
+import Badge from '../../../Common/Badge';
import Button from '../../../Common/Button';
import LoadingSpinner from '../../../Common/LoadingSpinner';
-import { UserSettingsNotificationsResponse } from '../../../../../server/interfaces/api/userSettingsInterfaces';
-import * as Yup from 'yup';
-import Badge from '../../../Common/Badge';
-import globalMessages from '../../../../i18n/globalMessages';
-import { PgpLink } from '../../../Settings/Notifications/NotificationsEmail';
import PageTitle from '../../../Common/PageTitle';
+import { PgpLink } from '../../../Settings/Notifications/NotificationsEmail';
const messages = defineMessages({
notifications: 'Notifications',
notificationsettings: 'Notification Settings',
enableNotifications: 'Enable Notifications',
- discordId: 'Discord User ID',
+ discordId: 'Discord ID',
discordIdTip:
'The ID number for your Discord user account',
validationDiscordId: 'You must provide a valid Discord user ID',
diff --git a/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx b/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx
index 98913b207..3243e17b8 100644
--- a/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx
+++ b/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx
@@ -5,15 +5,15 @@ import React from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { useToasts } from 'react-toast-notifications';
import useSWR from 'swr';
+import * as Yup from 'yup';
+import useSettings from '../../../../hooks/useSettings';
import { Permission, useUser } from '../../../../hooks/useUser';
+import globalMessages from '../../../../i18n/globalMessages';
import Error from '../../../../pages/_error';
import Alert from '../../../Common/Alert';
import Button from '../../../Common/Button';
import LoadingSpinner from '../../../Common/LoadingSpinner';
-import * as Yup from 'yup';
-import useSettings from '../../../../hooks/useSettings';
import PageTitle from '../../../Common/PageTitle';
-import globalMessages from '../../../../i18n/globalMessages';
const messages = defineMessages({
password: 'Password',
@@ -34,11 +34,9 @@ const messages = defineMessages({
validationConfirmPasswordSame: 'Passwords must match',
nopasswordset: 'No Password Set',
nopasswordsetDescription:
- 'This user account currently does not have a password specifically for {applicationTitle}.\
- Configure a password below to enable this account to sign in as a "local user."',
+ 'This user account currently does not have a password specifically for {applicationTitle}. Configure a password below to enable this account to sign in as a "local user."',
nopasswordsetDescriptionOwnAccount:
- 'Your account currently does not have a password specifically for {applicationTitle}.\
- Configure a password below to enable sign in as a "local user" using your email address.',
+ 'Your account currently does not have a password specifically for {applicationTitle}. Configure a password below to enable sign in as a "local user" using your email address.',
nopermission: 'Unauthorized',
nopermissionDescription:
"You do not have permission to modify this user's password.",
diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json
index 2f9002eba..7c8b2615e 100644
--- a/src/i18n/locale/en.json
+++ b/src/i18n/locale/en.json
@@ -229,7 +229,7 @@
"components.RequestModal.request4kfrom": "There is currently a pending 4K request from {username}.",
"components.RequestModal.request4ktitle": "Request {title} in 4K",
"components.RequestModal.requestCancel": "Request for {title} canceled.",
- "components.RequestModal.requestSuccess": "{title} requested.",
+ "components.RequestModal.requestSuccess": "{title} requested successfully!",
"components.RequestModal.requestadmin": "Your request will be immediately approved.",
"components.RequestModal.requestall": "Request All Seasons",
"components.RequestModal.requestcancelled": "Request canceled.",
@@ -711,7 +711,7 @@
"components.UserList.edit": "Edit",
"components.UserList.edituser": "Edit User Permissions",
"components.UserList.email": "Email Address",
- "components.UserList.importedfromplex": "{userCount, plural, =0 {No new users} one {# new user} other {# new users}} imported from Plex",
+ "components.UserList.importedfromplex": "{userCount, plural, =0 {No new users} one {# new user} other {# new users}} imported from Plex successfully!",
"components.UserList.importfromplex": "Import Users from Plex",
"components.UserList.importfromplexerror": "Something went wrong while importing users from Plex.",
"components.UserList.lastupdated": "Last Updated",
@@ -736,7 +736,7 @@
"components.UserList.user": "User",
"components.UserList.usercreatedfailed": "Something went wrong while creating the user.",
"components.UserList.usercreatedsuccess": "User created successfully!",
- "components.UserList.userdeleted": "User deleted.",
+ "components.UserList.userdeleted": "User deleted successfully!",
"components.UserList.userdeleteerror": "Something went wrong while deleting the user.",
"components.UserList.userfail": "Something went wrong while saving user permissions.",
"components.UserList.userlist": "User List",
@@ -843,7 +843,7 @@
"i18n.movies": "Movies",
"i18n.partiallyavailable": "Partially Available",
"i18n.pending": "Pending",
- "i18n.processing": "Processing…",
+ "i18n.processing": "Processing",
"i18n.request": "Request",
"i18n.requested": "Requested",
"i18n.retry": "Retry",