More Language string migration

pull/4869/head
nitsua 4 years ago committed by Qstick
parent 84e769b14e
commit be38ca4728

@ -33,7 +33,7 @@ class Blacklist extends Component {
} = this.props; } = this.props;
return ( return (
<PageContent title="Blacklist"> <PageContent title={translate('Blacklist')}>
<PageToolbar> <PageToolbar>
<PageToolbarSection> <PageToolbarSection>
<PageToolbarButton <PageToolbarButton

@ -40,19 +40,19 @@ class BlacklistDetailsModal extends Component {
<ModalBody> <ModalBody>
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
title="Name" title={translate('Name')}
data={sourceTitle} data={sourceTitle}
/> />
<DescriptionListItem <DescriptionListItem
title="Protocol" title={translate('Protocol')}
data={protocol} data={protocol}
/> />
{ {
!!message && !!message &&
<DescriptionListItem <DescriptionListItem
title="Indexer" title={translate('Indexer')}
data={indexer} data={indexer}
/> />
} }
@ -60,7 +60,7 @@ class BlacklistDetailsModal extends Component {
{ {
!!message && !!message &&
<DescriptionListItem <DescriptionListItem
title="Message" title={translate('Message')}
data={message} data={message}
/> />
} }

@ -9,6 +9,7 @@ import MovieFormats from 'Movie/MovieFormats';
import MovieLanguage from 'Movie/MovieLanguage'; import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality'; import MovieQuality from 'Movie/MovieQuality';
import MovieTitleLink from 'Movie/MovieTitleLink'; import MovieTitleLink from 'Movie/MovieTitleLink';
import translate from 'Utilities/String/translate';
import BlacklistDetailsModal from './BlacklistDetailsModal'; import BlacklistDetailsModal from './BlacklistDetailsModal';
import styles from './BlacklistRow.css'; import styles from './BlacklistRow.css';
@ -155,7 +156,7 @@ class BlacklistRow extends Component {
/> />
<IconButton <IconButton
title="Remove from blacklist" title={translate('RemoveFromBlacklist')}
name={icons.REMOVE} name={icons.REMOVE}
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onRemovePress} onPress={onRemovePress}

@ -7,6 +7,7 @@ import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionList
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import formatDateTime from 'Utilities/Date/formatDateTime'; import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge'; import formatAge from 'Utilities/Number/formatAge';
import translate from 'Utilities/String/translate';
import styles from './HistoryDetails.css'; import styles from './HistoryDetails.css';
function HistoryDetails(props) { function HistoryDetails(props) {
@ -35,14 +36,14 @@ function HistoryDetails(props) {
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Name" title={translate('Name')}
data={sourceTitle} data={sourceTitle}
/> />
{ {
!!indexer && !!indexer &&
<DescriptionListItem <DescriptionListItem
title="Indexer" title={translate('Indexer')}
data={indexer} data={indexer}
/> />
} }
@ -51,7 +52,7 @@ function HistoryDetails(props) {
!!releaseGroup && !!releaseGroup &&
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Release Group" title={translate('ReleaseGroup')}
data={releaseGroup} data={releaseGroup}
/> />
} }
@ -72,7 +73,7 @@ function HistoryDetails(props) {
{ {
!!downloadClient && !!downloadClient &&
<DescriptionListItem <DescriptionListItem
title="Download Client" title={translate('DownloadClient')}
data={downloadClient} data={downloadClient}
/> />
} }
@ -80,7 +81,7 @@ function HistoryDetails(props) {
{ {
!!downloadId && !!downloadId &&
<DescriptionListItem <DescriptionListItem
title="Grab ID" title={translate('GrabID')}
data={downloadId} data={downloadId}
/> />
} }
@ -88,7 +89,7 @@ function HistoryDetails(props) {
{ {
!!indexer && !!indexer &&
<DescriptionListItem <DescriptionListItem
title="Age (when grabbed)" title={translate('AgeWhenGrabbed')}
data={formatAge(age, ageHours, ageMinutes)} data={formatAge(age, ageHours, ageMinutes)}
/> />
} }
@ -96,7 +97,7 @@ function HistoryDetails(props) {
{ {
!!publishedDate && !!publishedDate &&
<DescriptionListItem <DescriptionListItem
title="Published Date" title={translate('PublishedDate')}
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })} data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })}
/> />
} }
@ -113,14 +114,14 @@ function HistoryDetails(props) {
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Name" title={translate('Name')}
data={sourceTitle} data={sourceTitle}
/> />
{ {
!!message && !!message &&
<DescriptionListItem <DescriptionListItem
title="Message" title={translate('Message')}
data={message} data={message}
/> />
} }
@ -138,7 +139,7 @@ function HistoryDetails(props) {
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Name" title={translate('Name')}
data={sourceTitle} data={sourceTitle}
/> />
@ -146,7 +147,7 @@ function HistoryDetails(props) {
!!droppedPath && !!droppedPath &&
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Source" title={translate('Source')}
data={droppedPath} data={droppedPath}
/> />
} }
@ -155,7 +156,7 @@ function HistoryDetails(props) {
!!importedPath && !!importedPath &&
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Imported To" title={translate('ImportedTo')}
data={importedPath} data={importedPath}
/> />
} }
@ -187,12 +188,12 @@ function HistoryDetails(props) {
return ( return (
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
title="Name" title={translate('Name')}
data={sourceTitle} data={sourceTitle}
/> />
<DescriptionListItem <DescriptionListItem
title="Reason" title={translate('Reason')}
data={reasonMessage} data={reasonMessage}
/> />
</DescriptionList> </DescriptionList>
@ -210,22 +211,22 @@ function HistoryDetails(props) {
return ( return (
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
title="Source Path" title={translate('SourcePath')}
data={sourcePath} data={sourcePath}
/> />
<DescriptionListItem <DescriptionListItem
title="Source Relative Path" title={translate('SourceRelativePath')}
data={sourceRelativePath} data={sourceRelativePath}
/> />
<DescriptionListItem <DescriptionListItem
title="Destination Path" title={translate('DestinationPath')}
data={path} data={path}
/> />
<DescriptionListItem <DescriptionListItem
title="Destination Relative Path" title={translate('DestinationRelativePath')}
data={relativePath} data={relativePath}
/> />
</DescriptionList> </DescriptionList>
@ -241,14 +242,14 @@ function HistoryDetails(props) {
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Name" title={translate('Name')}
data={sourceTitle} data={sourceTitle}
/> />
{ {
!!message && !!message &&
<DescriptionListItem <DescriptionListItem
title="Message" title={translate('Message')}
data={message} data={message}
/> />
} }
@ -260,7 +261,7 @@ function HistoryDetails(props) {
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
descriptionClassName={styles.description} descriptionClassName={styles.description}
title="Name" title={translate('Name')}
data={sourceTitle} data={sourceTitle}
/> />
</DescriptionList> </DescriptionList>

@ -43,7 +43,7 @@ class History extends Component {
const hasError = error || moviesError; const hasError = error || moviesError;
return ( return (
<PageContent title="History"> <PageContent title={translate('History')}>
<PageToolbar> <PageToolbar>
<PageToolbarSection> <PageToolbarSection>
<PageToolbarButton <PageToolbarButton

@ -149,7 +149,7 @@ class Queue extends Component {
const disableSelectedActions = selectedCount === 0; const disableSelectedActions = selectedCount === 0;
return ( return (
<PageContent title="Queue"> <PageContent title={translate('Queue')}>
<PageToolbar> <PageToolbar>
<PageToolbarSection> <PageToolbarSection>
<PageToolbarButton <PageToolbarButton
@ -162,7 +162,7 @@ class Queue extends Component {
<PageToolbarSeparator /> <PageToolbarSeparator />
<PageToolbarButton <PageToolbarButton
label="Grab Selected" label={translate('GrabSelected')}
iconName={icons.DOWNLOAD} iconName={icons.DOWNLOAD}
isDisabled={disableSelectedActions || !isPendingSelected} isDisabled={disableSelectedActions || !isPendingSelected}
isSpinning={isGrabbing} isSpinning={isGrabbing}
@ -170,7 +170,7 @@ class Queue extends Component {
/> />
<PageToolbarButton <PageToolbarButton
label="Remove Selected" label={translate('RemoveSelected')}
iconName={icons.REMOVE} iconName={icons.REMOVE}
isDisabled={disableSelectedActions} isDisabled={disableSelectedActions}
isSpinning={isRemoving} isSpinning={isRemoving}

@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import Icon from 'Components/Icon'; import Icon from 'Components/Icon';
import { icons, kinds } from 'Helpers/Props'; import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function QueueDetails(props) { function QueueDetails(props) {
const { const {
@ -57,7 +58,7 @@ function QueueDetails(props) {
<Icon <Icon
name={icons.DOWNLOADING} name={icons.DOWNLOADING}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Download failed: check download client for more details" title={translate('DownloadFailedCheckDownloadClientForMoreDetails')}
/> />
); );
} }
@ -67,7 +68,7 @@ function QueueDetails(props) {
<Icon <Icon
name={icons.DOWNLOADING} name={icons.DOWNLOADING}
kind={kinds.WARNING} kind={kinds.WARNING}
title="Download warning: check download client for more details" title={translate('DownloadWarningCheckDownloadClientForMoreDetails')}
/> />
); );
} }

@ -4,6 +4,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup'; import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel'; import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props'; import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
class QueueOptions extends Component { class QueueOptions extends Component {
@ -54,13 +55,13 @@ class QueueOptions extends Component {
return ( return (
<Fragment> <Fragment>
<FormGroup> <FormGroup>
<FormLabel>Show Unknown Movie Items</FormLabel> <FormLabel>{translate('ShowUnknownMovieItems')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="includeUnknownMovieItems" name="includeUnknownMovieItems"
value={includeUnknownMovieItems} value={includeUnknownMovieItems}
helpText="Show items without a movie in the queue, this could include removed movie, movies or anything else in Radarr's category" helpText={translate('IncludeUnknownMovieItemsHelpText')}
onChange={this.onOptionChange} onChange={this.onOptionChange}
/> />
</FormGroup> </FormGroup>

@ -15,6 +15,7 @@ import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality'; import MovieQuality from 'Movie/MovieQuality';
import MovieTitleLink from 'Movie/MovieTitleLink'; import MovieTitleLink from 'Movie/MovieTitleLink';
import formatBytes from 'Utilities/Number/formatBytes'; import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import QueueStatusCell from './QueueStatusCell'; import QueueStatusCell from './QueueStatusCell';
import RemoveQueueItemModal from './RemoveQueueItemModal'; import RemoveQueueItemModal from './RemoveQueueItemModal';
import TimeleftCell from './TimeleftCell'; import TimeleftCell from './TimeleftCell';
@ -294,7 +295,7 @@ class QueueRow extends Component {
} }
<SpinnerIconButton <SpinnerIconButton
title="Remove from queue" title={translate('RemoveFromQueue')}
name={icons.REMOVE} name={icons.REMOVE}
isSpinning={isRemoving} isSpinning={isRemoving}
onPress={this.onRemoveQueueItemPress} onPress={this.onRemoveQueueItemPress}

@ -90,25 +90,25 @@ class RemoveQueueItemModal extends Component {
</div> </div>
<FormGroup> <FormGroup>
<FormLabel>Remove From Download Client</FormLabel> <FormLabel>{translate('RemoveFromDownloadClient')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="remove" name="remove"
value={remove} value={remove}
helpTextWarning="Removing will remove the download and the file(s) from the download client." helpTextWarning={translate('RemoveHelpTextWarning')}
isDisabled={!canIgnore} isDisabled={!canIgnore}
onChange={this.onRemoveChange} onChange={this.onRemoveChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Blacklist Release</FormLabel> <FormLabel>{translate('BlacklistRelease')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="blacklist" name="blacklist"
value={blacklist} value={blacklist}
helpText="Starts a search for this movie again and prevents this release from being grabbed again" helpText={translate('BlacklistHelpText')}
onChange={this.onBlacklistChange} onChange={this.onBlacklistChange}
/> />
</FormGroup> </FormGroup>

@ -91,13 +91,13 @@ class RemoveQueueItemsModal extends Component {
</div> </div>
<FormGroup> <FormGroup>
<FormLabel>Remove From Download Client</FormLabel> <FormLabel>{translate('RemoveFromDownloadClient')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="remove" name="remove"
value={remove} value={remove}
helpTextWarning="Removing will remove the download and the file(s) from the download client." helpTextWarning={translate('RemoveHelpTextWarning')}
isDisabled={!canIgnore} isDisabled={!canIgnore}
onChange={this.onRemoveChange} onChange={this.onRemoveChange}
/> />
@ -112,7 +112,7 @@ class RemoveQueueItemsModal extends Component {
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="blacklist" name="blacklist"
value={blacklist} value={blacklist}
helpText="Prevents Radarr from automatically grabbing this movie again" helpText={translate('BlacklistHelpText')}
onChange={this.onBlacklistChange} onChange={this.onBlacklistChange}
/> />
</FormGroup> </FormGroup>

@ -88,7 +88,7 @@ class AddNewMovie extends Component {
const isFetching = this.state.isFetching; const isFetching = this.state.isFetching;
return ( return (
<PageContent title="Add New Movie"> <PageContent title={translate('AddNewMovie')}>
<PageContentBody> <PageContentBody>
<div className={styles.searchContainer}> <div className={styles.searchContainer}>
<div className={styles.searchIconContainer}> <div className={styles.searchIconContainer}>

@ -12,6 +12,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds } from 'Helpers/Props'; import { inputTypes, kinds } from 'Helpers/Props';
import MoviePoster from 'Movie/MoviePoster'; import MoviePoster from 'Movie/MoviePoster';
import translate from 'Utilities/String/translate';
import styles from './AddNewMovieModalContent.css'; import styles from './AddNewMovieModalContent.css';
class AddNewMovieModalContent extends Component { class AddNewMovieModalContent extends Component {
@ -95,7 +96,7 @@ class AddNewMovieModalContent extends Component {
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Root Folder</FormLabel> <FormLabel>{translate('RootFolder')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.ROOT_FOLDER_SELECT} type={inputTypes.ROOT_FOLDER_SELECT}
@ -128,7 +129,7 @@ class AddNewMovieModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Minimum Availability</FormLabel> <FormLabel>{translate('MinimumAvailability')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.AVAILABILITY_SELECT} type={inputTypes.AVAILABILITY_SELECT}
@ -139,7 +140,7 @@ class AddNewMovieModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Quality Profile</FormLabel> <FormLabel>{translate('QualityProfile')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.QUALITY_PROFILE_SELECT} type={inputTypes.QUALITY_PROFILE_SELECT}
@ -150,7 +151,7 @@ class AddNewMovieModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Tags</FormLabel> <FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TAG} type={inputTypes.TAG}

@ -8,6 +8,7 @@ import Tooltip from 'Components/Tooltip/Tooltip';
import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props'; import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props';
import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks'; import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import MoviePoster from 'Movie/MoviePoster'; import MoviePoster from 'Movie/MoviePoster';
import translate from 'Utilities/String/translate';
import AddNewMovieModal from './AddNewMovieModal'; import AddNewMovieModal from './AddNewMovieModal';
import styles from './AddNewMovieSearchResult.css'; import styles from './AddNewMovieSearchResult.css';
@ -107,7 +108,7 @@ class AddNewMovieSearchResult extends Component {
className={styles.alreadyExistsIcon} className={styles.alreadyExistsIcon}
name={icons.CHECK_CIRCLE} name={icons.CHECK_CIRCLE}
size={36} size={36}
title="Already in your library" title={translate('AlreadyInYourLibrary')}
/> />
} }
@ -117,7 +118,7 @@ class AddNewMovieSearchResult extends Component {
className={styles.exclusionIcon} className={styles.exclusionIcon}
name={icons.DANGER} name={icons.DANGER}
size={36} size={36}
title="Movie is on Net Import Exclusion List" title={translate('MovieIsOnNetImportExclusionList')}
/> />
} }
</div> </div>

@ -3,6 +3,7 @@ import React, { Component } from 'react';
import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent'; import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody'; import PageContentBody from 'Components/Page/PageContentBody';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds'; import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll'; import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected'; import toggleSelected from 'Utilities/Table/toggleSelected';
@ -92,7 +93,7 @@ class ImportMovie extends Component {
} = this.state; } = this.state;
return ( return (
<PageContent title="Import Movies"> <PageContent title={translate('ImportMovies')}>
<PageContentBody <PageContentBody
registerScroller={this.setScrollerRef} registerScroller={this.setScrollerRef}
onScroll={this.onScroll} onScroll={this.onScroll}

@ -6,6 +6,7 @@ import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow'; import TableRow from 'Components/Table/TableRow';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import formatBytes from 'Utilities/Number/formatBytes'; import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieRootFolderRow.css'; import styles from './ImportMovieRootFolderRow.css';
function ImportMovieRootFolderRow(props) { function ImportMovieRootFolderRow(props) {
@ -40,7 +41,7 @@ function ImportMovieRootFolderRow(props) {
<TableRowCell className={styles.actions}> <TableRowCell className={styles.actions}>
<IconButton <IconButton
title="Remove root folder" title={translate('RemoveRootFolder')}
name={icons.REMOVE} name={icons.REMOVE}
onPress={onDeletePress} onPress={onDeletePress}
/> />

@ -77,7 +77,7 @@ class ImportMovieSelectFolder extends Component {
} = this.props; } = this.props;
return ( return (
<PageContent title="Import Movies"> <PageContent title={translate('ImportMovies')}>
<PageContentBody> <PageContentBody>
{ {
isFetching && !isPopulated && isFetching && !isPopulated &&

@ -8,6 +8,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import UpdateChanges from 'System/Updates/UpdateChanges'; import UpdateChanges from 'System/Updates/UpdateChanges';
import translate from 'Utilities/String/translate';
import styles from './AppUpdatedModalContent.css'; import styles from './AppUpdatedModalContent.css';
function AppUpdatedModalContent(props) { function AppUpdatedModalContent(props) {
@ -49,12 +50,12 @@ function AppUpdatedModalContent(props) {
</div> </div>
<UpdateChanges <UpdateChanges
title="New" title={translate('New')}
changes={update.changes.new} changes={update.changes.new}
/> />
<UpdateChanges <UpdateChanges
title="Fixed" title={translate('Fixed')}
changes={update.changes.fixed} changes={update.changes.fixed}
/> />
</div> </div>

@ -7,6 +7,7 @@ import getStatusStyle from 'Calendar/getStatusStyle';
import Icon from 'Components/Icon'; import Icon from 'Components/Icon';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { icons, kinds } from 'Helpers/Props'; import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './AgendaEvent.css'; import styles from './AgendaEvent.css';
class AgendaEvent extends Component { class AgendaEvent extends Component {
@ -109,7 +110,7 @@ class AgendaEvent extends Component {
<Icon <Icon
className={styles.statusIcon} className={styles.statusIcon}
name={icons.DOWNLOADING} name={icons.DOWNLOADING}
title="Movie is downloading" title={translate('MovieIsDownloading')}
/> />
} }
@ -121,7 +122,7 @@ class AgendaEvent extends Component {
className={styles.statusIcon} className={styles.statusIcon}
name={icons.MOVIE_FILE} name={icons.MOVIE_FILE}
kind={kinds.WARNING} kind={kinds.WARNING}
title="Quality cutoff has not been met" title={translate('QualityCutoffHasNotBeenMet')}
/> />
} }
</div> </div>

@ -98,7 +98,7 @@ class CalendarPage extends Component {
const isMeasured = this.state.width > 0; const isMeasured = this.state.width > 0;
return ( return (
<PageContent title="Calendar"> <PageContent title={translate('Calendar')}>
<PageToolbar> <PageToolbar>
<PageToolbarSection> <PageToolbarSection>
<PageToolbarButton <PageToolbarButton

@ -6,6 +6,7 @@ import getStatusStyle from 'Calendar/getStatusStyle';
import Icon from 'Components/Icon'; import Icon from 'Components/Icon';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { icons, kinds } from 'Helpers/Props'; import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import CalendarEventQueueDetails from './CalendarEventQueueDetails'; import CalendarEventQueueDetails from './CalendarEventQueueDetails';
import styles from './CalendarEvent.css'; import styles from './CalendarEvent.css';
@ -85,7 +86,7 @@ class CalendarEvent extends Component {
<Icon <Icon
className={styles.statusIcon} className={styles.statusIcon}
name={icons.DOWNLOADING} name={icons.DOWNLOADING}
title="movie is downloading" title={translate('MovieIsDownloading')}
/> />
} }
@ -97,7 +98,7 @@ class CalendarEvent extends Component {
className={styles.statusIcon} className={styles.statusIcon}
name={icons.MOVIE_FILE} name={icons.MOVIE_FILE}
kind={kinds.WARNING} kind={kinds.WARNING}
title="Quality cutoff has not been met" title={translate('QualityCutoffHasNotBeenMet')}
/> />
} }
</div> </div>

@ -111,38 +111,38 @@ class CalendarOptionsModalContent extends Component {
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<FieldSet legend="Local"> <FieldSet legend={translate('Local')}>
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Show Movie Information</FormLabel> <FormLabel>{translate('ShowMovieInformation')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="showMovieInformation" name="showMovieInformation"
value={showMovieInformation} value={showMovieInformation}
helpText="Show movie genres and certification" helpText={translate('ShowMovieInformationHelpText')}
onChange={this.onOptionInputChange} onChange={this.onOptionInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Icon for Cutoff Unmet</FormLabel> <FormLabel>{translate('IconForCutoffUnmet')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="showCutoffUnmetIcon" name="showCutoffUnmetIcon"
value={showCutoffUnmetIcon} value={showCutoffUnmetIcon}
helpText="Show icon for files when the cutoff hasn't been met" helpText={translate('ShowCutoffUnmetIconHelpText')}
onChange={this.onOptionInputChange} onChange={this.onOptionInputChange}
/> />
</FormGroup> </FormGroup>
</Form> </Form>
</FieldSet> </FieldSet>
<FieldSet legend="Global"> <FieldSet legend={translate('Global')}>
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>First Day of Week</FormLabel> <FormLabel>{translate('FirstDayOfWeek')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -154,7 +154,7 @@ class CalendarOptionsModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Week Column Header</FormLabel> <FormLabel>{translate('WeekColumnHeader')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -162,12 +162,12 @@ class CalendarOptionsModalContent extends Component {
values={weekColumnOptions} values={weekColumnOptions}
value={calendarWeekColumnHeader} value={calendarWeekColumnHeader}
onChange={this.onGlobalInputChange} onChange={this.onGlobalInputChange}
helpText="Shown above each column when week is the active view" helpText={translate('HelpText')}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Time Format</FormLabel> <FormLabel>{translate('TimeFormat')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -177,13 +177,13 @@ class CalendarOptionsModalContent extends Component {
onChange={this.onGlobalInputChange} onChange={this.onGlobalInputChange}
/> />
</FormGroup><FormGroup> </FormGroup><FormGroup>
<FormLabel>Enable Color-Impaired Mode</FormLabel> <FormLabel>{translate('EnableColorImpairedMode')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enableColorImpairedMode" name="enableColorImpairedMode"
value={enableColorImpairedMode} value={enableColorImpairedMode}
helpText="Altered style to allow color-impaired users to better distinguish color coded information" helpText={translate('EnableColorImpairedModeHelpText')}
onChange={this.onGlobalInputChange} onChange={this.onGlobalInputChange}
/> />
</FormGroup> </FormGroup>

@ -115,37 +115,37 @@ class CalendarLinkModalContent extends Component {
<ModalBody> <ModalBody>
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Include Unmonitored</FormLabel> <FormLabel>{translate('IncludeUnmonitored')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="unmonitored" name="unmonitored"
value={unmonitored} value={unmonitored}
helpText="Include unmonitored movies in the iCal feed" helpText={translate('UnmonitoredHelpText')}
onChange={this.onInputChange} onChange={this.onInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Show as All-Day Events</FormLabel> <FormLabel>{translate('ShowAsAllDayEvents')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="asAllDay" name="asAllDay"
value={asAllDay} value={asAllDay}
helpText="Events will appear as all-day events in your calendar" helpText={translate('AsAllDayHelpText')}
onChange={this.onInputChange} onChange={this.onInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Tags</FormLabel> <FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TAG} type={inputTypes.TAG}
name="tags" name="tags"
value={tags} value={tags}
helpText="Feed will only contain movies with at least one matching tag" helpText={translate('TagsHelpText')}
onChange={this.onInputChange} onChange={this.onInputChange}
/> />
</FormGroup> </FormGroup>
@ -153,14 +153,14 @@ class CalendarLinkModalContent extends Component {
<FormGroup <FormGroup
size={sizes.LARGE} size={sizes.LARGE}
> >
<FormLabel>iCal Feed</FormLabel> <FormLabel>{translate('ICalFeed')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="iCalHttpUrl" name="iCalHttpUrl"
value={iCalHttpUrl} value={iCalHttpUrl}
readOnly={true} readOnly={true}
helpText="Copy this URL to your client(s) or click to subscribe if your browser supports webcal" helpText={translate('ICalHttpUrlHelpText')}
buttons={[ buttons={[
<ClipboardButton <ClipboardButton
key="copy" key="copy"

@ -3,6 +3,7 @@ import React, { Component } from 'react';
import IconButton from 'Components/Link/IconButton'; import IconButton from 'Components/Link/IconButton';
import SpinnerIconButton from 'Components/Link/SpinnerIconButton'; import SpinnerIconButton from 'Components/Link/SpinnerIconButton';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './CustomFilter.css'; import styles from './CustomFilter.css';
class CustomFilter extends Component { class CustomFilter extends Component {
@ -89,7 +90,7 @@ class CustomFilter extends Component {
/> />
<SpinnerIconButton <SpinnerIconButton
title="Remove filter" title={translate('RemoveFilter')}
name={icons.REMOVE} name={icons.REMOVE}
isSpinning={this.state.isDeleting} isSpinning={this.state.isDeleting}
onPress={this.onRemovePress} onPress={this.onRemovePress}

@ -153,7 +153,7 @@ function FormInputGroup(props) {
<Icon <Icon
name={icons.UNSAVED_SETTING} name={icons.UNSAVED_SETTING}
className={styles.pendingChangesIcon} className={styles.pendingChangesIcon}
title="Change has not been saved yet" title={translate('ChangeHasNotBeenSavedYet')}
/> />
} }
</div> */} </div> */}

@ -1,11 +1,12 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import PageContent from 'Components/Page/PageContent'; import PageContent from 'Components/Page/PageContent';
import translate from 'Utilities/String/translate';
import styles from './NotFound.css'; import styles from './NotFound.css';
function NotFound({ message }) { function NotFound({ message }) {
return ( return (
<PageContent title="MIA"> <PageContent title={translate('MIA')}>
<div className={styles.container}> <div className={styles.container}>
<div className={styles.message}> <div className={styles.message}>
{message} {message}

@ -4,6 +4,7 @@ import keyboardShortcuts, { shortcuts } from 'Components/keyboardShortcuts';
import IconButton from 'Components/Link/IconButton'; import IconButton from 'Components/Link/IconButton';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import KeyboardShortcutsModal from './KeyboardShortcutsModal'; import KeyboardShortcutsModal from './KeyboardShortcutsModal';
import MovieSearchInputConnector from './MovieSearchInputConnector'; import MovieSearchInputConnector from './MovieSearchInputConnector';
import PageHeaderActionsMenuConnector from './PageHeaderActionsMenuConnector'; import PageHeaderActionsMenuConnector from './PageHeaderActionsMenuConnector';
@ -79,7 +80,7 @@ class PageHeader extends Component {
/> />
<IconButton <IconButton
className={styles.translate} className={styles.translate}
title="Suggest translation change" title={translate('SuggestTranslationChange')}
name={icons.TRANSLATE} name={icons.TRANSLATE}
to="https://translate.servarr.com/projects/radarr/radarr/" to="https://translate.servarr.com/projects/radarr/radarr/"
size={24} size={24}

@ -151,7 +151,7 @@ class TableOptionsModal extends Component {
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="pageSize" name="pageSize"
value={pageSize || 0} value={pageSize || 0}
helpText="Number of items to show on each page" helpText={translate('PageSizeHelpText')}
errors={pageSizeError ? [{ message: pageSizeError }] : undefined} errors={pageSizeError ? [{ message: pageSizeError }] : undefined}
onChange={this.onPageSizeChange} onChange={this.onPageSizeChange}
/> />

@ -13,6 +13,7 @@ import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import MoviePoster from 'Movie/MoviePoster'; import MoviePoster from 'Movie/MoviePoster';
import dimensions from 'Styles/Variables/dimensions'; import dimensions from 'Styles/Variables/dimensions';
import fonts from 'Styles/Variables/fonts'; import fonts from 'Styles/Variables/fonts';
import translate from 'Utilities/String/translate';
import styles from './AddListMovieOverview.css'; import styles from './AddListMovieOverview.css';
const columnPadding = parseInt(dimensions.movieIndexColumnPadding); const columnPadding = parseInt(dimensions.movieIndexColumnPadding);
@ -163,7 +164,7 @@ class AddListMovieOverview extends Component {
size={12} size={12}
/> />
} }
title="Links" title={translate('Links')}
body={ body={
<MovieDetailsLinks <MovieDetailsLinks
tmdbId={tmdbId} tmdbId={tmdbId}

@ -87,7 +87,7 @@ class AddListMovieOverviewOptionsModalContent extends Component {
<ModalBody> <ModalBody>
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Poster Size</FormLabel> <FormLabel>{translate('PosterSize')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -99,7 +99,7 @@ class AddListMovieOverviewOptionsModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Show Studio</FormLabel> <FormLabel>{translate('ShowStudio')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}

@ -11,6 +11,7 @@ import ExcludeMovieModal from 'DiscoverMovie/Exclusion/ExcludeMovieModal';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks'; import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import MoviePoster from 'Movie/MoviePoster'; import MoviePoster from 'Movie/MoviePoster';
import translate from 'Utilities/String/translate';
import styles from './AddListMoviePoster.css'; import styles from './AddListMoviePoster.css';
class AddListMoviePoster extends Component { class AddListMoviePoster extends Component {
@ -133,7 +134,7 @@ class AddListMoviePoster extends Component {
size={12} size={12}
/> />
} }
title="Links" title={translate('Links')}
body={ body={
<MovieDetailsLinks <MovieDetailsLinks
tmdbId={tmdbId} tmdbId={tmdbId}
@ -149,7 +150,7 @@ class AddListMoviePoster extends Component {
isExcluded && isExcluded &&
<div <div
className={styles.excluded} className={styles.excluded}
title="Exluded" title={translate('Exluded')}
/> />
} }

@ -87,7 +87,7 @@ class AddListMoviePosterOptionsModalContent extends Component {
<ModalBody> <ModalBody>
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Poster Size</FormLabel> <FormLabel>{translate('PosterSize')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -99,13 +99,13 @@ class AddListMoviePosterOptionsModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Show Title</FormLabel> <FormLabel>{translate('ShowTitle')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="showTitle" name="showTitle"
value={showTitle} value={showTitle}
helpText="Show movie title under poster" helpText={translate('ShowTitleHelpText')}
onChange={this.onChangePosterOption} onChange={this.onChangePosterOption}
/> />
</FormGroup> </FormGroup>

@ -12,6 +12,7 @@ import AddNewDiscoverMovieModal from 'DiscoverMovie/AddNewDiscoverMovieModal';
import ExcludeMovieModal from 'DiscoverMovie/Exclusion/ExcludeMovieModal'; import ExcludeMovieModal from 'DiscoverMovie/Exclusion/ExcludeMovieModal';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks'; import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import translate from 'Utilities/String/translate';
import ListMovieStatusCell from './ListMovieStatusCell'; import ListMovieStatusCell from './ListMovieStatusCell';
import styles from './AddListMovieRow.css'; import styles from './AddListMovieRow.css';
@ -218,7 +219,7 @@ class AddListMovieRow extends Component {
size={12} size={12}
/> />
} }
title="Links" title={translate('Links')}
body={ body={
<MovieDetailsLinks <MovieDetailsLinks
tmdbId={tmdbId} tmdbId={tmdbId}

@ -5,6 +5,7 @@ import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellCo
import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRowButton from 'Components/Table/TableRowButton'; import TableRowButton from 'Components/Table/TableRowButton';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './RecentFolderRow.css'; import styles from './RecentFolderRow.css';
class RecentFolderRow extends Component { class RecentFolderRow extends Component {
@ -44,7 +45,7 @@ class RecentFolderRow extends Component {
<TableRowCell className={styles.actions}> <TableRowCell className={styles.actions}>
<IconButton <IconButton
title="Remove" title={translate('Remove')}
name={icons.REMOVE} name={icons.REMOVE}
onPress={this.onRemovePress} onPress={this.onRemovePress}
/> />

@ -14,6 +14,7 @@ import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
import MovieLanguage from 'Movie/MovieLanguage'; import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality'; import MovieQuality from 'Movie/MovieQuality';
import formatBytes from 'Utilities/Number/formatBytes'; import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import InteractiveImportRowCellPlaceholder from './InteractiveImportRowCellPlaceholder'; import InteractiveImportRowCellPlaceholder from './InteractiveImportRowCellPlaceholder';
import styles from './InteractiveImportRow.css'; import styles from './InteractiveImportRow.css';
@ -182,7 +183,7 @@ class InteractiveImportRow extends Component {
<TableRowCellButton <TableRowCellButton
className={styles.quality} className={styles.quality}
title="Click to change quality" title={translate('ClickToChangeQuality')}
onPress={this.onSelectQualityPress} onPress={this.onSelectQualityPress}
> >
{ {
@ -201,7 +202,7 @@ class InteractiveImportRow extends Component {
<TableRowCellButton <TableRowCellButton
className={styles.language} className={styles.language}
title="Click to change language" title={translate('ClickToChangeLanguage')}
onPress={this.onSelectLanguagePress} onPress={this.onSelectLanguagePress}
> >
{ {
@ -241,7 +242,7 @@ class InteractiveImportRow extends Component {
kind={kinds.DANGER} kind={kinds.DANGER}
/> />
} }
title="Release Rejected" title={translate('ReleaseRejected')}
body={ body={
<ul> <ul>
{ {

@ -99,7 +99,7 @@ class SelectQualityModalContent extends Component {
isPopulated && !error && isPopulated && !error &&
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Quality</FormLabel> <FormLabel>{translate('Quality')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -111,7 +111,7 @@ class SelectQualityModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Proper</FormLabel> <FormLabel>{translate('Proper')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@ -122,7 +122,7 @@ class SelectQualityModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Real</FormLabel> <FormLabel>{translate('Real')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}

@ -15,6 +15,7 @@ import MovieQuality from 'Movie/MovieQuality';
import formatDateTime from 'Utilities/Date/formatDateTime'; import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge'; import formatAge from 'Utilities/Number/formatAge';
import formatBytes from 'Utilities/Number/formatBytes'; import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import Peers from './Peers'; import Peers from './Peers';
import styles from './InteractiveSearchRow.css'; import styles from './InteractiveSearchRow.css';
@ -203,7 +204,7 @@ class InteractiveSearchRow extends Component {
kind={kinds.PRIMARY} kind={kinds.PRIMARY}
/> />
} }
title="Indexer Flags" title={translate('IndexerFlags')}
body={ body={
<ul> <ul>
{ {
@ -232,7 +233,7 @@ class InteractiveSearchRow extends Component {
kind={kinds.DANGER} kind={kinds.DANGER}
/> />
} }
title="Release Rejected" title={translate('ReleaseRejected')}
body={ body={
<ul> <ul>
{ {
@ -265,9 +266,9 @@ class InteractiveSearchRow extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isConfirmGrabModalOpen} isOpen={this.state.isConfirmGrabModalOpen}
kind={kinds.WARNING} kind={kinds.WARNING}
title="Grab Release" title={translate('GrabRelease')}
message={`Radarr was unable to determine which movie this release was for. Radarr may be unable to automatically import this release. Do you want to grab '${title}'?`} message={`Radarr was unable to determine which movie this release was for. Radarr may be unable to automatically import this release. Do you want to grab '${title}'?`}
confirmLabel="Grab" confirmLabel={translate('Grab')}
onConfirm={this.onGrabConfirm} onConfirm={this.onGrabConfirm}
onCancel={this.onGrabCancel} onCancel={this.onGrabCancel}
/> />

@ -5,6 +5,7 @@ import IconButton from 'Components/Link/IconButton';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import MovieHeadshot from 'Movie/MovieHeadshot'; import MovieHeadshot from 'Movie/MovieHeadshot';
import EditNetImportModalConnector from 'Settings/NetImport/NetImport/EditNetImportModalConnector'; import EditNetImportModalConnector from 'Settings/NetImport/NetImport/EditNetImportModalConnector';
import translate from 'Utilities/String/translate';
import styles from '../MovieCreditPoster.css'; import styles from '../MovieCreditPoster.css';
class MovieCastPoster extends Component { class MovieCastPoster extends Component {
@ -87,13 +88,13 @@ class MovieCastPoster extends Component {
<IconButton <IconButton
className={styles.action} className={styles.action}
name={icons.EDIT} name={icons.EDIT}
title="Edit Person" title={translate('EditPerson')}
onPress={this.onEditNetImportPress} onPress={this.onEditNetImportPress}
/> : /> :
<IconButton <IconButton
className={styles.action} className={styles.action}
name={icons.ADD} name={icons.ADD}
title="Follow Person" title={translate('FollowPerson')}
onPress={this.onAddNetImportPress} onPress={this.onAddNetImportPress}
/> />
} }

@ -5,6 +5,7 @@ import IconButton from 'Components/Link/IconButton';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import MovieHeadshot from 'Movie/MovieHeadshot'; import MovieHeadshot from 'Movie/MovieHeadshot';
import EditNetImportModalConnector from 'Settings/NetImport/NetImport/EditNetImportModalConnector'; import EditNetImportModalConnector from 'Settings/NetImport/NetImport/EditNetImportModalConnector';
import translate from 'Utilities/String/translate';
import styles from '../MovieCreditPoster.css'; import styles from '../MovieCreditPoster.css';
class MovieCrewPoster extends Component { class MovieCrewPoster extends Component {
@ -87,13 +88,13 @@ class MovieCrewPoster extends Component {
<IconButton <IconButton
className={styles.action} className={styles.action}
name={icons.EDIT} name={icons.EDIT}
title="Edit Person" title={translate('EditPerson')}
onPress={this.onEditNetImportPress} onPress={this.onEditNetImportPress}
/> : /> :
<IconButton <IconButton
className={styles.action} className={styles.action}
name={icons.ADD} name={icons.ADD}
title="Follow Person" title={translate('FollowPerson')}
onPress={this.onAddNetImportPress} onPress={this.onAddNetImportPress}
/> />
} }

@ -291,7 +291,7 @@ class MovieDetails extends Component {
label={translate('RefreshAndScan')} label={translate('RefreshAndScan')}
iconName={icons.REFRESH} iconName={icons.REFRESH}
spinningName={icons.REFRESH} spinningName={icons.REFRESH}
title="Refresh information and scan disk" title={translate('RefreshInformationAndScanDisk')}
isSpinning={isRefreshing} isSpinning={isRefreshing}
onPress={onRefreshPress} onPress={onRefreshPress}
/> />
@ -410,7 +410,7 @@ class MovieDetails extends Component {
anchor={ anchor={
year year
} }
title="Release Dates" title={translate('ReleaseDates')}
body={ body={
<MovieReleaseDatesConnector <MovieReleaseDatesConnector
inCinemas={inCinemas} inCinemas={inCinemas}
@ -450,7 +450,7 @@ class MovieDetails extends Component {
size={20} size={20}
/> />
} }
title="Links" title={translate('Links')}
body={ body={
<MovieDetailsLinks <MovieDetailsLinks
tmdbId={tmdbId} tmdbId={tmdbId}
@ -473,7 +473,7 @@ class MovieDetails extends Component {
size={20} size={20}
/> />
} }
title="Tags" title={translate('Tags')}
body={ body={
<MovieTagsConnector movieId={id} /> <MovieTagsConnector movieId={id} />
} }

@ -9,6 +9,7 @@ import NotFound from 'Components/NotFound';
import PageContent from 'Components/Page/PageContent'; import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody'; import PageContentBody from 'Components/Page/PageContentBody';
import getErrorMessage from 'Utilities/Object/getErrorMessage'; import getErrorMessage from 'Utilities/Object/getErrorMessage';
import translate from 'Utilities/String/translate';
import MovieDetailsConnector from './MovieDetailsConnector'; import MovieDetailsConnector from './MovieDetailsConnector';
import styles from './MovieDetails.css'; import styles from './MovieDetails.css';
@ -92,7 +93,7 @@ class MovieDetailsPageConnector extends Component {
if (!titleSlug) { if (!titleSlug) {
return ( return (
<NotFound <NotFound
message="Sorry, that movie cannot be found." message={translate('SorryThatMovieCannotBeFound')}
/> />
); );
} }

@ -92,7 +92,7 @@ class EditMovieModalContent extends Component {
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="monitored" name="monitored"
helpText="Download movie if available" helpText={translate('MonitoredHelpText')}
{...monitored} {...monitored}
onChange={onInputChange} onChange={onInputChange}
/> />

@ -79,13 +79,13 @@ class DeleteMovieModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Add List Exclusion</FormLabel> <FormLabel>{translate('AddListExclusion')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="addNetImportExclusion" name="addNetImportExclusion"
value={addNetImportExclusion} value={addNetImportExclusion}
helpText="Prevent movie from being added to Radarr by lists" helpText={translate('AddNetImportExclusionHelpText')}
kind={kinds.DANGER} kind={kinds.DANGER}
onChange={this.onAddNetImportExclusionChange} onChange={this.onAddNetImportExclusionChange}
/> />

@ -75,7 +75,7 @@ class TagsModalContent extends Component {
<ModalBody> <ModalBody>
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Tags</FormLabel> <FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TAG} type={inputTypes.TAG}
@ -86,7 +86,7 @@ class TagsModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Apply Tags</FormLabel> <FormLabel>{translate('ApplyTags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -104,7 +104,7 @@ class TagsModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Result</FormLabel> <FormLabel>{translate('Result')}</FormLabel>
<div className={styles.result}> <div className={styles.result}>
{ {

@ -11,6 +11,7 @@ import { icons, kinds } from 'Helpers/Props';
import MovieFormats from 'Movie/MovieFormats'; import MovieFormats from 'Movie/MovieFormats';
import MovieLanguage from 'Movie/MovieLanguage'; import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality'; import MovieQuality from 'Movie/MovieQuality';
import translate from 'Utilities/String/translate';
import styles from './MovieHistoryRow.css'; import styles from './MovieHistoryRow.css';
class MovieHistoryRow extends Component { class MovieHistoryRow extends Component {
@ -117,7 +118,7 @@ class MovieHistoryRow extends Component {
{ {
eventType === 'grabbed' && eventType === 'grabbed' &&
<IconButton <IconButton
title="Mark as failed" title={translate('MarkAsFailed')}
name={icons.REMOVE} name={icons.REMOVE}
onPress={this.onMarkAsFailedPress} onPress={this.onMarkAsFailedPress}
/> />
@ -127,9 +128,9 @@ class MovieHistoryRow extends Component {
<ConfirmModal <ConfirmModal
isOpen={isMarkAsFailedModalOpen} isOpen={isMarkAsFailedModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Mark as Failed" title={translate('MarkAsFailed')}
message={`Are you sure you want to mark '${sourceTitle}' as failed?`} message={`Are you sure you want to mark '${sourceTitle}' as failed?`}
confirmLabel="Mark as Failed" confirmLabel={translate('MarkAsFailed')}
onConfirm={this.onConfirmMarkAsFailed} onConfirm={this.onConfirmMarkAsFailed}
onCancel={this.onMarkAsFailedModalClose} onCancel={this.onMarkAsFailedModalClose}
/> />

@ -4,6 +4,7 @@ import React, { PureComponent } from 'react';
import DescriptionList from 'Components/DescriptionList/DescriptionList'; import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem'; import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import formatBytes from 'Utilities/Number/formatBytes'; import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import styles from './MovieIndexFooter.css'; import styles from './MovieIndexFooter.css';
class MovieIndexFooter extends PureComponent { class MovieIndexFooter extends PureComponent {
@ -78,31 +79,31 @@ class MovieIndexFooter extends PureComponent {
<div className={styles.statistics}> <div className={styles.statistics}>
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
title="Movies" title={translate('Movies')}
data={count} data={count}
/> />
<DescriptionListItem <DescriptionListItem
title="Movie Files" title={translate('MovieFiles')}
data={movieFiles} data={movieFiles}
/> />
</DescriptionList> </DescriptionList>
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
title="Monitored" title={translate('Monitored')}
data={monitored} data={monitored}
/> />
<DescriptionListItem <DescriptionListItem
title="Unmonitored" title={translate('Unmonitored')}
data={count - monitored} data={count - monitored}
/> />
</DescriptionList> </DescriptionList>
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
title="Total File Size" title={translate('TotalFileSize')}
data={formatBytes(totalFileSize)} data={formatBytes(totalFileSize)}
/> />
</DescriptionList> </DescriptionList>

@ -15,6 +15,7 @@ import MovieIndexProgressBar from 'Movie/Index/ProgressBar/MovieIndexProgressBar
import MoviePoster from 'Movie/MoviePoster'; import MoviePoster from 'Movie/MoviePoster';
import dimensions from 'Styles/Variables/dimensions'; import dimensions from 'Styles/Variables/dimensions';
import fonts from 'Styles/Variables/fonts'; import fonts from 'Styles/Variables/fonts';
import translate from 'Utilities/String/translate';
import MovieIndexOverviewInfo from './MovieIndexOverviewInfo'; import MovieIndexOverviewInfo from './MovieIndexOverviewInfo';
import styles from './MovieIndexOverview.css'; import styles from './MovieIndexOverview.css';
@ -190,7 +191,7 @@ class MovieIndexOverview extends Component {
size={12} size={12}
/> />
} }
title="Links" title={translate('Links')}
body={ body={
<MovieDetailsLinks <MovieDetailsLinks
tmdbId={tmdbId} tmdbId={tmdbId}
@ -203,7 +204,7 @@ class MovieIndexOverview extends Component {
<SpinnerIconButton <SpinnerIconButton
name={icons.REFRESH} name={icons.REFRESH}
title="Refresh Movie" title={translate('RefreshMovie')}
isSpinning={isRefreshingMovie} isSpinning={isRefreshingMovie}
onPress={onRefreshMoviePress} onPress={onRefreshMoviePress}
/> />
@ -213,7 +214,7 @@ class MovieIndexOverview extends Component {
<SpinnerIconButton <SpinnerIconButton
className={styles.action} className={styles.action}
name={icons.SEARCH} name={icons.SEARCH}
title="Search for movie" title={translate('SearchForMovie')}
isSpinning={isSearchingMovie} isSpinning={isSearchingMovie}
onPress={onSearchPress} onPress={onSearchPress}
/> />
@ -221,7 +222,7 @@ class MovieIndexOverview extends Component {
<IconButton <IconButton
name={icons.EDIT} name={icons.EDIT}
title="Edit Movie" title={translate('EditMovie')}
onPress={this.onEditMoviePress} onPress={this.onEditMoviePress}
/> />
</div> </div>

@ -13,6 +13,7 @@ import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector'; import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector';
import MovieIndexProgressBar from 'Movie/Index/ProgressBar/MovieIndexProgressBar'; import MovieIndexProgressBar from 'Movie/Index/ProgressBar/MovieIndexProgressBar';
import MoviePoster from 'Movie/MoviePoster'; import MoviePoster from 'Movie/MoviePoster';
import translate from 'Utilities/String/translate';
import MovieIndexPosterInfo from './MovieIndexPosterInfo'; import MovieIndexPosterInfo from './MovieIndexPosterInfo';
import styles from './MovieIndexPoster.css'; import styles from './MovieIndexPoster.css';
@ -141,7 +142,7 @@ class MovieIndexPoster extends Component {
<SpinnerIconButton <SpinnerIconButton
className={styles.action} className={styles.action}
name={icons.REFRESH} name={icons.REFRESH}
title="Refresh movie" title={translate('RefreshMovie')}
isSpinning={isRefreshingMovie} isSpinning={isRefreshingMovie}
onPress={onRefreshMoviePress} onPress={onRefreshMoviePress}
/> />
@ -151,7 +152,7 @@ class MovieIndexPoster extends Component {
<SpinnerIconButton <SpinnerIconButton
className={styles.action} className={styles.action}
name={icons.SEARCH} name={icons.SEARCH}
title="Search for movie" title={translate('SearchForMovie')}
isSpinning={isSearchingMovie} isSpinning={isSearchingMovie}
onPress={onSearchPress} onPress={onSearchPress}
/> />
@ -160,7 +161,7 @@ class MovieIndexPoster extends Component {
<IconButton <IconButton
className={styles.action} className={styles.action}
name={icons.EDIT} name={icons.EDIT}
title="Edit movie" title={translate('EditMovie')}
onPress={this.onEditMoviePress} onPress={this.onEditMoviePress}
/> />
@ -172,7 +173,7 @@ class MovieIndexPoster extends Component {
size={12} size={12}
/> />
} }
title="Links" title={translate('Links')}
body={ body={
<MovieDetailsLinks <MovieDetailsLinks
tmdbId={tmdbId} tmdbId={tmdbId}
@ -188,7 +189,7 @@ class MovieIndexPoster extends Component {
status === 'ended' && status === 'ended' &&
<div <div
className={styles.ended} className={styles.ended}
title="Ended" title={translate('Ended')}
/> />
} }

@ -145,7 +145,7 @@ class MovieIndexPosterOptionsModalContent extends Component {
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="showTitle" name="showTitle"
value={showTitle} value={showTitle}
helpText="Show movie title under poster" helpText={translate('ShowTitleHelpText')}
onChange={this.onChangePosterOption} onChange={this.onChangePosterOption}
/> />
</FormGroup> </FormGroup>
@ -157,7 +157,7 @@ class MovieIndexPosterOptionsModalContent extends Component {
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="showMonitored" name="showMonitored"
value={showMonitored} value={showMonitored}
helpText="Show monitored status under poster" helpText={translate('ShowMonitoredHelpText')}
onChange={this.onChangePosterOption} onChange={this.onChangePosterOption}
/> />
</FormGroup> </FormGroup>
@ -169,7 +169,7 @@ class MovieIndexPosterOptionsModalContent extends Component {
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="showQualityProfile" name="showQualityProfile"
value={showQualityProfile} value={showQualityProfile}
helpText="Show quality profile under poster" helpText={translate('ShowQualityProfileHelpText')}
onChange={this.onChangePosterOption} onChange={this.onChangePosterOption}
/> />
</FormGroup> </FormGroup>

@ -6,6 +6,7 @@ import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal'; import DeleteMovieModal from 'Movie/Delete/DeleteMovieModal';
import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector'; import EditMovieModalConnector from 'Movie/Edit/EditMovieModalConnector';
import translate from 'Utilities/String/translate';
class MovieIndexActionsCell extends Component { class MovieIndexActionsCell extends Component {
@ -65,14 +66,14 @@ class MovieIndexActionsCell extends Component {
> >
<SpinnerIconButton <SpinnerIconButton
name={icons.REFRESH} name={icons.REFRESH}
title="Refresh Movie" title={translate('RefreshMovie')}
isSpinning={isRefreshingMovie} isSpinning={isRefreshingMovie}
onPress={onRefreshMoviePress} onPress={onRefreshMoviePress}
/> />
<IconButton <IconButton
name={icons.EDIT} name={icons.EDIT}
title="Edit Movie" title={translate('EditMovie')}
onPress={this.onEditMoviePress} onPress={this.onEditMoviePress}
/> />

@ -18,6 +18,7 @@ import MovieTitleLink from 'Movie/MovieTitleLink';
import formatRuntime from 'Utilities/Date/formatRuntime'; import formatRuntime from 'Utilities/Date/formatRuntime';
import formatBytes from 'Utilities/Number/formatBytes'; import formatBytes from 'Utilities/Number/formatBytes';
import titleCase from 'Utilities/String/titleCase'; import titleCase from 'Utilities/String/titleCase';
import translate from 'Utilities/String/translate';
import MovieStatusCell from './MovieStatusCell'; import MovieStatusCell from './MovieStatusCell';
import styles from './MovieIndexRow.css'; import styles from './MovieIndexRow.css';
@ -369,7 +370,7 @@ class MovieIndexRow extends Component {
size={12} size={12}
/> />
} }
title="Links" title={translate('Links')}
body={ body={
<MovieDetailsLinks <MovieDetailsLinks
tmdbId={tmdbId} tmdbId={tmdbId}
@ -382,7 +383,7 @@ class MovieIndexRow extends Component {
<SpinnerIconButton <SpinnerIconButton
name={icons.REFRESH} name={icons.REFRESH}
title="Refresh movie" title={translate('RefreshMovie')}
isSpinning={isRefreshingMovie} isSpinning={isRefreshingMovie}
onPress={onRefreshMoviePress} onPress={onRefreshMoviePress}
/> />
@ -392,7 +393,7 @@ class MovieIndexRow extends Component {
<SpinnerIconButton <SpinnerIconButton
className={styles.action} className={styles.action}
name={icons.SEARCH} name={icons.SEARCH}
title="Search for movie" title={translate('SearchForMovie')}
isSpinning={isSearchingMovie} isSpinning={isSearchingMovie}
onPress={onSearchPress} onPress={onSearchPress}
/> />
@ -400,7 +401,7 @@ class MovieIndexRow extends Component {
<IconButton <IconButton
name={icons.EDIT} name={icons.EDIT}
title="Edit Movie" title={translate('EditMovie')}
onPress={this.onEditMoviePress} onPress={this.onEditMoviePress}
/> />
</VirtualTableRowCell> </VirtualTableRowCell>

@ -6,6 +6,7 @@ import Label from 'Components/Label';
import ProgressBar from 'Components/ProgressBar'; import ProgressBar from 'Components/ProgressBar';
import { icons, kinds, sizes } from 'Helpers/Props'; import { icons, kinds, sizes } from 'Helpers/Props';
import MovieQuality from 'Movie/MovieQuality'; import MovieQuality from 'Movie/MovieQuality';
import translate from 'Utilities/String/translate';
import styles from './MovieFileStatus.css'; import styles from './MovieFileStatus.css';
function MovieFileStatus(props) { function MovieFileStatus(props) {
@ -51,7 +52,7 @@ function MovieFileStatus(props) {
<div className={styles.center}> <div className={styles.center}>
<Icon <Icon
name={icons.DOWNLOADING} name={icons.DOWNLOADING}
title="Movie is downloading" title={translate('MovieIsDownloading')}
/> />
</div> </div>
); );
@ -77,7 +78,7 @@ function MovieFileStatus(props) {
return ( return (
<div className={styles.center}> <div className={styles.center}>
<Label <Label
title="Not Monitored" title={translate('NotMonitored')}
kind={kinds.WARNING} kind={kinds.WARNING}
> >
Not Monitored Not Monitored
@ -90,7 +91,7 @@ function MovieFileStatus(props) {
return ( return (
<div className={styles.center}> <div className={styles.center}>
<Label <Label
title="Movie Available, but Missing" title={translate('MovieAvailableButMissing')}
kind={kinds.DANGER} kind={kinds.DANGER}
> >
Missing Missing
@ -102,7 +103,7 @@ function MovieFileStatus(props) {
return ( return (
<div className={styles.center}> <div className={styles.center}>
<Label <Label
title="Not Available" title={translate('NotAvailable')}
kind={kinds.INFO} kind={kinds.INFO}
> >
Not Available Not Available

@ -3,6 +3,7 @@ import React from 'react';
import Label from 'Components/Label'; import Label from 'Components/Label';
import Popover from 'Components/Tooltip/Popover'; import Popover from 'Components/Tooltip/Popover';
import { kinds, tooltipPositions } from 'Helpers/Props'; import { kinds, tooltipPositions } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function MovieLanguage(props) { function MovieLanguage(props) {
const { const {
@ -37,7 +38,7 @@ function MovieLanguage(props) {
Multi-Language Multi-Language
</Label> </Label>
} }
title="Languages" title={translate('Languages')}
body={ body={
<ul> <ul>
{ {

@ -134,7 +134,7 @@ class MovieFileEditorRow extends Component {
<TableRowCellButton <TableRowCellButton
className={styles.language} className={styles.language}
title="Click to change language" title={translate('ClickToChangeLanguage')}
onPress={this.onSelectLanguagePress} onPress={this.onSelectLanguagePress}
> >
{ {
@ -153,7 +153,7 @@ class MovieFileEditorRow extends Component {
<TableRowCellButton <TableRowCellButton
className={styles.quality} className={styles.quality}
title="Click to change quality" title={translate('ClickToChangeQuality')}
onPress={this.onSelectQualityPress} onPress={this.onSelectQualityPress}
> >
{ {
@ -186,7 +186,7 @@ class MovieFileEditorRow extends Component {
/> />
<IconButton <IconButton
title="Delete file" title={translate('DeleteFile')}
name={icons.REMOVE} name={icons.REMOVE}
onPress={this.onDeletePress} onPress={this.onDeletePress}
/> />
@ -202,7 +202,7 @@ class MovieFileEditorRow extends Component {
isOpen={isConfirmDeleteModalOpen} isOpen={isConfirmDeleteModalOpen}
ids={[id]} ids={[id]}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Selected Movie Files" title={translate('DeleteSelectedMovieFiles')}
message={'Are you sure you want to delete the selected movie files?'} message={'Are you sure you want to delete the selected movie files?'}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDelete} onConfirm={this.onConfirmDelete}

@ -99,7 +99,7 @@ class SelectQualityModalContent extends Component {
isPopulated && !error && isPopulated && !error &&
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Quality</FormLabel> <FormLabel>{translate('Quality')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -111,7 +111,7 @@ class SelectQualityModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Proper</FormLabel> <FormLabel>{translate('Proper')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@ -122,7 +122,7 @@ class SelectQualityModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Real</FormLabel> <FormLabel>{translate('Real')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}

@ -4,6 +4,7 @@ import HTML5Backend from 'react-dnd-html5-backend';
import PageContent from 'Components/Page/PageContent'; import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody'; import PageContentBody from 'Components/Page/PageContentBody';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector'; import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import CustomFormatsConnector from './CustomFormats/CustomFormatsConnector'; import CustomFormatsConnector from './CustomFormats/CustomFormatsConnector';
class CustomFormatSettingsConnector extends Component { class CustomFormatSettingsConnector extends Component {
@ -13,7 +14,7 @@ class CustomFormatSettingsConnector extends Component {
render() { render() {
return ( return (
<PageContent title="Custom Formats Settings"> <PageContent title={translate('CustomFormatsSettings')}>
<SettingsToolbarConnector <SettingsToolbarConnector
showSave={false} showSave={false}
/> />

@ -82,7 +82,7 @@ class CustomFormat extends Component {
<IconButton <IconButton
className={styles.cloneButton} className={styles.cloneButton}
title="Clone Profile" title={translate('CloneProfile')}
name={icons.CLONE} name={icons.CLONE}
onPress={this.onCloneCustomFormatPress} onPress={this.onCloneCustomFormatPress}
/> />
@ -125,7 +125,7 @@ class CustomFormat extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteCustomFormatModalOpen} isOpen={this.state.isDeleteCustomFormatModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Custom Format" title={translate('DeleteCustomFormat')}
message={ message={
<div> <div>
<div> <div>

@ -61,7 +61,7 @@ class CustomFormats extends Component {
return ( return (
<FieldSet legend={translate('CustomFormats')}> <FieldSet legend={translate('CustomFormats')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load Custom Formats" errorMessage={translate('UnableToLoadCustomFormats')}
{...otherProps}c={true} {...otherProps}c={true}
> >
<div className={styles.customFormats}> <div className={styles.customFormats}>

@ -124,19 +124,19 @@ class EditCustomFormatModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Include Custom Format when Renaming</FormLabel> <FormLabel>{translate('IncludeCustomFormatWhenRenaming')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="includeCustomFormatWhenRenaming" name="includeCustomFormatWhenRenaming"
helpText="Include in {Custom Formats} renaming format" helpText={translate('IncludeCustomFormatWhenRenamingHelpText')}
{...includeCustomFormatWhenRenaming} {...includeCustomFormatWhenRenaming}
onChange={onInputChange} onChange={onInputChange}
/> />
</FormGroup> </FormGroup>
</Form> </Form>
<FieldSet legend="Conditions"> <FieldSet legend={translate('Conditions')}>
<div className={styles.customFormats}> <div className={styles.customFormats}>
{ {
specifications.map((tag) => { specifications.map((tag) => {

@ -78,7 +78,7 @@ class Specification extends Component {
<IconButton <IconButton
className={styles.cloneButton} className={styles.cloneButton}
title="Clone Format Tag" title={translate('CloneFormatTag')}
name={icons.CLONE} name={icons.CLONE}
onPress={this.onCloneSpecificationPress} onPress={this.onCloneSpecificationPress}
/> />
@ -114,7 +114,7 @@ class Specification extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteSpecificationModalOpen} isOpen={this.state.isDeleteSpecificationModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Custom Format" title={translate('DeleteCustomFormat')}
message={ message={
<div> <div>
<div> <div>

@ -6,6 +6,7 @@ import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector'; import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import DownloadClientsConnector from './DownloadClients/DownloadClientsConnector'; import DownloadClientsConnector from './DownloadClients/DownloadClientsConnector';
import DownloadClientOptionsConnector from './Options/DownloadClientOptionsConnector'; import DownloadClientOptionsConnector from './Options/DownloadClientOptionsConnector';
import RemotePathMappingsConnector from './RemotePathMappings/RemotePathMappingsConnector'; import RemotePathMappingsConnector from './RemotePathMappings/RemotePathMappingsConnector';
@ -58,7 +59,7 @@ class DownloadClientSettings extends Component {
} = this.state; } = this.state;
return ( return (
<PageContent title="Download Client Settings"> <PageContent title={translate('DownloadClientSettings')}>
<SettingsToolbarConnector <SettingsToolbarConnector
isSaving={isSaving} isSaving={isSaving}
hasPendingChanges={hasPendingChanges} hasPendingChanges={hasPendingChanges}
@ -67,7 +68,7 @@ class DownloadClientSettings extends Component {
<PageToolbarSeparator /> <PageToolbarSeparator />
<PageToolbarButton <PageToolbarButton
label="Test All Clients" label={translate('TestAllClients')}
iconName={icons.TEST} iconName={icons.TEST}
isSpinning={isTestingAll} isSpinning={isTestingAll}
onPress={dispatchTestAllDownloadClients} onPress={dispatchTestAllDownloadClients}

@ -55,7 +55,7 @@ class AddDownloadClientModalContent extends Component {
<div>For more information on the individual downloadClients, clink on the info buttons.</div> <div>For more information on the individual downloadClients, clink on the info buttons.</div>
</Alert> </Alert>
<FieldSet legend="Usenet"> <FieldSet legend={translate('Usenet')}>
<div className={styles.downloadClients}> <div className={styles.downloadClients}>
{ {
usenetDownloadClients.map((downloadClient) => { usenetDownloadClients.map((downloadClient) => {
@ -72,7 +72,7 @@ class AddDownloadClientModalContent extends Component {
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Torrents"> <FieldSet legend={translate('Torrents')}>
<div className={styles.downloadClients}> <div className={styles.downloadClients}>
{ {
torrentDownloadClients.map((downloadClient) => { torrentDownloadClients.map((downloadClient) => {

@ -104,7 +104,7 @@ class DownloadClient extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteDownloadClientModalOpen} isOpen={this.state.isDeleteDownloadClientModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Download Client" title={translate('DeleteDownloadClient')}
message={`Are you sure you want to delete the download client '${name}'?`} message={`Are you sure you want to delete the download client '${name}'?`}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteDownloadClient} onConfirm={this.onConfirmDeleteDownloadClient}

@ -61,7 +61,7 @@ class DownloadClients extends Component {
return ( return (
<FieldSet legend={translate('DownloadClients')}> <FieldSet legend={translate('DownloadClients')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load download clients" errorMessage={translate('UnableToLoadDownloadClients')}
{...otherProps} {...otherProps}
> >
<div className={styles.downloadClients}> <div className={styles.downloadClients}>

@ -81,7 +81,7 @@ class EditDownloadClientModalContent extends Component {
} }
<FormGroup> <FormGroup>
<FormLabel>Name</FormLabel> <FormLabel>{translate('Name')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
@ -92,7 +92,7 @@ class EditDownloadClientModalContent extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Enable</FormLabel> <FormLabel>{translate('Enable')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@ -121,12 +121,12 @@ class EditDownloadClientModalContent extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Client Priority</FormLabel> <FormLabel>{translate('ClientPriority')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="priority" name="priority"
helpText="Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority." helpText={translate('PriorityHelpText')}
min={1} min={1}
max={50} max={50}
{...priority} {...priority}

@ -37,12 +37,12 @@ function DownloadClientOptions(props) {
<FieldSet legend={translate('CompletedDownloadHandling')}> <FieldSet legend={translate('CompletedDownloadHandling')}>
<Form> <Form>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Enable</FormLabel> <FormLabel>{translate('Enable')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enableCompletedDownloadHandling" name="enableCompletedDownloadHandling"
helpText="Automatically import completed downloads from download client" helpText={translate('EnableCompletedDownloadHandlingHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.enableCompletedDownloadHandling} {...settings.enableCompletedDownloadHandling}
/> />
@ -53,12 +53,12 @@ function DownloadClientOptions(props) {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Remove</FormLabel> <FormLabel>{translate('Remove')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="removeCompletedDownloads" name="removeCompletedDownloads"
helpText="Remove imported downloads from download client history" helpText={translate('RemoveCompletedDownloadsHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.removeCompletedDownloads} {...settings.removeCompletedDownloads}
/> />
@ -69,7 +69,7 @@ function DownloadClientOptions(props) {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Check For Finished Downloads Interval</FormLabel> <FormLabel>{translate('CheckForFinishedDownloadsInterval')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
@ -77,7 +77,7 @@ function DownloadClientOptions(props) {
min={0} min={0}
max={120} max={120}
unit="minutes" unit="minutes"
helpText="Interval in minutes to query the download clients for finished downloads" helpText={translate('HelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.checkForFinishedDownloadInterval} {...settings.checkForFinishedDownloadInterval}
/> />
@ -90,12 +90,12 @@ function DownloadClientOptions(props) {
> >
<Form> <Form>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Redownload</FormLabel> <FormLabel>{translate('Redownload')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="autoRedownloadFailed" name="autoRedownloadFailed"
helpText="Automatically search for and attempt to download a different release" helpText={translate('AutoRedownloadFailedHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.autoRedownloadFailed} {...settings.autoRedownloadFailed}
/> />
@ -106,12 +106,12 @@ function DownloadClientOptions(props) {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Remove</FormLabel> <FormLabel>{translate('Remove')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="removeFailedDownloads" name="removeFailedDownloads"
helpText="Remove failed downloads from download client history" helpText={translate('RemoveFailedDownloadsHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.removeFailedDownloads} {...settings.removeFailedDownloads}
/> />

@ -88,8 +88,8 @@ class RemotePathMapping extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteRemotePathMappingModalOpen} isOpen={this.state.isDeleteRemotePathMappingModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Delay Profile" title={translate('DeleteDelayProfile')}
message="Are you sure you want to delete this remote path mapping?" message={translate('AreYouSureYouWantToDeleteThisRemotePathMapping')}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteRemotePathMapping} onConfirm={this.onConfirmDeleteRemotePathMapping}
onCancel={this.onDeleteRemotePathMappingModalClose} onCancel={this.onDeleteRemotePathMappingModalClose}

@ -47,7 +47,7 @@ class RemotePathMappings extends Component {
return ( return (
<FieldSet legend={translate('RemotePathMappings')}> <FieldSet legend={translate('RemotePathMappings')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load Remote Path Mappings" errorMessage={translate('UnableToLoadRemotePathMappings')}
{...otherProps} {...otherProps}
> >
<div className={styles.remotePathMappingsHeader}> <div className={styles.remotePathMappingsHeader}>

@ -20,13 +20,13 @@ function AnalyticSettings(props) {
return ( return (
<FieldSet legend={translate('Analytics')}> <FieldSet legend={translate('Analytics')}>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Send Anonymous Usage Data</FormLabel> <FormLabel>{translate('SendAnonymousUsageData')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="analyticsEnabled" name="analyticsEnabled"
helpText="Send anonymous usage and error information to Radarr's servers. This includes information on your browser, which Radarr WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes." helpText={translate('AnalyticsEnabledHelpText')}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...analyticsEnabled} {...analyticsEnabled}
/> />

@ -5,6 +5,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup'; import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel'; import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props'; import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function BackupSettings(props) { function BackupSettings(props) {
const { const {
@ -24,17 +25,17 @@ function BackupSettings(props) {
} }
return ( return (
<FieldSet legend="Backups"> <FieldSet legend={translate('Backups')}>
<FormGroup <FormGroup
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Folder</FormLabel> <FormLabel>{translate('Folder')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.PATH} type={inputTypes.PATH}
name="backupFolder" name="backupFolder"
helpText="Relative paths will be under Radarr's AppData directory" helpText={translate('BackupFolderHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...backupFolder} {...backupFolder}
/> />
@ -44,13 +45,13 @@ function BackupSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Interval</FormLabel> <FormLabel>{translate('Interval')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="backupInterval" name="backupInterval"
unit="days" unit="days"
helpText="Interval between automatic backups" helpText={translate('BackupIntervalHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...backupInterval} {...backupInterval}
/> />
@ -60,13 +61,13 @@ function BackupSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Retention</FormLabel> <FormLabel>{translate('Retention')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="backupRetention" name="backupRetention"
unit="days" unit="days"
helpText="Automatic backups older than the retention period will be cleaned up automatically" helpText={translate('BackupRetentionHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...backupRetention} {...backupRetention}
/> />

@ -8,6 +8,7 @@ import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody'; import PageContentBody from 'Components/Page/PageContentBody';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector'; import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import AnalyticSettings from './AnalyticSettings'; import AnalyticSettings from './AnalyticSettings';
import BackupSettings from './BackupSettings'; import BackupSettings from './BackupSettings';
import HostSettings from './HostSettings'; import HostSettings from './HostSettings';
@ -112,7 +113,7 @@ class GeneralSettings extends Component {
} = this.props; } = this.props;
return ( return (
<PageContent title="General Settings"> <PageContent title={translate('GeneralSettings')}>
<SettingsToolbarConnector <SettingsToolbarConnector
{...otherProps} {...otherProps}
/> />
@ -184,12 +185,12 @@ class GeneralSettings extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isRestartRequiredModalOpen} isOpen={this.state.isRestartRequiredModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Restart Radarr" title={translate('RestartRadarr')}
message={ message={
`Radarr requires a restart to apply changes, do you want to restart now? ${isWindowsService ? 'Depending which user is running the Radarr service you may need to restart Radarr as admin once before the service will start automatically.' : ''}` `Radarr requires a restart to apply changes, do you want to restart now? ${isWindowsService ? 'Depending which user is running the Radarr service you may need to restart Radarr as admin once before the service will start automatically.' : ''}`
} }
cancelLabel="I'll restart later" cancelLabel={translate('IllRestartLater')}
confirmLabel="Restart Now" confirmLabel={translate('RestartNow')}
onConfirm={this.onConfirmRestart} onConfirm={this.onConfirmRestart}
onCancel={this.onCloseRestartRequiredModalOpen} onCancel={this.onCloseRestartRequiredModalOpen}
/> />

@ -33,40 +33,40 @@ function HostSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Bind Address</FormLabel> <FormLabel>{translate('BindAddress')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="bindAddress" name="bindAddress"
helpText="Valid IP4 address or '*' for all interfaces" helpText={translate('BindAddressHelpText')}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...bindAddress} {...bindAddress}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Port Number</FormLabel> <FormLabel>{translate('PortNumber')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="port" name="port"
min={1} min={1}
max={65535} max={65535}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...port} {...port}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>URL Base</FormLabel> <FormLabel>{translate('URLBase')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="urlBase" name="urlBase"
helpText="For reverse proxy support, default is empty" helpText={translate('UrlBaseHelpText')}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...urlBase} {...urlBase}
/> />
@ -77,12 +77,12 @@ function HostSettings(props) {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Enable SSL</FormLabel> <FormLabel>{translate('EnableSSL')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enableSsl" name="enableSsl"
helpText=" Requires restart running as administrator to take effect" helpText={translate('EnableSslHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...enableSsl} {...enableSsl}
/> />
@ -94,14 +94,14 @@ function HostSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>SSL Port</FormLabel> <FormLabel>{translate('SSLPort')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="sslPort" name="sslPort"
min={1} min={1}
max={65535} max={65535}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...sslPort} {...sslPort}
/> />
@ -115,13 +115,13 @@ function HostSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>SSL Cert Path</FormLabel> <FormLabel>{translate('SSLCertPath')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="sslCertPath" name="sslCertPath"
helpText="Path to pfx file" helpText={translate('SslCertPathHelpText')}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...sslCertPath} {...sslCertPath}
/> />
@ -135,13 +135,13 @@ function HostSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>SSL Cert Password</FormLabel> <FormLabel>{translate('SSLCertPassword')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.PASSWORD} type={inputTypes.PASSWORD}
name="sslCertPassword" name="sslCertPassword"
helpText="Password for pfx file" helpText={translate('SslCertPasswordHelpText')}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...sslCertPassword} {...sslCertPassword}
/> />
@ -152,12 +152,12 @@ function HostSettings(props) {
{ {
isWindows && mode !== 'service' && isWindows && mode !== 'service' &&
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Open browser on start</FormLabel> <FormLabel>{translate('OpenBrowserOnStart')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="launchBrowser" name="launchBrowser"
helpText=" Open a web browser and navigate to Radarr homepage on app start." helpText={translate('LaunchBrowserHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...launchBrowser} {...launchBrowser}
/> />

@ -26,7 +26,7 @@ function LoggingSettings(props) {
return ( return (
<FieldSet legend={translate('Logging')}> <FieldSet legend={translate('Logging')}>
<FormGroup> <FormGroup>
<FormLabel>Log Level</FormLabel> <FormLabel>{translate('LogLevel')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}

@ -33,7 +33,7 @@ function ProxySettings(props) {
return ( return (
<FieldSet legend={translate('Proxy')}> <FieldSet legend={translate('Proxy')}>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Use Proxy</FormLabel> <FormLabel>{translate('UseProxy')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@ -47,7 +47,7 @@ function ProxySettings(props) {
proxyEnabled.value && proxyEnabled.value &&
<div> <div>
<FormGroup> <FormGroup>
<FormLabel>Proxy Type</FormLabel> <FormLabel>{translate('ProxyType')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -59,7 +59,7 @@ function ProxySettings(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Hostname</FormLabel> <FormLabel>{translate('Hostname')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
@ -71,7 +71,7 @@ function ProxySettings(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Port</FormLabel> <FormLabel>{translate('Port')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
@ -84,43 +84,43 @@ function ProxySettings(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Username</FormLabel> <FormLabel>{translate('Username')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="proxyUsername" name="proxyUsername"
helpText="You only need to enter a username and password if one is required. Leave them blank otherwise." helpText={translate('ProxyUsernameHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...proxyUsername} {...proxyUsername}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Password</FormLabel> <FormLabel>{translate('Password')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.PASSWORD} type={inputTypes.PASSWORD}
name="proxyPassword" name="proxyPassword"
helpText="You only need to enter a username and password if one is required. Leave them blank otherwise." helpText={translate('ProxyPasswordHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...proxyPassword} {...proxyPassword}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Ignored Addresses</FormLabel> <FormLabel>{translate('IgnoredAddresses')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="proxyBypassFilter" name="proxyBypassFilter"
helpText="Use ',' as a separator, and '*.' as a wildcard for subdomains" helpText={translate('ProxyBypassFilterHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...proxyBypassFilter} {...proxyBypassFilter}
/> />
</FormGroup> </FormGroup>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Bypass Proxy for Local Addresses</FormLabel> <FormLabel>{translate('BypassProxyForLocalAddresses')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}

@ -79,14 +79,14 @@ class SecuritySettings extends Component {
return ( return (
<FieldSet legend={translate('Security')}> <FieldSet legend={translate('Security')}>
<FormGroup> <FormGroup>
<FormLabel>Authentication</FormLabel> <FormLabel>{translate('Authentication')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="authenticationMethod" name="authenticationMethod"
values={authenticationMethodOptions} values={authenticationMethodOptions}
helpText="Require Username and Password to access Radarr" helpText={translate('AuthenticationMethodHelpText')}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...authenticationMethod} {...authenticationMethod}
/> />
@ -95,12 +95,12 @@ class SecuritySettings extends Component {
{ {
authenticationEnabled && authenticationEnabled &&
<FormGroup> <FormGroup>
<FormLabel>Username</FormLabel> <FormLabel>{translate('Username')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="username" name="username"
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...username} {...username}
/> />
@ -110,12 +110,12 @@ class SecuritySettings extends Component {
{ {
authenticationEnabled && authenticationEnabled &&
<FormGroup> <FormGroup>
<FormLabel>Password</FormLabel> <FormLabel>{translate('Password')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.PASSWORD} type={inputTypes.PASSWORD}
name="password" name="password"
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...password} {...password}
/> />
@ -123,13 +123,13 @@ class SecuritySettings extends Component {
} }
<FormGroup> <FormGroup>
<FormLabel>API Key</FormLabel> <FormLabel>{translate('ApiKey')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="apiKey" name="apiKey"
readOnly={true} readOnly={true}
helpTextWarning="Requires restart to take effect" helpTextWarning={translate('RestartRequiredHelpTextWarning')}
buttons={[ buttons={[
<ClipboardButton <ClipboardButton
key="copy" key="copy"
@ -155,13 +155,13 @@ class SecuritySettings extends Component {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Certificate Validation</FormLabel> <FormLabel>{translate('CertificateValidation')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="certificateValidation" name="certificateValidation"
values={certificateValidationOptions} values={certificateValidationOptions}
helpText="Change how strict HTTPS certification validation is" helpText={translate('CertificateValidationHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...certificateValidation} {...certificateValidation}
/> />
@ -170,9 +170,9 @@ class SecuritySettings extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isConfirmApiKeyResetModalOpen} isOpen={this.state.isConfirmApiKeyResetModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Reset API Key" title={translate('ResetAPIKey')}
message="Are you sure you want to reset your API Key?" message={translate('AreYouSureYouWantToResetYourAPIKey')}
confirmLabel="Reset" confirmLabel={translate('Reset')}
onConfirm={this.onConfirmResetApiKey} onConfirm={this.onConfirmResetApiKey}
onCancel={this.onCloseResetApiKeyModal} onCancel={this.onCloseResetApiKeyModal}
/> />

@ -49,7 +49,7 @@ function UpdateSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Branch</FormLabel> <FormLabel>{translate('Branch')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
@ -70,12 +70,12 @@ function UpdateSettings(props) {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Automatic</FormLabel> <FormLabel>{translate('Automatic')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="updateAutomatically" name="updateAutomatically"
helpText="Automatically download and install updates. You will still be able to install from System: Updates" helpText={translate('UpdateAutomaticallyHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...updateAutomatically} {...updateAutomatically}
/> />
@ -85,13 +85,13 @@ function UpdateSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Mechanism</FormLabel> <FormLabel>{translate('Mechanism')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="updateMechanism" name="updateMechanism"
values={updateOptions} values={updateOptions}
helpText="Use Radarr's built-in updater or a script" helpText={translate('UpdateMechanismHelpText')}
helpLink="https://github.com/Radarr/Radarr/wiki/Updating" helpLink="https://github.com/Radarr/Radarr/wiki/Updating"
onChange={onInputChange} onChange={onInputChange}
{...updateMechanism} {...updateMechanism}
@ -104,12 +104,12 @@ function UpdateSettings(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Script Path</FormLabel> <FormLabel>{translate('ScriptPath')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="updateScriptPath" name="updateScriptPath"
helpText="Path to a custom script that takes an extracted update package and handle the remainder of the update process" helpText={translate('UpdateScriptPathHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...updateScriptPath} {...updateScriptPath}
/> />

@ -6,6 +6,7 @@ import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector'; import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import IndexersConnector from './Indexers/IndexersConnector'; import IndexersConnector from './Indexers/IndexersConnector';
import IndexerOptionsConnector from './Options/IndexerOptionsConnector'; import IndexerOptionsConnector from './Options/IndexerOptionsConnector';
import RestrictionsConnector from './Restrictions/RestrictionsConnector'; import RestrictionsConnector from './Restrictions/RestrictionsConnector';
@ -58,7 +59,7 @@ class IndexerSettings extends Component {
} = this.state; } = this.state;
return ( return (
<PageContent title="Indexer Settings"> <PageContent title={translate('IndexerSettings')}>
<SettingsToolbarConnector <SettingsToolbarConnector
isSaving={isSaving} isSaving={isSaving}
hasPendingChanges={hasPendingChanges} hasPendingChanges={hasPendingChanges}
@ -67,7 +68,7 @@ class IndexerSettings extends Component {
<PageToolbarSeparator /> <PageToolbarSeparator />
<PageToolbarButton <PageToolbarButton
label="Test All Indexers" label={translate('TestAllIndexers')}
iconName={icons.TEST} iconName={icons.TEST}
isSpinning={isTestingAll} isSpinning={isTestingAll}
onPress={dispatchTestAllIndexers} onPress={dispatchTestAllIndexers}

@ -55,7 +55,7 @@ class AddIndexerModalContent extends Component {
<div>For more information on the individual indexers, click on the info buttons.</div> <div>For more information on the individual indexers, click on the info buttons.</div>
</Alert> </Alert>
<FieldSet legend="Usenet"> <FieldSet legend={translate('Usenet')}>
<div className={styles.indexers}> <div className={styles.indexers}>
{ {
usenetIndexers.map((indexer) => { usenetIndexers.map((indexer) => {
@ -72,7 +72,7 @@ class AddIndexerModalContent extends Component {
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Torrents"> <FieldSet legend={translate('Torrents')}>
<div className={styles.indexers}> <div className={styles.indexers}>
{ {
torrentIndexers.map((indexer) => { torrentIndexers.map((indexer) => {

@ -67,7 +67,7 @@ function EditIndexerModalContent(props) {
!isFetching && !error && !isFetching && !error &&
<Form {...otherProps}> <Form {...otherProps}>
<FormGroup> <FormGroup>
<FormLabel>Name</FormLabel> <FormLabel>{translate('Name')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
@ -78,7 +78,7 @@ function EditIndexerModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Enable RSS</FormLabel> <FormLabel>{translate('EnableRSS')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@ -91,7 +91,7 @@ function EditIndexerModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Enable Automatic Search</FormLabel> <FormLabel>{translate('EnableAutomaticSearch')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
@ -105,7 +105,7 @@ function EditIndexerModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Enable Interactive Search</FormLabel> <FormLabel>{translate('EnableInteractiveSearch')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}

@ -85,7 +85,7 @@ class Indexer extends Component {
<IconButton <IconButton
className={styles.cloneButton} className={styles.cloneButton}
title="Clone Indexer" title={translate('CloneIndexer')}
name={icons.CLONE} name={icons.CLONE}
onPress={this.onCloneIndexerPress} onPress={this.onCloneIndexerPress}
/> />
@ -135,7 +135,7 @@ class Indexer extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteIndexerModalOpen} isOpen={this.state.isDeleteIndexerModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Indexer" title={translate('DeleteIndexer')}
message={`Are you sure you want to delete the indexer '${name}'?`} message={`Are you sure you want to delete the indexer '${name}'?`}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteIndexer} onConfirm={this.onConfirmDeleteIndexer}

@ -67,7 +67,7 @@ class Indexers extends Component {
return ( return (
<FieldSet legend={translate('Indexers')}> <FieldSet legend={translate('Indexers')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load Indexers" errorMessage={translate('UnableToLoadIndexers')}
{...otherProps} {...otherProps}
> >
<div className={styles.indexers}> <div className={styles.indexers}>

@ -35,54 +35,54 @@ function IndexerOptions(props) {
hasSettings && !isFetching && !error && hasSettings && !isFetching && !error &&
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Minimum Age</FormLabel> <FormLabel>{translate('MinimumAge')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="minimumAge" name="minimumAge"
min={0} min={0}
unit="minutes" unit="minutes"
helpText="Usenet only: Minimum age in minutes of NZBs before they are grabbed. Use this to give new releases time to propagate to your usenet provider." helpText={translate('MinimumAgeHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.minimumAge} {...settings.minimumAge}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Retention</FormLabel> <FormLabel>{translate('Retention')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="retention" name="retention"
min={0} min={0}
unit="days" unit="days"
helpText="Usenet only: Set to zero to set for unlimited retention" helpText={translate('RetentionHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.retention} {...settings.retention}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Maximum Size</FormLabel> <FormLabel>{translate('MaximumSize')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="maximumSize" name="maximumSize"
min={0} min={0}
unit="MB" unit="MB"
helpText="Maximum size for a release to be grabbed in MB. Set to zero to set to unlimited" helpText={translate('MaximumSizeHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.maximumSize} {...settings.maximumSize}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Prefer Indexer Flags</FormLabel> <FormLabel>{translate('PreferIndexerFlags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="preferIndexerFlags" name="preferIndexerFlags"
helpText="Prioritize releases with special flags" helpText={translate('PreferIndexerFlagsHelpText')}
helpLink="https://github.com/Radarr/Radarr/wiki/Indexer-Flags" helpLink="https://github.com/Radarr/Radarr/wiki/Indexer-Flags"
onChange={onInputChange} onChange={onInputChange}
{...settings.preferIndexerFlags} {...settings.preferIndexerFlags}
@ -90,13 +90,13 @@ function IndexerOptions(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Availability Delay</FormLabel> <FormLabel>{translate('AvailabilityDelay')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="availabilityDelay" name="availabilityDelay"
unit="Days" unit="Days"
helpText="Amount of time before or after available date to search for Movie" helpText={translate('AvailabilityDelayHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.availabilityDelay} {...settings.availabilityDelay}
/> />
@ -106,7 +106,7 @@ function IndexerOptions(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>RSS Sync Interval</FormLabel> <FormLabel>{translate('RSSSyncInterval')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
@ -114,8 +114,8 @@ function IndexerOptions(props) {
min={0} min={0}
max={120} max={120}
unit="minutes" unit="minutes"
helpText="Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)" helpText={translate('HelpText')}
helpTextWarning="This will apply to all indexers, please follow the rules set forth by them" helpTextWarning={translate('RssSyncIntervalHelpTextWarning')}
helpLink="https://github.com/Radarr/Radarr/wiki/RSS-Sync" helpLink="https://github.com/Radarr/Radarr/wiki/RSS-Sync"
onChange={onInputChange} onChange={onInputChange}
{...settings.rssSyncInterval} {...settings.rssSyncInterval}
@ -126,12 +126,12 @@ function IndexerOptions(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Whitelisted Subtitle Tags</FormLabel> <FormLabel>{translate('WhitelistedSubtitleTags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT_TAG} type={inputTypes.TEXT_TAG}
name="whitelistedHardcodedSubs" name="whitelistedHardcodedSubs"
helpText="Subtitle tags set here will not be considered hardcoded" helpText={translate('WhitelistedHardcodedSubsHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.whitelistedHardcodedSubs} {...settings.whitelistedHardcodedSubs}
/> />
@ -141,12 +141,12 @@ function IndexerOptions(props) {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Allow Hardcoded Subs</FormLabel> <FormLabel>{translate('AllowHardcodedSubs')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="allowHardcodedSubs" name="allowHardcodedSubs"
helpText="Detected hardcoded subs will be automatically downloaded" helpText={translate('AllowHardcodedSubsHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.allowHardcodedSubs} {...settings.allowHardcodedSubs}
/> />

@ -44,12 +44,12 @@ function EditRestrictionModalContent(props) {
{...otherProps} {...otherProps}
> >
<FormGroup> <FormGroup>
<FormLabel>Must Contain</FormLabel> <FormLabel>{translate('MustContain')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT_TAG} type={inputTypes.TEXT_TAG}
name="required" name="required"
helpText="The release must contain at least one of these terms (case insensitive)" helpText={translate('RequiredHelpText')}
kind={kinds.SUCCESS} kind={kinds.SUCCESS}
placeholder="Add new restriction" placeholder="Add new restriction"
{...required} {...required}
@ -58,12 +58,12 @@ function EditRestrictionModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Must Not Contain</FormLabel> <FormLabel>{translate('MustNotContain')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT_TAG} type={inputTypes.TEXT_TAG}
name="ignored" name="ignored"
helpText="The release will be rejected if it contains one or more of terms (case insensitive)" helpText={translate('IgnoredHelpText')}
kind={kinds.DANGER} kind={kinds.DANGER}
placeholder="Add new restriction" placeholder="Add new restriction"
{...ignored} {...ignored}
@ -72,12 +72,12 @@ function EditRestrictionModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Tags</FormLabel> <FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TAG} type={inputTypes.TAG}
name="tags" name="tags"
helpText="Restrictions will apply to movies at least one matching tag. Leave blank to apply to all movies" helpText={translate('TagsHelpText')}
{...tags} {...tags}
onChange={onInputChange} onChange={onInputChange}
/> />

@ -121,7 +121,7 @@ class Restriction extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteRestrictionModalOpen} isOpen={this.state.isDeleteRestrictionModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Restriction" title={translate('DeleteRestriction')}
message={'Are you sure you want to delete this restriction?'} message={'Are you sure you want to delete this restriction?'}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteRestriction} onConfirm={this.onConfirmDeleteRestriction}

@ -48,7 +48,7 @@ class Restrictions extends Component {
return ( return (
<FieldSet legend={translate('Restrictions')}> <FieldSet legend={translate('Restrictions')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load Restrictions" errorMessage={translate('UnableToLoadRestrictions')}
{...otherProps} {...otherProps}
> >
<div className={styles.restrictions}> <div className={styles.restrictions}>

@ -46,7 +46,7 @@ class MediaManagement extends Component {
} = this.props; } = this.props;
return ( return (
<PageContent title="Media Management Settings"> <PageContent title={translate('MediaManagementSettings')}>
<SettingsToolbarConnector <SettingsToolbarConnector
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
{...otherProps} {...otherProps}
@ -58,14 +58,14 @@ class MediaManagement extends Component {
{ {
isFetching && isFetching &&
<FieldSet legend="Naming Settings"> <FieldSet legend={translate('NamingSettings')}>
<LoadingIndicator /> <LoadingIndicator />
</FieldSet> </FieldSet>
} }
{ {
!isFetching && error && !isFetching && error &&
<FieldSet legend="Naming Settings"> <FieldSet legend={translate('NamingSettings')}>
<div>Unable to load Media Management settings</div> <div>Unable to load Media Management settings</div>
</FieldSet> </FieldSet>
} }
@ -78,19 +78,19 @@ class MediaManagement extends Component {
> >
{ {
advancedSettings && advancedSettings &&
<FieldSet legend="Folders"> <FieldSet legend={translate('Folders')}>
<FormGroup <FormGroup
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Create empty movie folders</FormLabel> <FormLabel>{translate('CreateEmptyMovieFolders')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
isDisabled={settings.deleteEmptyFolders.value && !settings.createEmptyMovieFolders.value} isDisabled={settings.deleteEmptyFolders.value && !settings.createEmptyMovieFolders.value}
name="createEmptyMovieFolders" name="createEmptyMovieFolders"
helpText="Create missing movie folders during disk scan" helpText={translate('CreateEmptyMovieFoldersHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.createEmptyMovieFolders} {...settings.createEmptyMovieFolders}
/> />
@ -101,13 +101,13 @@ class MediaManagement extends Component {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Delete empty folders</FormLabel> <FormLabel>{translate('DeleteEmptyFolders')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
isDisabled={settings.createEmptyMovieFolders.value && !settings.deleteEmptyFolders.value} isDisabled={settings.createEmptyMovieFolders.value && !settings.deleteEmptyFolders.value}
name="deleteEmptyFolders" name="deleteEmptyFolders"
helpText="Delete empty movie folders during disk scan and when movie files are deleted" helpText={translate('DeleteEmptyFoldersHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.deleteEmptyFolders} {...settings.deleteEmptyFolders}
/> />
@ -118,7 +118,7 @@ class MediaManagement extends Component {
{ {
advancedSettings && advancedSettings &&
<FieldSet <FieldSet
legend="Importing" legend={translate('Importing')}
> >
{ {
!isWindows && !isWindows &&
@ -127,12 +127,12 @@ class MediaManagement extends Component {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Skip Free Space Check</FormLabel> <FormLabel>{translate('SkipFreeSpaceCheck')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="skipFreeSpaceCheckWhenImporting" name="skipFreeSpaceCheckWhenImporting"
helpText="Use when Radarr is unable to detect free space from your movie root folder" helpText={translate('SkipFreeSpaceCheckWhenImportingHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.skipFreeSpaceCheckWhenImporting} {...settings.skipFreeSpaceCheckWhenImporting}
/> />
@ -144,13 +144,13 @@ class MediaManagement extends Component {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Minimum Free Space</FormLabel> <FormLabel>{translate('MinimumFreeSpace')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
unit='MB' unit='MB'
name="minimumFreeSpaceWhenImporting" name="minimumFreeSpaceWhenImporting"
helpText="Prevent import if it would leave less than this amount of disk space available" helpText={translate('MinimumFreeSpaceWhenImportingHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.minimumFreeSpaceWhenImporting} {...settings.minimumFreeSpaceWhenImporting}
/> />
@ -161,25 +161,25 @@ class MediaManagement extends Component {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Use Hardlinks instead of Copy</FormLabel> <FormLabel>{translate('UseHardlinksInsteadOfCopy')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="copyUsingHardlinks" name="copyUsingHardlinks"
helpText="Use Hardlinks when trying to copy files from torrents that are still being seeded" helpText={translate('CopyUsingHardlinksHelpText')}
helpTextWarning="Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Radarr's rename function as a work around." helpTextWarning={translate('CopyUsingHardlinksHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...settings.copyUsingHardlinks} {...settings.copyUsingHardlinks}
/> />
</FormGroup> </FormGroup>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Import Extra Files</FormLabel> <FormLabel>{translate('ImportExtraFiles')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="importExtraFiles" name="importExtraFiles"
helpText="Import matching extra files (subtitles, nfo, etc) after importing an movie file" helpText={translate('ImportExtraFilesHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.importExtraFiles} {...settings.importExtraFiles}
/> />
@ -191,7 +191,7 @@ class MediaManagement extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Import Extra Files</FormLabel> <FormLabel>{translate('ImportExtraFiles')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
@ -212,12 +212,12 @@ class MediaManagement extends Component {
legend={translate('FileManagement')} legend={translate('FileManagement')}
> >
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Ignore Deleted Movies</FormLabel> <FormLabel>{translate('IgnoreDeletedMovies')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="autoUnmonitorPreviouslyDownloadedMovies" name="autoUnmonitorPreviouslyDownloadedMovies"
helpText="Movies deleted from disk are automatically unmonitored in Radarr" helpText={translate('AutoUnmonitorPreviouslyDownloadedMoviesHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.autoUnmonitorPreviouslyDownloadedMovies} {...settings.autoUnmonitorPreviouslyDownloadedMovies}
/> />
@ -228,12 +228,12 @@ class MediaManagement extends Component {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Download Propers</FormLabel> <FormLabel>{translate('DownloadPropers')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="autoDownloadPropers" name="autoDownloadPropers"
helpText="Should Radarr automatically upgrade to propers when available?" helpText={translate('AutoDownloadPropersHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.autoDownloadPropers} {...settings.autoDownloadPropers}
/> />
@ -244,12 +244,12 @@ class MediaManagement extends Component {
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Analyse video files</FormLabel> <FormLabel>{translate('AnalyseVideoFiles')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enableMediaInfo" name="enableMediaInfo"
helpText="Extract video information such as resolution, runtime and codec information from files. This requires Radarr to read parts of the file which may cause high disk or network activity during scans." helpText={translate('EnableMediaInfoHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.enableMediaInfo} {...settings.enableMediaInfo}
/> />
@ -259,13 +259,13 @@ class MediaManagement extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Rescan Movie Folder after Refresh</FormLabel> <FormLabel>{translate('RescanMovieFolderAfterRefresh')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="rescanAfterRefresh" name="rescanAfterRefresh"
helpText="Rescan the movie folder after refreshing the movie" helpText={translate('RescanAfterRefreshHelpText')}
helpTextWarning="Radarr will not automatically detect changes to files when not set to 'Always'" helpTextWarning={translate('RescanAfterRefreshHelpTextWarning')}
values={rescanAfterRefreshOptions} values={rescanAfterRefreshOptions}
onChange={onInputChange} onChange={onInputChange}
{...settings.rescanAfterRefresh} {...settings.rescanAfterRefresh}
@ -276,12 +276,12 @@ class MediaManagement extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Change File Date</FormLabel> <FormLabel>{translate('ChangeFileDate')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="fileDate" name="fileDate"
helpText="Change file date on import/rescan" helpText={translate('FileDateHelpText')}
values={fileDateOptions} values={fileDateOptions}
onChange={onInputChange} onChange={onInputChange}
{...settings.fileDate} {...settings.fileDate}
@ -292,12 +292,12 @@ class MediaManagement extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Recycling Bin</FormLabel> <FormLabel>{translate('RecyclingBin')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.PATH} type={inputTypes.PATH}
name="recycleBin" name="recycleBin"
helpText="Movie files will go here when deleted instead of being permanently deleted" helpText={translate('RecycleBinHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.recycleBin} {...settings.recycleBin}
/> />
@ -307,13 +307,13 @@ class MediaManagement extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Recycling Bin Cleanup</FormLabel> <FormLabel>{translate('RecyclingBinCleanup')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="recycleBinCleanupDays" name="recycleBinCleanupDays"
helpText="Set to 0 to disable automatic cleanup" helpText={translate('RecycleBinCleanupDaysHelpText')}
helpTextWarning="Files in the recycle bin older than the selected number of days will be cleaned up automatically" helpTextWarning={translate('RecycleBinCleanupDaysHelpTextWarning')}
min={0} min={0}
onChange={onInputChange} onChange={onInputChange}
{...settings.recycleBinCleanupDays} {...settings.recycleBinCleanupDays}
@ -324,20 +324,20 @@ class MediaManagement extends Component {
{ {
advancedSettings && !isWindows && advancedSettings && !isWindows &&
<FieldSet <FieldSet
legend="Permissions" legend={translate('Permissions')}
> >
<FormGroup <FormGroup
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
size={sizes.MEDIUM} size={sizes.MEDIUM}
> >
<FormLabel>Set Permissions</FormLabel> <FormLabel>{translate('SetPermissions')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="setPermissionsLinux" name="setPermissionsLinux"
helpText="Should chmod be run when files are imported/renamed?" helpText={translate('SetPermissionsLinuxHelpText')}
helpTextWarning="If you're unsure what these settings do, do not alter them." helpTextWarning={translate('SetPermissionsLinuxHelpTextWarning')}
onChange={onInputChange} onChange={onInputChange}
{...settings.setPermissionsLinux} {...settings.setPermissionsLinux}
/> />
@ -347,7 +347,7 @@ class MediaManagement extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>File chmod mode</FormLabel> <FormLabel>{translate('FileChmodMode')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}

@ -117,24 +117,24 @@ class Naming extends Component {
hasSettings && !isFetching && !error && hasSettings && !isFetching && !error &&
<Form> <Form>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Rename Movies</FormLabel> <FormLabel>{translate('RenameMovies')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="renameMovies" name="renameMovies"
helpText="Radarr will use the existing file name if renaming is disabled" helpText={translate('RenameMoviesHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.renameMovies} {...settings.renameMovies}
/> />
</FormGroup> </FormGroup>
<FormGroup size={sizes.MEDIUM}> <FormGroup size={sizes.MEDIUM}>
<FormLabel>Replace Illegal Characters</FormLabel> <FormLabel>{translate('ReplaceIllegalCharacters')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="replaceIllegalCharacters" name="replaceIllegalCharacters"
helpText="Replace illegal characters. If unchecked, Radarr will remove them instead" helpText={translate('ReplaceIllegalCharactersHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.replaceIllegalCharacters} {...settings.replaceIllegalCharacters}
/> />
@ -143,13 +143,13 @@ class Naming extends Component {
{ {
replaceIllegalCharacters && replaceIllegalCharacters &&
<FormGroup> <FormGroup>
<FormLabel>Colon Replacement</FormLabel> <FormLabel>{translate('ColonReplacement')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="colonReplacementFormat" name="colonReplacementFormat"
values={colonReplacementOptions} values={colonReplacementOptions}
helpText="Change how Radarr handles colon replacement" helpText={translate('ColonReplacementFormatHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.colonReplacementFormat} {...settings.colonReplacementFormat}
/> />
@ -159,7 +159,7 @@ class Naming extends Component {
{ {
renameMovies && renameMovies &&
<FormGroup size={sizes.LARGE}> <FormGroup size={sizes.LARGE}>
<FormLabel>Standard Movie Format</FormLabel> <FormLabel>{translate('StandardMovieFormat')}</FormLabel>
<FormInputGroup <FormInputGroup
inputClassName={styles.namingInput} inputClassName={styles.namingInput}
@ -178,7 +178,7 @@ class Naming extends Component {
advancedSettings={advancedSettings} advancedSettings={advancedSettings}
isAdvanced={true} isAdvanced={true}
> >
<FormLabel>Movie Folder Format</FormLabel> <FormLabel>{translate('MovieFolderFormat')}</FormLabel>
<FormInputGroup <FormInputGroup
inputClassName={styles.namingInput} inputClassName={styles.namingInput}

@ -196,7 +196,7 @@ class NamingModal extends Component {
{ {
!advancedSettings && !advancedSettings &&
<FieldSet legend="File Names"> <FieldSet legend={translate('FileNames')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
fileNameTokens.map(({ token, example }) => { fileNameTokens.map(({ token, example }) => {
@ -221,7 +221,7 @@ class NamingModal extends Component {
</FieldSet> </FieldSet>
} }
<FieldSet legend="Movie"> <FieldSet legend={translate('Movie')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
movieTokens.map(({ token, example }) => { movieTokens.map(({ token, example }) => {
@ -243,7 +243,7 @@ class NamingModal extends Component {
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Movie ID"> <FieldSet legend={translate('MovieID')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
movieIdTokens.map(({ token, example }) => { movieIdTokens.map(({ token, example }) => {
@ -268,7 +268,7 @@ class NamingModal extends Component {
{ {
additional && additional &&
<div> <div>
<FieldSet legend="Quality"> <FieldSet legend={translate('Quality')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
qualityTokens.map(({ token, example }) => { qualityTokens.map(({ token, example }) => {
@ -290,7 +290,7 @@ class NamingModal extends Component {
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Media Info"> <FieldSet legend={translate('MediaInfo')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
mediaInfoTokens.map(({ token, example }) => { mediaInfoTokens.map(({ token, example }) => {
@ -312,7 +312,7 @@ class NamingModal extends Component {
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Release Group"> <FieldSet legend={translate('ReleaseGroup')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
releaseGroupTokens.map(({ token, example }) => { releaseGroupTokens.map(({ token, example }) => {
@ -334,7 +334,7 @@ class NamingModal extends Component {
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Edition"> <FieldSet legend={translate('Edition')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
editionTokens.map(({ token, example }) => { editionTokens.map(({ token, example }) => {
@ -378,7 +378,7 @@ class NamingModal extends Component {
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Original"> <FieldSet legend={translate('Original')}>
<div className={styles.groups}> <div className={styles.groups}>
{ {
originalTokens.map(({ token, example }) => { originalTokens.map(({ token, example }) => {

@ -42,12 +42,12 @@ function EditMetadataModalContent(props) {
<ModalBody> <ModalBody>
<Form {...otherProps}> <Form {...otherProps}>
<FormGroup> <FormGroup>
<FormLabel>Enable</FormLabel> <FormLabel>{translate('Enable')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enable" name="enable"
helpText="Enable metadata file creation for this metadata type" helpText={translate('EnableHelpText')}
{...enable} {...enable}
onChange={onInputChange} onChange={onInputChange}
/> />

@ -15,7 +15,7 @@ function Metadatas(props) {
return ( return (
<FieldSet legend={translate('Metadata')}> <FieldSet legend={translate('Metadata')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load Metadata" errorMessage={translate('UnableToLoadMetadata')}
{...otherProps} {...otherProps}
> >
<div className={styles.metadatas}> <div className={styles.metadatas}>

@ -2,6 +2,7 @@ import React, { Component } from 'react';
import PageContent from 'Components/Page/PageContent'; import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody'; import PageContentBody from 'Components/Page/PageContentBody';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector'; import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import MetadatasConnector from './Metadata/MetadatasConnector'; import MetadatasConnector from './Metadata/MetadatasConnector';
import MetadataOptionsConnector from './Options/MetadataOptionsConnector'; import MetadataOptionsConnector from './Options/MetadataOptionsConnector';
@ -48,7 +49,7 @@ class MetadataSettings extends Component {
} = this.state; } = this.state;
return ( return (
<PageContent title="Metadata Settings"> <PageContent title={translate('MetadataSettings')}>
<SettingsToolbarConnector <SettingsToolbarConnector
isSaving={isSaving} isSaving={isSaving}
hasPendingChanges={hasPendingChanges} hasPendingChanges={hasPendingChanges}

@ -39,14 +39,14 @@ function MetadataOptions(props) {
hasSettings && !isFetching && !error && hasSettings && !isFetching && !error &&
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>Certification Country</FormLabel> <FormLabel>{translate('CertificationCountry')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="certificationCountry" name="certificationCountry"
values={certificationCountryOptions} values={certificationCountryOptions}
onChange={onInputChange} onChange={onInputChange}
helpText="Select Country for Movie Certifications" helpText={translate('CertificationCountryHelpText')}
{...settings.certificationCountry} {...settings.certificationCountry}
/> />
</FormGroup> </FormGroup>

@ -71,7 +71,7 @@ function EditNetImportModalContent(props) {
{...otherProps} {...otherProps}
> >
<FormGroup> <FormGroup>
<FormLabel>Name</FormLabel> <FormLabel>{translate('Name')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
@ -82,43 +82,43 @@ function EditNetImportModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Enable</FormLabel> <FormLabel>{translate('Enable')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enabled" name="enabled"
helpText="Enable this list for use in Radarr" helpText={translate('EnabledHelpText')}
{...enabled} {...enabled}
onChange={onInputChange} onChange={onInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Enable Automatic Add</FormLabel> <FormLabel>{translate('EnableAutomaticAdd')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enableAuto" name="enableAuto"
helpText="If enabled, Movies will be automatically added to Radarr from this list" helpText={translate('EnableAutoHelpText')}
{...enableAuto} {...enableAuto}
onChange={onInputChange} onChange={onInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Add Movies Monitored</FormLabel> <FormLabel>{translate('AddMoviesMonitored')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="shouldMonitor" name="shouldMonitor"
helpText="If enabled, movies added by this list are added and monitored" helpText={translate('ShouldMonitorHelpText')}
{...shouldMonitor} {...shouldMonitor}
onChange={onInputChange} onChange={onInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Minimum Availability</FormLabel> <FormLabel>{translate('MinimumAvailability')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.AVAILABILITY_SELECT} type={inputTypes.AVAILABILITY_SELECT}
name="minimumAvailability" name="minimumAvailability"
@ -128,7 +128,7 @@ function EditNetImportModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Quality Profile</FormLabel> <FormLabel>{translate('QualityProfile')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.QUALITY_PROFILE_SELECT} type={inputTypes.QUALITY_PROFILE_SELECT}
@ -139,7 +139,7 @@ function EditNetImportModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Folder</FormLabel> <FormLabel>{translate('Folder')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.ROOT_FOLDER_SELECT} type={inputTypes.ROOT_FOLDER_SELECT}
@ -150,12 +150,12 @@ function EditNetImportModalContent(props) {
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Radarr Tags</FormLabel> <FormLabel>{translate('RadarrTags')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TAG} type={inputTypes.TAG}
name="tags" name="tags"
helpText="Add movie from this list with these tags" helpText={translate('TagsHelpText')}
{...tags} {...tags}
onChange={onInputChange} onChange={onInputChange}
/> />

@ -106,7 +106,7 @@ class NetImport extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteNetImportModalOpen} isOpen={this.state.isDeleteNetImportModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete List" title={translate('DeleteList')}
message={`Are you sure you want to delete the list '${name}'?`} message={`Are you sure you want to delete the list '${name}'?`}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteNetImport} onConfirm={this.onConfirmDeleteNetImport}

@ -61,7 +61,7 @@ class NetImports extends Component {
return ( return (
<FieldSet legend={translate('Lists')}> <FieldSet legend={translate('Lists')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load Lists" errorMessage={translate('UnableToLoadLists')}
{...otherProps} {...otherProps}
> >
<div className={styles.netImports}> <div className={styles.netImports}>

@ -59,36 +59,36 @@ function EditNetImportExclusionModalContent(props) {
{...otherProps} {...otherProps}
> >
<FormGroup> <FormGroup>
<FormLabel>TMDB Id</FormLabel> <FormLabel>{translate('TMDBId')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="tmdbId" name="tmdbId"
helpText="The TMDB Id of the movie to exclude" helpText={translate('TmdbIdHelpText')}
{...tmdbId} {...tmdbId}
onChange={onInputChange} onChange={onInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Movie Title</FormLabel> <FormLabel>{translate('MovieTitle')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TEXT} type={inputTypes.TEXT}
name="movieTitle" name="movieTitle"
helpText="The title of the movie to exclude (can be anything meaningful)" helpText={translate('MovieTitleHelpText')}
{...movieTitle} {...movieTitle}
onChange={onInputChange} onChange={onInputChange}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Movie Year</FormLabel> <FormLabel>{translate('MovieYear')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="movieYear" name="movieYear"
helpText="The year of the movie to exclude" helpText={translate('MovieYearHelpText')}
{...movieYear} {...movieYear}
onChange={onInputChange} onChange={onInputChange}
/> />

@ -88,8 +88,8 @@ class NetImportExclusion extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteNetImportExclusionModalOpen} isOpen={this.state.isDeleteNetImportExclusionModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Delete Import List Exclusion" title={translate('DeleteImportListExclusion')}
message="Are you sure you want to delete this import list exclusion?" message={translate('AreYouSureYouWantToDeleteThisImportListExclusion')}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteNetImportExclusion} onConfirm={this.onConfirmDeleteNetImportExclusion}
onCancel={this.onDeleteNetImportExclusionModalClose} onCancel={this.onDeleteNetImportExclusionModalClose}

@ -47,7 +47,7 @@ class NetImportExclusions extends Component {
return ( return (
<FieldSet legend={translate('ListExclusions')}> <FieldSet legend={translate('ListExclusions')}>
<PageSectionContent <PageSectionContent
errorMessage="Unable to load List Exclusions" errorMessage={translate('UnableToLoadListExclusions')}
{...otherProps} {...otherProps}
> >
<div className={styles.netImportExclusionsHeader}> <div className={styles.netImportExclusionsHeader}>

@ -6,6 +6,7 @@ import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector'; import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import NetImportsConnector from './NetImport/NetImportsConnector'; import NetImportsConnector from './NetImport/NetImportsConnector';
import NetImportExclusionsConnector from './NetImportExclusions/NetImportExclusionsConnector'; import NetImportExclusionsConnector from './NetImportExclusions/NetImportExclusionsConnector';
import NetImportOptionsConnector from './Options/NetImportOptionsConnector'; import NetImportOptionsConnector from './Options/NetImportOptionsConnector';
@ -58,7 +59,7 @@ class NetImportSettings extends Component {
} = this.state; } = this.state;
return ( return (
<PageContent title="List Settings"> <PageContent title={translate('ListSettings')}>
<SettingsToolbarConnector <SettingsToolbarConnector
isSaving={isSaving} isSaving={isSaving}
hasPendingChanges={hasPendingChanges} hasPendingChanges={hasPendingChanges}
@ -67,7 +68,7 @@ class NetImportSettings extends Component {
<PageToolbarSeparator /> <PageToolbarSeparator />
<PageToolbarButton <PageToolbarButton
label="Test All Lists" label={translate('TestAllLists')}
iconName={icons.TEST} iconName={icons.TEST}
isSpinning={isTestingAll} isSpinning={isTestingAll}
onPress={dispatchTestAllNetImport} onPress={dispatchTestAllNetImport}

@ -42,27 +42,27 @@ function NetImportOptions(props) {
hasSettings && !isFetching && !error && hasSettings && !isFetching && !error &&
<Form> <Form>
<FormGroup> <FormGroup>
<FormLabel>List Update Interval</FormLabel> <FormLabel>{translate('ListUpdateInterval')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
name="netImportSyncInterval" name="netImportSyncInterval"
min={0} min={0}
unit="minutes" unit="minutes"
helpText="How often Radarr syncs with your lists." helpText={translate('NetImportSyncIntervalHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.netImportSyncInterval} {...settings.netImportSyncInterval}
/> />
</FormGroup> </FormGroup>
<FormGroup> <FormGroup>
<FormLabel>Clean Library Level</FormLabel> <FormLabel>{translate('CleanLibraryLevel')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="listSyncLevel" name="listSyncLevel"
values={cleanLibraryLevelOptions} values={cleanLibraryLevelOptions}
helpText="Movies in library will be removed or unmonitored if not in your list" helpText={translate('ListSyncLevelHelpText')}
onChange={onInputChange} onChange={onInputChange}
{...settings.listSyncLevel} {...settings.listSyncLevel}
/> />

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save