More Language string migration

This commit is contained in:
nitsua 2020-08-28 23:56:13 -04:00 committed by Qstick
parent 84e769b14e
commit be38ca4728
134 changed files with 849 additions and 468 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,6 +4,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
class QueueOptions extends Component {
@ -54,13 +55,13 @@ class QueueOptions extends Component {
return (
<Fragment>
<FormGroup>
<FormLabel>Show Unknown Movie Items</FormLabel>
<FormLabel>{translate('ShowUnknownMovieItems')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="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}
/>
</FormGroup>

View File

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

View File

@ -90,25 +90,25 @@ class RemoveQueueItemModal extends Component {
</div>
<FormGroup>
<FormLabel>Remove From Download Client</FormLabel>
<FormLabel>{translate('RemoveFromDownloadClient')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="remove"
value={remove}
helpTextWarning="Removing will remove the download and the file(s) from the download client."
helpTextWarning={translate('RemoveHelpTextWarning')}
isDisabled={!canIgnore}
onChange={this.onRemoveChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Blacklist Release</FormLabel>
<FormLabel>{translate('BlacklistRelease')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="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}
/>
</FormGroup>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -15,6 +15,7 @@ import MovieQuality from 'Movie/MovieQuality';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge';
import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import Peers from './Peers';
import styles from './InteractiveSearchRow.css';
@ -203,7 +204,7 @@ class InteractiveSearchRow extends Component {
kind={kinds.PRIMARY}
/>
}
title="Indexer Flags"
title={translate('IndexerFlags')}
body={
<ul>
{
@ -232,7 +233,7 @@ class InteractiveSearchRow extends Component {
kind={kinds.DANGER}
/>
}
title="Release Rejected"
title={translate('ReleaseRejected')}
body={
<ul>
{
@ -265,9 +266,9 @@ class InteractiveSearchRow extends Component {
<ConfirmModal
isOpen={this.state.isConfirmGrabModalOpen}
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}'?`}
confirmLabel="Grab"
confirmLabel={translate('Grab')}
onConfirm={this.onGrabConfirm}
onCancel={this.onGrabCancel}
/>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -20,13 +20,13 @@ function AnalyticSettings(props) {
return (
<FieldSet legend={translate('Analytics')}>
<FormGroup size={sizes.MEDIUM}>
<FormLabel>Send Anonymous Usage Data</FormLabel>
<FormLabel>{translate('SendAnonymousUsageData')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
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."
helpTextWarning="Requires restart to take effect"
helpText={translate('AnalyticsEnabledHelpText')}
helpTextWarning={translate('RestartRequiredHelpTextWarning')}
onChange={onInputChange}
{...analyticsEnabled}
/>

View File

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

View File

@ -8,6 +8,7 @@ import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import { kinds } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import AnalyticSettings from './AnalyticSettings';
import BackupSettings from './BackupSettings';
import HostSettings from './HostSettings';
@ -112,7 +113,7 @@ class GeneralSettings extends Component {
} = this.props;
return (
<PageContent title="General Settings">
<PageContent title={translate('GeneralSettings')}>
<SettingsToolbarConnector
{...otherProps}
/>
@ -184,12 +185,12 @@ class GeneralSettings extends Component {
<ConfirmModal
isOpen={this.state.isRestartRequiredModalOpen}
kind={kinds.DANGER}
title="Restart Radarr"
title={translate('RestartRadarr')}
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.' : ''}`
}
cancelLabel="I'll restart later"
confirmLabel="Restart Now"
cancelLabel={translate('IllRestartLater')}
confirmLabel={translate('RestartNow')}
onConfirm={this.onConfirmRestart}
onCancel={this.onCloseRestartRequiredModalOpen}
/>

View File

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

View File

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

View File

@ -33,7 +33,7 @@ function ProxySettings(props) {
return (
<FieldSet legend={translate('Proxy')}>
<FormGroup size={sizes.MEDIUM}>
<FormLabel>Use Proxy</FormLabel>
<FormLabel>{translate('UseProxy')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
@ -47,7 +47,7 @@ function ProxySettings(props) {
proxyEnabled.value &&
<div>
<FormGroup>
<FormLabel>Proxy Type</FormLabel>
<FormLabel>{translate('ProxyType')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
@ -59,7 +59,7 @@ function ProxySettings(props) {
</FormGroup>
<FormGroup>
<FormLabel>Hostname</FormLabel>
<FormLabel>{translate('Hostname')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
@ -71,7 +71,7 @@ function ProxySettings(props) {
</FormGroup>
<FormGroup>
<FormLabel>Port</FormLabel>
<FormLabel>{translate('Port')}</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
@ -84,43 +84,43 @@ function ProxySettings(props) {
</FormGroup>
<FormGroup>
<FormLabel>Username</FormLabel>
<FormLabel>{translate('Username')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
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}
{...proxyUsername}
/>
</FormGroup>
<FormGroup>
<FormLabel>Password</FormLabel>
<FormLabel>{translate('Password')}</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
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}
{...proxyPassword}
/>
</FormGroup>
<FormGroup>
<FormLabel>Ignored Addresses</FormLabel>
<FormLabel>{translate('IgnoredAddresses')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="proxyBypassFilter"
helpText="Use ',' as a separator, and '*.' as a wildcard for subdomains"
helpText={translate('ProxyBypassFilterHelpText')}
onChange={onInputChange}
{...proxyBypassFilter}
/>
</FormGroup>
<FormGroup size={sizes.MEDIUM}>
<FormLabel>Bypass Proxy for Local Addresses</FormLabel>
<FormLabel>{translate('BypassProxyForLocalAddresses')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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