1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-09-11 12:02:35 +02:00

New: Add Missing Translations

This commit is contained in:
bakerboy448 2020-11-22 21:34:51 -06:00 committed by Qstick
parent 86118b4537
commit 699d2be938
108 changed files with 584 additions and 338 deletions

View File

@ -208,9 +208,9 @@ class Blacklist extends Component {
<ConfirmModal <ConfirmModal
isOpen={isConfirmRemoveModalOpen} isOpen={isConfirmRemoveModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title="Remove Selected" title={translate('RemoveSelected')}
message={'Are you sure you want to remove the selected items from the blacklist?'} message={translate('AreYouSureYouWantToRemoveTheSelectedItemsFromBlacklist')}
confirmLabel="Remove Selected" confirmLabel={translate('RemoveSelected')}
onConfirm={this.onRemoveSelectedConfirmed} onConfirm={this.onRemoveSelectedConfirmed}
onCancel={this.onConfirmRemoveModalClose} onCancel={this.onConfirmRemoveModalClose}
/> />

View File

@ -173,13 +173,13 @@ function HistoryDetails(props) {
switch (reason) { switch (reason) {
case 'Manual': case 'Manual':
reasonMessage = 'File was deleted by via UI'; reasonMessage = translate('FileWasDeletedByViaUI');
break; break;
case 'MissingFromDisk': case 'MissingFromDisk':
reasonMessage = 'Radarr was unable to find the file on disk so it was removed'; reasonMessage = translate('MissingFromDisk');
break; break;
case 'Upgrade': case 'Upgrade':
reasonMessage = 'File was deleted to import an upgrade'; reasonMessage = translate('FileWasDeletedByUpgrade');
break; break;
default: default:
reasonMessage = ''; reasonMessage = '';

View File

@ -94,7 +94,7 @@ class History extends Component {
isPopulated && !hasError && !items.length && isPopulated && !hasError && !items.length &&
<div> <div>
No history found {translate('NoHistory')}
</div> </div>
} }

View File

@ -203,14 +203,14 @@ class Queue extends Component {
{ {
!isRefreshing && hasError && !isRefreshing && hasError &&
<div> <div>
Failed to load Queue {translate('FailedToLoadQueue')}
</div> </div>
} }
{ {
isPopulated && !hasError && !items.length && isPopulated && !hasError && !items.length &&
<div> <div>
Queue is empty {translate('QueueIsEmpty')}
</div> </div>
} }

View File

@ -45,7 +45,7 @@ function QueueDetails(props) {
<Icon <Icon
name={icons.DOWNLOAD} name={icons.DOWNLOAD}
kind={kinds.WARNING} kind={kinds.WARNING}
title={'Downloaded - Unable to Import: check logs for details'} title={translate('UnableToImportCheckLogs')}
/> />
); );
} }

View File

@ -81,12 +81,12 @@ class RemoveQueueItemModal extends Component {
onModalClose={this.onModalClose} onModalClose={this.onModalClose}
> >
<ModalHeader> <ModalHeader>
Remove - {sourceTitle} {translate('Remove')} - {sourceTitle}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<div> <div>
Are you sure you want to remove '{sourceTitle}' from the queue? {translate('RemoveFromQueueText', [sourceTitle])}
</div> </div>
<FormGroup> <FormGroup>

View File

@ -87,7 +87,7 @@ class RemoveQueueItemsModal extends Component {
<ModalBody> <ModalBody>
<div className={styles.message}> <div className={styles.message}>
Are you sure you want to remove {selectedCount} item{selectedCount > 1 ? 's' : ''} from the queue? {translate('AreYouSureYouWantToRemoveSelectedItemsFromQueue', [selectedCount, selectedCount > 1 ? 's' : ''])}
</div> </div>
<FormGroup> <FormGroup>

View File

@ -116,7 +116,7 @@ class ImportMovie extends Component {
rootFoldersPopulated && rootFoldersPopulated &&
!unmappedFolders.length ? !unmappedFolders.length ?
<div> <div>
All movies in {path} have been imported {translate('AllMoviesInPathHaveBeenImported', [path])}
</div> : </div> :
null null
} }

View File

@ -26,27 +26,27 @@ function AppUpdatedModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Radarr Updated {translate('RadarrUpdated')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<div> <div dangerouslySetInnerHTML={{ __html: translate('VersionUpdateText', [`<span className=${styles.version}>${version}</span>`]) }} />
Version <span className={styles.version}>{version}</span> of Radarr has been installed, in order to get the latest changes you'll need to reload Radarr.
</div>
{ {
isPopulated && !error && !!update && isPopulated && !error && !!update &&
<div> <div>
{ {
!update.changes && !update.changes &&
<div className={styles.maintenance}>Maintenance release</div> <div className={styles.maintenance}>
{translate('MaintenanceRelease')}
</div>
} }
{ {
!!update.changes && !!update.changes &&
<div> <div>
<div className={styles.changes}> <div className={styles.changes}>
What's new? {translate('WhatsNew')}
</div> </div>
<UpdateChanges <UpdateChanges
@ -73,14 +73,14 @@ function AppUpdatedModalContent(props) {
<Button <Button
onPress={onSeeChangesPress} onPress={onSeeChangesPress}
> >
Recent Changes translate('RecentChanges')
</Button> </Button>
<Button <Button
kind={kinds.PRIMARY} kind={kinds.PRIMARY}
onPress={onModalClose} onPress={onModalClose}
> >
Reload translate('Reload')
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

View File

@ -168,7 +168,7 @@ class CalendarHeader extends Component {
selectedView={view} selectedView={view}
onPress={this.onViewChange} onPress={this.onViewChange}
> >
Month {translate('Month')}
</ViewMenuItem> </ViewMenuItem>
} }
@ -177,7 +177,7 @@ class CalendarHeader extends Component {
selectedView={view} selectedView={view}
onPress={this.onViewChange} onPress={this.onViewChange}
> >
Week {translate('Week')}
</ViewMenuItem> </ViewMenuItem>
<ViewMenuItem <ViewMenuItem
@ -185,7 +185,7 @@ class CalendarHeader extends Component {
selectedView={view} selectedView={view}
onPress={this.onViewChange} onPress={this.onViewChange}
> >
Forecast {translate('Forecast')}
</ViewMenuItem> </ViewMenuItem>
<ViewMenuItem <ViewMenuItem

View File

@ -1,6 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import { icons, kinds } from 'Helpers/Props'; import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import LegendIconItem from './LegendIconItem'; import LegendIconItem from './LegendIconItem';
import LegendItem from './LegendItem'; import LegendItem from './LegendItem';
import styles from './Legend.css'; import styles from './Legend.css';
@ -16,10 +17,10 @@ function Legend(props) {
if (showCutoffUnmetIcon) { if (showCutoffUnmetIcon) {
iconsToShow.push( iconsToShow.push(
<LegendIconItem <LegendIconItem
name="Cutoff Not Met" name={translate('CutoffUnmet')}
icon={icons.MOVIE_FILE} icon={icons.MOVIE_FILE}
kind={kinds.WARNING} kind={kinds.WARNING}
tooltip="Quality or language cutoff has not been met" tooltip={translate('QualityOrLangCutoffHasNotBeenMet')}
/> />
); );
} }
@ -28,28 +29,28 @@ function Legend(props) {
<div className={styles.legend}> <div className={styles.legend}>
<div> <div>
<LegendItem <LegendItem
status="unreleased" status={translate('Unreleased')}
tooltip="Movie hasn't released yet" tooltip={translate('MovieHasntReleasedYet')}
colorImpairedMode={colorImpairedMode} colorImpairedMode={colorImpairedMode}
/> />
<LegendItem <LegendItem
status="unmonitored" status={translate('Unmonitored')}
tooltip="Movie is unmonitored" tooltip={translate('MovieIsUnmonitored')}
colorImpairedMode={colorImpairedMode} colorImpairedMode={colorImpairedMode}
/> />
</div> </div>
<div> <div>
<LegendItem <LegendItem
status="downloading" status={translate('Downloading')}
tooltip="Movie is currently downloading" tooltip={translate('MovieIsDownloading')}
colorImpairedMode={colorImpairedMode} colorImpairedMode={colorImpairedMode}
/> />
<LegendItem <LegendItem
status="downloaded" status={translate('Downloaded')}
tooltip="Movie was downloaded and sorted" tooltip={translate('MovieWasDownloadedAndSorted')}
colorImpairedMode={colorImpairedMode} colorImpairedMode={colorImpairedMode}
/> />
</div> </div>

View File

@ -107,7 +107,7 @@ class CalendarOptionsModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Calendar Options {translate('CalendarOptions')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -109,7 +109,7 @@ class CalendarLinkModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Radarr Calendar Feed {translate('RadarrCalendarFeed')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -5,16 +5,17 @@ import SelectInput from 'Components/Form/SelectInput';
import TextInput from 'Components/Form/TextInput'; import TextInput from 'Components/Form/TextInput';
import { IN_LAST, IN_NEXT, NOT_IN_LAST, NOT_IN_NEXT } from 'Helpers/Props/filterTypes'; import { IN_LAST, IN_NEXT, NOT_IN_LAST, NOT_IN_NEXT } from 'Helpers/Props/filterTypes';
import isString from 'Utilities/String/isString'; import isString from 'Utilities/String/isString';
import translate from 'Utilities/String/translate';
import { NAME } from './FilterBuilderRowValue'; import { NAME } from './FilterBuilderRowValue';
import styles from './DateFilterBuilderRowValue.css'; import styles from './DateFilterBuilderRowValue.css';
const timeOptions = [ const timeOptions = [
{ key: 'seconds', value: 'seconds' }, { key: 'seconds', value: translate('Seconds') },
{ key: 'minutes', value: 'minutes' }, { key: 'minutes', value: translate('Minutes') },
{ key: 'hours', value: 'hours' }, { key: 'hours', value: translate('Hours') },
{ key: 'days', value: 'days' }, { key: 'days', value: translate('Days') },
{ key: 'weeks', value: 'weeks' }, { key: 'weeks', value: translate('Weeks') },
{ key: 'months', value: 'months' } { key: 'months', value: translate('Months') }
]; ];
function isInFilter(filterType) { function isInFilter(filterType) {

View File

@ -1,12 +1,13 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import translate from 'Utilities/String/translate';
import SelectInput from './SelectInput'; import SelectInput from './SelectInput';
const availabilityOptions = [ const availabilityOptions = [
{ key: 'announced', value: 'Announced' }, { key: 'announced', value: translate('Announced') },
{ key: 'inCinemas', value: 'In Cinemas' }, { key: 'inCinemas', value: translate('InCinemas') },
{ key: 'released', value: 'Released' }, { key: 'released', value: translate('Released') },
{ key: 'preDB', value: 'PreDB' } { key: 'preDB', value: translate('PreDB') }
]; ];
function AvailabilitySelectInput(props) { function AvailabilitySelectInput(props) {

View File

@ -279,7 +279,7 @@ class DiscoverMovie extends Component {
<PageToolbar> <PageToolbar>
<PageToolbarSection> <PageToolbarSection>
<PageToolbarButton <PageToolbarButton
label='Refresh Lists' label={translate('RefreshLists')}
iconName={icons.REFRESH} iconName={icons.REFRESH}
isSpinning={isSyncingLists} isSpinning={isSyncingLists}
isDisabled={hasNoMovie} isDisabled={hasNoMovie}

View File

@ -138,8 +138,8 @@ class DiscoverMovieFooter extends Component {
} = this.state; } = this.state;
const monitoredOptions = [ const monitoredOptions = [
{ key: true, value: 'Monitored' }, { key: true, value: translate('Monitored') },
{ key: false, value: 'Unmonitored' } { key: false, value: translate('Unmonitored') }
]; ];
return ( return (

View File

@ -38,7 +38,7 @@ class ExcludeMovieModalContent extends Component {
<ModalBody> <ModalBody>
<div className={styles.pathContainer}> <div className={styles.pathContainer}>
Exclude {title}? This will prevent Radarr from adding automatically via list sync. {translate('ExcludeTitle', [title])}
</div> </div>
</ModalBody> </ModalBody>

View File

@ -4,6 +4,7 @@ import MenuContent from 'Components/Menu/MenuContent';
import SortMenu from 'Components/Menu/SortMenu'; import SortMenu from 'Components/Menu/SortMenu';
import SortMenuItem from 'Components/Menu/SortMenuItem'; import SortMenuItem from 'Components/Menu/SortMenuItem';
import { align, sortDirections } from 'Helpers/Props'; import { align, sortDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function DiscoverMovieSortMenu(props) { function DiscoverMovieSortMenu(props) {
const { const {
@ -25,7 +26,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Status {translate('Status')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -34,7 +35,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Title {translate('Title')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -43,7 +44,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Studio {translate('Studio')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -52,7 +53,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
In Cinemas {translate('InCinemas')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -61,7 +62,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Physical Release {translate('PhysicalRelease')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -70,7 +71,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Digital Release {translate('DigitalRelease')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -79,7 +80,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Runtime {translate('Runtime')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -88,7 +89,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Rating {translate('Rating')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem
@ -97,7 +98,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Certification {translate('Certification')}
</SortMenuItem> </SortMenuItem>
</MenuContent> </MenuContent>
</SortMenu> </SortMenu>

View File

@ -4,6 +4,7 @@ import MenuContent from 'Components/Menu/MenuContent';
import ViewMenu from 'Components/Menu/ViewMenu'; import ViewMenu from 'Components/Menu/ViewMenu';
import ViewMenuItem from 'Components/Menu/ViewMenuItem'; import ViewMenuItem from 'Components/Menu/ViewMenuItem';
import { align } from 'Helpers/Props'; import { align } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function DiscoverMovieViewMenu(props) { function DiscoverMovieViewMenu(props) {
const { const {
@ -23,7 +24,7 @@ function DiscoverMovieViewMenu(props) {
selectedView={view} selectedView={view}
onPress={onViewSelect} onPress={onViewSelect}
> >
Table {translate('Table')}
</ViewMenuItem> </ViewMenuItem>
<ViewMenuItem <ViewMenuItem
@ -31,7 +32,7 @@ function DiscoverMovieViewMenu(props) {
selectedView={view} selectedView={view}
onPress={onViewSelect} onPress={onViewSelect}
> >
Posters {translate('Posters')}
</ViewMenuItem> </ViewMenuItem>
<ViewMenuItem <ViewMenuItem
@ -39,7 +40,7 @@ function DiscoverMovieViewMenu(props) {
selectedView={view} selectedView={view}
onPress={onViewSelect} onPress={onViewSelect}
> >
Overview {translate('Overview')}
</ViewMenuItem> </ViewMenuItem>
</MenuContent> </MenuContent>
</ViewMenu> </ViewMenu>

View File

@ -21,7 +21,7 @@ function NoDiscoverMovie(props) {
return ( return (
<div> <div>
<div className={styles.message}> <div className={styles.message}>
No list items or recommendations found, to get started you'll want to add a new movie, import some existing ones, or add a list. {translate('NoListRecommendations')}
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>

View File

@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import dimensions from 'Styles/Variables/dimensions'; import dimensions from 'Styles/Variables/dimensions';
import translate from 'Utilities/String/translate';
import DiscoverMovieOverviewInfoRow from './DiscoverMovieOverviewInfoRow'; import DiscoverMovieOverviewInfoRow from './DiscoverMovieOverviewInfoRow';
import styles from './DiscoverMovieOverviewInfo.css'; import styles from './DiscoverMovieOverviewInfo.css';
@ -54,7 +55,7 @@ function getInfoRowProps(row, props) {
if (name === 'year') { if (name === 'year') {
return { return {
title: 'Year', title: translate('Year'),
iconName: icons.CALENDAR, iconName: icons.CALENDAR,
label: props.year label: props.year
}; };
@ -62,7 +63,7 @@ function getInfoRowProps(row, props) {
if (name === 'genres') { if (name === 'genres') {
return { return {
title: 'Genres', title: translate('Genres'),
iconName: icons.GENRE, iconName: icons.GENRE,
label: props.genres.slice(0, 2).join(', ') label: props.genres.slice(0, 2).join(', ')
}; };
@ -70,7 +71,7 @@ function getInfoRowProps(row, props) {
if (name === 'ratings') { if (name === 'ratings') {
return { return {
title: 'Ratings', title: translate('Ratings'),
iconName: icons.HEART, iconName: icons.HEART,
label: `${props.ratings.value * 10}%` label: `${props.ratings.value * 10}%`
}; };
@ -78,7 +79,7 @@ function getInfoRowProps(row, props) {
if (name === 'certification') { if (name === 'certification') {
return { return {
title: 'Certification', title: translate('Certification'),
iconName: icons.FILM, iconName: icons.FILM,
label: props.certification label: props.certification
}; };
@ -86,7 +87,7 @@ function getInfoRowProps(row, props) {
if (name === 'studio') { if (name === 'studio') {
return { return {
title: 'Studio', title: translate('Studio'),
iconName: icons.STUDIO, iconName: icons.STUDIO,
label: props.studio label: props.studio
}; };

View File

@ -14,9 +14,9 @@ import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
const posterSizeOptions = [ const posterSizeOptions = [
{ key: 'small', value: 'Small' }, { key: 'small', value: translate('Small') },
{ key: 'medium', value: 'Medium' }, { key: 'medium', value: translate('Medium') },
{ key: 'large', value: 'Large' } { key: 'large', value: translate('Large') }
]; ];
class DiscoverMovieOverviewOptionsModalContent extends Component { class DiscoverMovieOverviewOptionsModalContent extends Component {

View File

@ -14,9 +14,9 @@ import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
const posterSizeOptions = [ const posterSizeOptions = [
{ key: 'small', value: 'Small' }, { key: 'small', value: translate('Small') },
{ key: 'medium', value: 'Medium' }, { key: 'medium', value: translate('Medium') },
{ key: 'large', value: 'Large' } { key: 'large', value: translate('Large') }
]; ];
class DiscoverMoviePosterOptionsModalContent extends Component { class DiscoverMoviePosterOptionsModalContent extends Component {

View File

@ -17,11 +17,11 @@ import styles from './InteractiveImportSelectFolderModalContent.css';
const recentFoldersColumns = [ const recentFoldersColumns = [
{ {
name: 'folder', name: 'folder',
label: 'Folder' label: translate('Folder')
}, },
{ {
name: 'lastUsed', name: 'lastUsed',
label: 'Last Used' label: translate('LastUsed')
}, },
{ {
name: 'actions', name: 'actions',

View File

@ -69,8 +69,8 @@ const columns = [
]; ];
const filterExistingFilesOptions = { const filterExistingFilesOptions = {
ALL: 'all', ALL: translate('All'),
NEW: 'new' NEW: translate('New')
}; };
const importModeOptions = [ const importModeOptions = [
@ -198,25 +198,25 @@ class InteractiveImportModalContent extends Component {
} = this.state; } = this.state;
const selectedIds = this.getSelectedIds(); const selectedIds = this.getSelectedIds();
const errorMessage = getErrorMessage(error, 'Unable to load manual import items'); const errorMessage = getErrorMessage(error, translate('UnableToLoadManualImportItems'));
const bulkSelectOptions = [ const bulkSelectOptions = [
{ key: SELECT, value: 'Select...', disabled: true }, {
{ key: LANGUAGE, value: 'Select Language' }, key: SELECT, value: translate('SelectDotDot'), disabled: true },
{ key: QUALITY, value: 'Select Quality' } { key: LANGUAGE, value: translate('SelectLanguage') },
]; { key: QUALITY, value: translate('SelectQuality') }];
if (allowMovieChange) { if (allowMovieChange) {
bulkSelectOptions.splice(1, 0, { bulkSelectOptions.splice(1, 0, {
key: MOVIE, key: MOVIE,
value: 'Select Movie' value: translate('SelectMovie')
}); });
} }
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - {title || folder} {translate('ManualImport')} - {title || folder}
</ModalHeader> </ModalHeader>
<ModalBody scrollDirection={scrollDirections.BOTH}> <ModalBody scrollDirection={scrollDirections.BOTH}>
@ -232,7 +232,7 @@ class InteractiveImportModalContent extends Component {
<div className={styles.filterText}> <div className={styles.filterText}>
{ {
filterExistingFiles ? 'Unmapped Files Only' : 'All Files' filterExistingFiles ? translate('UnmappedFilesOnly') : translate('AllFiles')
} }
</div> </div>
</MenuButton> </MenuButton>
@ -243,7 +243,7 @@ class InteractiveImportModalContent extends Component {
isSelected={!filterExistingFiles} isSelected={!filterExistingFiles}
onPress={this.onFilterExistingFilesChange} onPress={this.onFilterExistingFilesChange}
> >
All Files {translate('AllFiles')}
</SelectedMenuItem> </SelectedMenuItem>
<SelectedMenuItem <SelectedMenuItem
@ -251,7 +251,7 @@ class InteractiveImportModalContent extends Component {
isSelected={filterExistingFiles} isSelected={filterExistingFiles}
onPress={this.onFilterExistingFilesChange} onPress={this.onFilterExistingFilesChange}
> >
Unmapped Files Only {translate('UnmappedFilesOnly')}
</SelectedMenuItem> </SelectedMenuItem>
</MenuContent> </MenuContent>
</Menu> </Menu>
@ -302,7 +302,7 @@ class InteractiveImportModalContent extends Component {
{ {
isPopulated && !items.length && !isFetching && isPopulated && !items.length && !isFetching &&
'No video files were found in the selected folder' translate('NoVideoFilesFoundSelectedFolder')
} }
</ModalBody> </ModalBody>
@ -345,7 +345,7 @@ class InteractiveImportModalContent extends Component {
isDisabled={!selectedIds.length || !!invalidRowsSelected.length} isDisabled={!selectedIds.length || !!invalidRowsSelected.length}
onPress={this.onImportSelectedPress} onPress={this.onImportSelectedPress}
> >
Import {translate('Import')}
</Button> </Button>
</div> </div>
</ModalFooter> </ModalFooter>

View File

@ -7,6 +7,7 @@ import * as commandNames from 'Commands/commandNames';
import { executeCommand } from 'Store/Actions/commandActions'; import { executeCommand } from 'Store/Actions/commandActions';
import { clearInteractiveImport, fetchInteractiveImportItems, setInteractiveImportMode, setInteractiveImportSort } from 'Store/Actions/interactiveImportActions'; import { clearInteractiveImport, fetchInteractiveImportItems, setInteractiveImportMode, setInteractiveImportSort } from 'Store/Actions/interactiveImportActions';
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector'; import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
import translate from 'Utilities/String/translate';
import InteractiveImportModalContent from './InteractiveImportModalContent'; import InteractiveImportModalContent from './InteractiveImportModalContent';
function createMapStateToProps() { function createMapStateToProps() {
@ -113,17 +114,17 @@ class InteractiveImportModalContentConnector extends Component {
} = item; } = item;
if (!movie) { if (!movie) {
this.setState({ interactiveImportErrorMessage: 'Movie must be chosen for each selected file' }); this.setState({ interactiveImportErrorMessage: translate('InteractiveImportErrMovie') });
return false; return false;
} }
if (!quality) { if (!quality) {
this.setState({ interactiveImportErrorMessage: 'Quality must be chosen for each selected file' }); this.setState({ interactiveImportErrorMessage: translate('InteractiveImportErrQuality') });
return false; return false;
} }
if (!languages) { if (!languages) {
this.setState({ interactiveImportErrorMessage: 'Language must be chosen for each selected file' }); this.setState({ interactiveImportErrorMessage: translate('InteractiveImportErrLanguage') });
return false; return false;
} }

View File

@ -77,7 +77,7 @@ class SelectLanguageModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Language {translate('ManualImportSelectLanguage')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -128,7 +128,7 @@ class SelectLanguageModalContent extends Component {
kind={kinds.SUCCESS} kind={kinds.SUCCESS}
onPress={this.onLanguageSelect} onPress={this.onLanguageSelect}
> >
Select Languges {translate('SelectLanguges')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

View File

@ -173,7 +173,7 @@ class SelectMovieModalContent extends Component {
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
<div className={styles.header}> <div className={styles.header}>
Manual Import - Select Movie {translate('ManualImportSelectMovie')}
</div> </div>
</ModalHeader> </ModalHeader>

View File

@ -81,7 +81,7 @@ class SelectQualityModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Quality {translate('ManualImportSelectQuality')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -146,7 +146,7 @@ class SelectQualityModalContent extends Component {
kind={kinds.SUCCESS} kind={kinds.SUCCESS}
onPress={this.onQualitySelect} onPress={this.onQualitySelect}
> >
Select Quality {translate('SelectQuality')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

View File

@ -128,21 +128,21 @@ function InteractiveSearchContent(props) {
{ {
!isFetching && !!error && !isFetching && !!error &&
<div> <div>
Unable to load results for this movie search. Try again later {translate('UnableToLoadResultsIntSearch')}
</div> </div>
} }
{ {
!isFetching && isPopulated && !totalReleasesCount && !isFetching && isPopulated && !totalReleasesCount &&
<div> <div>
No results found {translate('NoResultsFound')}
</div> </div>
} }
{ {
!!totalReleasesCount && isPopulated && !items.length && !!totalReleasesCount && isPopulated && !items.length &&
<div> <div>
All results are hidden by the applied filter {translate('AllResultsHiddenFilter')}
</div> </div>
} }
@ -176,7 +176,7 @@ function InteractiveSearchContent(props) {
{ {
totalReleasesCount !== items.length && !!items.length && totalReleasesCount !== items.length && !!items.length &&
<div className={styles.filteredMessage}> <div className={styles.filteredMessage}>
Some results are hidden by the applied filter {translate('SomeResultsHiddenFilter')}
</div> </div>
} }
</div> </div>

View File

@ -35,12 +35,12 @@ function getDownloadTooltip(isGrabbing, isGrabbed, grabError) {
if (isGrabbing) { if (isGrabbing) {
return ''; return '';
} else if (isGrabbed) { } else if (isGrabbed) {
return 'Added to downloaded queue'; return translate('AddedToDownloadQueue');
} else if (grabError) { } else if (grabError) {
return grabError; return grabError;
} }
return 'Add to downloaded queue'; return translate('AddToDownloadQueue');
} }
class InteractiveSearchRow extends Component { class InteractiveSearchRow extends Component {

View File

@ -66,12 +66,12 @@ class DeleteMovieModalContent extends Component {
const deleteFiles = this.state.deleteFiles; const deleteFiles = this.state.deleteFiles;
const addImportExclusion = this.state.addImportExclusion; const addImportExclusion = this.state.addImportExclusion;
let deleteFilesLabel = `Delete ${movieFileCount} Movie Files`; let deleteFilesLabel = translate('DeleteFilesLabel', [movieFileCount]);
let deleteFilesHelpText = 'Delete the movie files and movie folder'; let deleteFilesHelpText = translate('DeleteFilesHelpText');
if (movieFileCount === 0) { if (movieFileCount === 0) {
deleteFilesLabel = 'Delete Movie Folder'; deleteFilesLabel = translate('DeleteMovieFolderLabel');
deleteFilesHelpText = 'Delete the movie folder and it\'s contents'; deleteFilesHelpText = translate('DeleteMovieFolderHelpText');
} }
return ( return (
@ -79,7 +79,7 @@ class DeleteMovieModalContent extends Component {
onModalClose={onModalClose} onModalClose={onModalClose}
> >
<ModalHeader> <ModalHeader>
Delete - {title} {translate('DeleteHeader', [title])}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -108,23 +108,29 @@ class DeleteMovieModalContent extends Component {
{ {
deleteFiles && deleteFiles &&
<div className={styles.deleteFilesMessage}> <div className={styles.deleteFilesMessage}>
<div>The movie folder <strong>{path}</strong> and all it's content will be deleted.</div> <div>
{translate('DeleteTheMovieFolder', [path])}
</div>
{ {
!!movieFileCount && !!movieFileCount &&
<div>{movieFileCount} movie files totaling {formatBytes(sizeOnDisk)}</div> <div>
{movieFileCount} {translate('MovieFilesTotaling')} {formatBytes(sizeOnDisk)}
</div>
} }
</div> </div>
} }
<FormGroup> <FormGroup>
<FormLabel>Add List Exclusion</FormLabel> <FormLabel>
{translate('AddListExclusion')}
</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="addImportExclusion" name="addImportExclusion"
value={addImportExclusion} value={addImportExclusion}
helpText="Prevent movie from being added to Radarr by lists" helpText={translate('AddImportExclusionHelpText')}
kind={kinds.DANGER} kind={kinds.DANGER}
onChange={this.onAddImportExclusionChange} onChange={this.onAddImportExclusionChange}
/> />

View File

@ -3,6 +3,7 @@ import React from 'react';
import Label from 'Components/Label'; import Label from 'Components/Label';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { kinds, sizes } from 'Helpers/Props'; import { kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './MovieDetailsLinks.css'; import styles from './MovieDetailsLinks.css';
function MovieDetailsLinks(props) { function MovieDetailsLinks(props) {
@ -23,7 +24,7 @@ function MovieDetailsLinks(props) {
kind={kinds.INFO} kind={kinds.INFO}
size={sizes.LARGE} size={sizes.LARGE}
> >
TMDb {translate('TMDb')}
</Label> </Label>
</Link> </Link>
@ -36,7 +37,7 @@ function MovieDetailsLinks(props) {
kind={kinds.INFO} kind={kinds.INFO}
size={sizes.LARGE} size={sizes.LARGE}
> >
Trakt {translate('Trakt')}
</Label> </Label>
</Link> </Link>
@ -51,7 +52,7 @@ function MovieDetailsLinks(props) {
kind={kinds.INFO} kind={kinds.INFO}
size={sizes.LARGE} size={sizes.LARGE}
> >
IMDb {translate('IMDb')}
</Label> </Label>
</Link> </Link>
} }
@ -67,7 +68,7 @@ function MovieDetailsLinks(props) {
kind={kinds.INFO} kind={kinds.INFO}
size={sizes.LARGE} size={sizes.LARGE}
> >
Movie Chat {translate('MovieChat')}
</Label> </Label>
</Link> </Link>
} }
@ -83,7 +84,7 @@ function MovieDetailsLinks(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
size={sizes.LARGE} size={sizes.LARGE}
> >
Trailer {translate('Trailer')}
</Label> </Label>
</Link> </Link>
} }

View File

@ -85,7 +85,7 @@ class MovieDetailsPageConnector extends Component {
if (!isFetching && !!error) { if (!isFetching && !!error) {
return ( return (
<div className={styles.errorMessage}> <div className={styles.errorMessage}>
{getErrorMessage(error, 'Failed to load movie from API')} {getErrorMessage(error, translate('FailedToLoadMovieFromAPI'))}
</div> </div>
); );
} }

View File

@ -48,12 +48,16 @@ class MovieTitlesTableContent extends Component {
{ {
!isFetching && !!error && !isFetching && !!error &&
<div className={styles.blankpad}>Unable to load alternative titles.</div> <div className={styles.blankpad}>
{translate('UnableToLoadAltTitle')}
</div>
} }
{ {
isPopulated && !hasItems && !error && isPopulated && !hasItems && !error &&
<div className={styles.blankpad}>No alternative titles.</div> <div className={styles.blankpad}>
{translate('NoAltTitle')}
</div>
} }
{ {

View File

@ -60,7 +60,7 @@ class DeleteMovieModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Delete Selected Movie(s) {translate('DeleteSelectedMovie')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -154,9 +154,9 @@ class MovieEditorFooter extends Component {
} = this.state; } = this.state;
const monitoredOptions = [ const monitoredOptions = [
{ key: NO_CHANGE, value: 'No Change', disabled: true }, { key: NO_CHANGE, value: translate('NoChange'), disabled: true },
{ key: 'monitored', value: 'Monitored' }, { key: 'monitored', value: translate('Monitored') },
{ key: 'unmonitored', value: 'Unmonitored' } { key: 'unmonitored', value: translate('Unmonitored') }
]; ];
return ( return (

View File

@ -21,12 +21,12 @@ function OrganizeMovieModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Organize Selected Movies {translate('OrganizeSelectedMovies')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<Alert> <Alert>
Tip: To preview a rename... select "Cancel" then click any movie title and use the {translate('PreviewRenameHelpText')}
<Icon <Icon
className={styles.renameIcon} className={styles.renameIcon}
name={icons.ORGANIZE} name={icons.ORGANIZE}
@ -34,7 +34,7 @@ function OrganizeMovieModalContent(props) {
</Alert> </Alert>
<div className={styles.message}> <div className={styles.message}>
Are you sure you want to organize all files in the {movieTitles.length} selected movie(s)? {translate('OrganizeConfirm', [movieTitles.length])}
</div> </div>
<ul> <ul>
@ -59,7 +59,7 @@ function OrganizeMovieModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onOrganizeMoviePress} onPress={onOrganizeMoviePress}
> >
Organize {translate('Organize')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

View File

@ -61,9 +61,9 @@ class TagsModalContent extends Component {
} = this.state; } = this.state;
const applyTagsOptions = [ const applyTagsOptions = [
{ key: 'add', value: 'Add' }, { key: 'add', value: translate('Add') },
{ key: 'remove', value: 'Remove' }, { key: 'remove', value: translate('Remove') },
{ key: 'replace', value: 'Replace' } { key: 'replace', value: translate('Replace') }
]; ];
return ( return (

View File

@ -72,12 +72,16 @@ class MovieHistoryTableContent extends Component {
{ {
!isFetching && !!error && !isFetching && !!error &&
<div className={styles.blankpad}>Unable to load history</div> <div className={styles.blankpad}>
{translate('UnableToLoadHistory')}
</div>
} }
{ {
isPopulated && !hasItems && !error && isPopulated && !hasItems && !error &&
<div className={styles.blankpad}>No history</div> <div className={styles.blankpad}>
{translate('NoHistory')}
</div>
} }
{ {

View File

@ -5,6 +5,7 @@ import MenuContent from 'Components/Menu/MenuContent';
import SearchMenuItem from 'Components/Menu/SearchMenuItem'; import SearchMenuItem from 'Components/Menu/SearchMenuItem';
import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton'; import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton';
import { align, icons } from 'Helpers/Props'; import { align, icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
class MovieIndexSearchMenu extends Component { class MovieIndexSearchMenu extends Component {
@ -29,14 +30,14 @@ class MovieIndexSearchMenu extends Component {
name="missingMoviesSearch" name="missingMoviesSearch"
onPress={onSearchPress} onPress={onSearchPress}
> >
Search Missing {translate('SearchMissing')}
</SearchMenuItem> </SearchMenuItem>
<SearchMenuItem <SearchMenuItem
name="cutoffUnmetMoviesSearch" name="cutoffUnmetMoviesSearch"
onPress={onSearchPress} onPress={onSearchPress}
> >
Search Cutoff Unmet {translate('SearchCutoffUnmet')}
</SearchMenuItem> </SearchMenuItem>
</MenuContent> </MenuContent>
</Menu> </Menu>

View File

@ -26,7 +26,7 @@ function MovieIndexSortMenu(props) {
sortDirection={sortDirection} sortDirection={sortDirection}
onPress={onSortSelect} onPress={onSortSelect}
> >
Monitored/Status {translate('MonitoredStatus')}
</SortMenuItem> </SortMenuItem>
<SortMenuItem <SortMenuItem

View File

@ -519,7 +519,7 @@ class MovieIndex extends Component {
{ {
!isFetching && !!error && !isFetching && !!error &&
<div className={styles.errorMessage}> <div className={styles.errorMessage}>
{getErrorMessage(error, 'Failed to load movie from API')} {getErrorMessage(error, translate('FailedToLoadMovieFromAPI'))}
</div> </div>
} }
@ -610,7 +610,7 @@ class MovieIndex extends Component {
Are you sure you want to perform mass movie search for {isMovieEditorActive && selectedMovieIds.length > 0 ? selectedMovieIds.length : this.props.items.length} movies? Are you sure you want to perform mass movie search for {isMovieEditorActive && selectedMovieIds.length > 0 ? selectedMovieIds.length : this.props.items.length} movies?
</div> </div>
<div> <div>
This cannot be cancelled once started without restarting Radarr. {translate('ThisCannotBeCancelled')}
</div> </div>
</div> </div>
} }

View File

@ -14,9 +14,9 @@ import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
const posterSizeOptions = [ const posterSizeOptions = [
{ key: 'small', value: 'Small' }, { key: 'small', value: translate('Small') },
{ key: 'medium', value: 'Medium' }, { key: 'medium', value: translate('Medium') },
{ key: 'large', value: 'Large' } { key: 'large', value: translate('Large') }
]; ];
class MovieIndexOverviewOptionsModalContent extends Component { class MovieIndexOverviewOptionsModalContent extends Component {

View File

@ -242,7 +242,7 @@ class MovieIndexPoster extends Component {
{ {
showMonitored && showMonitored &&
<div className={styles.title}> <div className={styles.title}>
{monitored ? 'Monitored' : 'Unmonitored'} {monitored ? translate('Monitored') : translate('Unmonitored')}
</div> </div>
} }

View File

@ -14,9 +14,9 @@ import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
const posterSizeOptions = [ const posterSizeOptions = [
{ key: 'small', value: 'Small' }, { key: 'small', value: translate('Small') },
{ key: 'medium', value: 'Medium' }, { key: 'medium', value: translate('Medium') },
{ key: 'large', value: 'Large' } { key: 'large', value: translate('Large') }
]; ];
class MovieIndexPosterOptionsModalContent extends Component { class MovieIndexPosterOptionsModalContent extends Component {

View File

@ -7,6 +7,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds, sizes } from 'Helpers/Props'; import { kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './MoveMovieModal.css'; import styles from './MoveMovieModal.css';
function MoveMovieModal(props) { function MoveMovieModal(props) {
@ -40,19 +41,19 @@ function MoveMovieModal(props) {
onModalClose={onSavePress} onModalClose={onSavePress}
> >
<ModalHeader> <ModalHeader>
Move Files {translate('MoveFiles')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
{ {
destinationRootFolder ? destinationRootFolder ?
`Would you like to move the movie folders to '${destinationRootFolder}'?` : translate('MovieFolders1', [destinationRootFolder]) :
`Would you like to move the movie files from '${originalPath}' to '${destinationPath}'?` translate('MovieFolders2', [originalPath, destinationPath])
} }
{ {
destinationRootFolder ? destinationRootFolder ?
<div> <div>
This will also rename the movie folder per the movie folder format in settings. {translate('FolderMoveRenameWarning')}
</div> : </div> :
null null
} }
@ -63,14 +64,14 @@ function MoveMovieModal(props) {
className={styles.doNotMoveButton} className={styles.doNotMoveButton}
onPress={onSavePress} onPress={onSavePress}
> >
No, I'll Move the Files Myself {translate('NoMoveFilesSelf')}
</Button> </Button>
<Button <Button
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onMoveMoviePress} onPress={onMoveMoviePress}
> >
Yes, Move the Files {translate('YesMoveFiles')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

View File

@ -35,7 +35,7 @@ function MovieLanguage(props) {
className={className} className={className}
kind={isCutoffNotMet ? kinds.INVERSE : kinds.DEFAULT} kind={isCutoffNotMet ? kinds.INVERSE : kinds.DEFAULT}
> >
Multi-Language {translate('MultiLanguage')}
</Label> </Label>
} }
title={translate('Languages')} title={translate('Languages')}

View File

@ -1,30 +1,31 @@
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
export function getMovieStatusDetails(status) { export function getMovieStatusDetails(status) {
let statusDetails = { let statusDetails = {
icon: icons.ANNOUNCED, icon: icons.ANNOUNCED,
title: 'Announced', title: translate('Announced'),
message: 'Movie is announced' message: translate('AnnoucedMsg')
}; };
if (status === 'deleted') { if (status === 'deleted') {
statusDetails = { statusDetails = {
icon: icons.MOVIE_DELETED, icon: icons.MOVIE_DELETED,
title: 'Deleted', title: translate('Deleted'),
message: 'Movie was deleted from TMDb' message: translate('DeletedMsg')
}; };
} else if (status === 'inCinemas') { } else if (status === 'inCinemas') {
statusDetails = { statusDetails = {
icon: icons.IN_CINEMAS, icon: icons.IN_CINEMAS,
title: 'In Cinemas', title: translate('InCinemas'),
message: 'Movie is in Cinemas' message: translate('InCinemasMsg')
}; };
} else if (status === 'released') { } else if (status === 'released') {
statusDetails = { statusDetails = {
icon: icons.MOVIE_FILE, icon: icons.MOVIE_FILE,
title: 'Released', title: translate('Released'),
message: 'Movie is released' message: translate('ReleasedMsg')
}; };
} }

View File

@ -21,7 +21,7 @@ function NoMovie(props) {
return ( return (
<div> <div>
<div className={styles.message}> <div className={styles.message}>
No movies found, to get started you'll want to add a new movie or import some existing ones. {translate('NoMoviesExist')}
</div> </div>
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>

View File

@ -11,7 +11,7 @@ import styles from './MovieFileEditorTableContent.css';
const columns = [ const columns = [
{ {
name: 'title', name: 'title',
label: 'Relative Path', label: translate('RelativePath'),
isVisible: true isVisible: true
}, },
{ {

View File

@ -81,7 +81,7 @@ class SelectQualityModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Quality {translate('ManualImportSelectQuality')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -146,7 +146,7 @@ class SelectQualityModalContent extends Component {
kind={kinds.SUCCESS} kind={kinds.SUCCESS}
onPress={this.onQualitySelect} onPress={this.onQualitySelect}
> >
Select Quality {translate('SelectQuality')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

View File

@ -154,7 +154,7 @@ class CustomFormat extends Component {
message={ message={
<div> <div>
<div> <div>
Are you sure you want to delete custom format '{name}'? {translate('AreYouSureYouWantToDeleteFormat', [name])}
</div> </div>
</div> </div>
} }

View File

@ -100,7 +100,7 @@ class EditCustomFormatModalContent extends Component {
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Custom Format' : 'Add Custom Format'} {id ? translate('EditCustomFormat') : translate('AddCustomFormat')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -125,7 +125,7 @@ class EditCustomFormatModalContent extends Component {
> >
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>
Name {translate('Name')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup

View File

@ -58,7 +58,7 @@ class AddSpecificationItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onSpecificationSelect} onPress={this.onSpecificationSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -66,7 +66,7 @@ class AddSpecificationItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>

View File

@ -64,7 +64,7 @@ function EditSpecificationModalContent(props) {
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>
Name {translate('Name')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -92,7 +92,7 @@ function EditSpecificationModalContent(props) {
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>
Negate {translate('Negate')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -106,7 +106,7 @@ function EditSpecificationModalContent(props) {
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>
Required {translate('Required')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup

View File

@ -92,14 +92,14 @@ class Specification extends Component {
{ {
negate && negate &&
<Label kind={kinds.DANGER}> <Label kind={kinds.DANGER}>
{'Negated'} {translate('Negated')}
</Label> </Label>
} }
{ {
required && required &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
{'Required'} {translate('Required')}
</Label> </Label>
} }
</div> </div>
@ -118,7 +118,7 @@ class Specification extends Component {
message={ message={
<div> <div>
<div> <div>
Are you sure you want to delete format tag '{name}'? {translate('AreYouSureYouWantToDeleteFormat', [name])}
</div> </div>
</div> </div>
} }

View File

@ -58,7 +58,7 @@ class AddDownloadClientItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onDownloadClientSelect} onPress={this.onDownloadClientSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -66,7 +66,7 @@ class AddDownloadClientItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>

View File

@ -32,7 +32,7 @@ class AddDownloadClientModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Add DownloadClient {translate('AddDownloadClient')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -73,13 +73,13 @@ class DownloadClient extends Component {
{ {
enable ? enable ?
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
Enabled {translate('Enabled')}
</Label> : </Label> :
<Label <Label
kind={kinds.DISABLED} kind={kinds.DISABLED}
outline={true} outline={true}
> >
Disabled {translate('Disabled')}
</Label> </Label>
} }
@ -89,7 +89,7 @@ class DownloadClient extends Component {
kind={kinds.DISABLED} kind={kinds.DISABLED}
outline={true} outline={true}
> >
Priority: {priority} {translate('PrioritySettings', [priority])}
</Label> </Label>
} }
</div> </div>

View File

@ -53,7 +53,7 @@ class EditDownloadClientModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{`${id ? 'Edit' : 'Add'} Download Client - ${implementationName}`} {`${id ? translate('Edit') : translate('Add')} ${translate('DownloadClient')} - ${implementationName}`}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -8,9 +8,9 @@ import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
const logLevelOptions = [ const logLevelOptions = [
{ key: 'info', value: 'Info' }, { key: 'info', value: translate('Info') },
{ key: 'debug', value: 'Debug' }, { key: 'debug', value: translate('Debug') },
{ key: 'trace', value: 'Trace' } { key: 'trace', value: translate('Trace') }
]; ];
function LoggingSettings(props) { function LoggingSettings(props) {

View File

@ -25,9 +25,9 @@ function ProxySettings(props) {
} = settings; } = settings;
const proxyTypeOptions = [ const proxyTypeOptions = [
{ key: 'http', value: 'HTTP(S)' }, { key: 'http', value: translate('HttpHttps') },
{ key: 'socks4', value: 'Socks4' }, { key: 'socks4', value: translate('Socks4') },
{ key: 'socks5', value: 'Socks5 (Support TOR)' } { key: 'socks5', value: translate('Socks5') }
]; ];
return ( return (

View File

@ -12,15 +12,15 @@ import { icons, inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
const authenticationMethodOptions = [ const authenticationMethodOptions = [
{ key: 'none', value: 'None' }, { key: 'none', value: translate('None') },
{ key: 'basic', value: 'Basic (Browser Popup)' }, { key: 'basic', value: translate('AuthBasic') },
{ key: 'forms', value: 'Forms (Login Page)' } { key: 'forms', value: translate('AuthForm') }
]; ];
const certificateValidationOptions = [ const certificateValidationOptions = [
{ key: 'enabled', value: 'Enabled' }, { key: 'enabled', value: translate('Enabled') },
{ key: 'disabledForLocalAddresses', value: 'Disabled for Local Addresses' }, { key: 'disabledForLocalAddresses', value: translate('CertValidationNoLocal') },
{ key: 'disabled', value: 'Disabled' } { key: 'disabled', value: translate('Disabled') }
]; ];
class SecuritySettings extends Component { class SecuritySettings extends Component {

View File

@ -38,10 +38,10 @@ function UpdateSettings(props) {
value: titleCase(packageUpdateMechanism) value: titleCase(packageUpdateMechanism)
}); });
} else { } else {
updateOptions.push({ key: 'builtIn', value: 'Built-In' }); updateOptions.push({ key: 'builtIn', value: translate('BuiltIn') });
} }
updateOptions.push({ key: 'script', value: 'Script' }); updateOptions.push({ key: 'script', value: translate('Script') });
return ( return (
<FieldSet legend={translate('Updates')}> <FieldSet legend={translate('Updates')}>

View File

@ -39,7 +39,7 @@ function EditImportExclusionModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit List Exclusion' : 'Add List Exclusion'} {id ? translate('EditListExclusion') : translate('AddListExclusion')}
</ModalHeader> </ModalHeader>
<ModalBody className={styles.body}> <ModalBody className={styles.body}>

View File

@ -58,7 +58,7 @@ class AddImportListItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onImportListSelect} onPress={this.onImportListSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -66,7 +66,7 @@ class AddImportListItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>

View File

@ -52,7 +52,7 @@ function EditImportListModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{`${id ? 'Edit' : 'Add'} List - ${implementationName}`} {`${id ? translate('Edit') : translate('Add')} ${translate('List')} - ${implementationName}`}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -74,14 +74,14 @@ class ImportList extends Component {
{ {
enabled && enabled &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
Enabled {translate('Enabled')}
</Label> </Label>
} }
{ {
enableAuto && enableAuto &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
Auto {translate('Auto')}
</Label> </Label>
} }
@ -91,7 +91,7 @@ class ImportList extends Component {
kind={kinds.DISABLED} kind={kinds.DISABLED}
outline={true} outline={true}
> >
Disabled {translate('Disabled')}
</Label> </Label>
} }
</div> </div>

View File

@ -19,11 +19,11 @@ function ImportListOptions(props) {
} = props; } = props;
const cleanLibraryLevelOptions = [ const cleanLibraryLevelOptions = [
{ key: 'disabled', value: 'Disabled' }, { key: 'disabled', value: translate('Disabled') },
{ key: 'logOnly', value: 'Log Only' }, { key: 'logOnly', value: translate('LogOnly') },
{ key: 'keepAndUnmonitor', value: 'Keep and Unmonitor Movie' }, { key: 'keepAndUnmonitor', value: translate('KeepAndUnmonitorMovie') },
{ key: 'removeAndKeep', value: 'Remove Movie and Keep Files' }, { key: 'removeAndKeep', value: translate('RemoveMovieAndKeepFiles') },
{ key: 'removeAndDelete', value: 'Remove Movie and Delete Files' } { key: 'removeAndDelete', value: translate('RemoveMovieAndDeleteFiles') }
]; ];
return ( return (

View File

@ -58,7 +58,7 @@ class AddIndexerItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onIndexerSelect} onPress={this.onIndexerSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -66,7 +66,7 @@ class AddIndexerItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>

View File

@ -32,7 +32,7 @@ class AddIndexerModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Add Indexer {translate('AddIndexer')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -98,7 +98,7 @@ class Indexer extends Component {
{ {
supportsRss && enableRss && supportsRss && enableRss &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
RSS {translate('RSS')}
</Label> </Label>
} }

View File

@ -16,21 +16,21 @@ import NamingConnector from './Naming/NamingConnector';
import AddRootFolderConnector from './RootFolder/AddRootFolderConnector'; import AddRootFolderConnector from './RootFolder/AddRootFolderConnector';
const rescanAfterRefreshOptions = [ const rescanAfterRefreshOptions = [
{ key: 'always', value: 'Always' }, { key: 'always', value: translate('Always') },
{ key: 'afterManual', value: 'After Manual Refresh' }, { key: 'afterManual', value: translate('AfterManualRefresh') },
{ key: 'never', value: 'Never' } { key: 'never', value: translate('Never') }
]; ];
const downloadPropersAndRepacksOptions = [ const downloadPropersAndRepacksOptions = [
{ key: 'preferAndUpgrade', value: 'Prefer and Upgrade' }, { key: 'preferAndUpgrade', value: translate('PreferAndUpgrade') },
{ key: 'doNotUpgrade', value: 'Do not Upgrade Automatically' }, { key: 'doNotUpgrade', value: translate('DoNotUpgradeAutomatically') },
{ key: 'doNotPrefer', value: 'Do not Prefer' } { key: 'doNotPrefer', value: translate('DoNotPrefer') }
]; ];
const fileDateOptions = [ const fileDateOptions = [
{ key: 'none', value: 'None' }, { key: 'none', value: translate('None') },
{ key: 'cinemas', value: 'In Cinemas Date' }, { key: 'cinemas', value: translate('InCinemasDate') },
{ key: 'release', value: 'Physical Release Date' } { key: 'release', value: translate('PhysicalReleaseDate') }
]; ];
class MediaManagement extends Component { class MediaManagement extends Component {

View File

@ -13,10 +13,10 @@ import NamingModal from './NamingModal';
import styles from './Naming.css'; import styles from './Naming.css';
const colonReplacementOptions = [ const colonReplacementOptions = [
{ key: 'delete', value: 'Delete' }, { key: 'delete', value: translate('Delete') },
{ key: 'dash', value: 'Replace with Dash' }, { key: 'dash', value: translate('ReplaceWithDash') },
{ key: 'spaceDash', value: 'Replace with Space Dash' }, { key: 'spaceDash', value: translate('ReplaceWithSpaceDash') },
{ key: 'spaceDashSpace', value: 'Replace with Space Dash Space' } { key: 'spaceDashSpace', value: translate('ReplaceWithSpaceDashSpace') }
]; ];
class Naming extends Component { class Naming extends Component {
@ -91,13 +91,13 @@ class Naming extends Component {
if (examples.movieExample) { if (examples.movieExample) {
standardMovieFormatHelpTexts.push(`Movie: ${examples.movieExample}`); standardMovieFormatHelpTexts.push(`Movie: ${examples.movieExample}`);
} else { } else {
standardMovieFormatErrors.push({ message: 'Movie: Invalid Format' }); standardMovieFormatErrors.push({ message: translate('MovieInvalidFormat') });
} }
if (examples.movieFolderExample) { if (examples.movieFolderExample) {
movieFolderFormatHelpTexts.push(`Example: ${examples.movieFolderExample}`); movieFolderFormatHelpTexts.push(`Example: ${examples.movieFolderExample}`);
} else { } else {
movieFolderFormatErrors.push({ message: 'Invalid Format' }); movieFolderFormatErrors.push({ message: translate('InvalidFormat') });
} }
} }

View File

@ -102,9 +102,9 @@ class NamingModal extends Component {
]; ];
const caseOptions = [ const caseOptions = [
{ key: 'title', value: 'Default Case' }, { key: 'title', value: translate('DefaultCase') },
{ key: 'lower', value: 'Lower Case' }, { key: 'lower', value: translate('LowerCase') },
{ key: 'upper', value: 'Upper Case' } { key: 'upper', value: translate('UpperCase') }
]; ];
const fileNameTokens = [ const fileNameTokens = [
@ -174,7 +174,7 @@ class NamingModal extends Component {
> >
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
File Name Tokens {translate('FileNameTokens')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -4,6 +4,7 @@ import FileBrowserModal from 'Components/FileBrowser/FileBrowserModal';
import Icon from 'Components/Icon'; import Icon from 'Components/Icon';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import { icons, kinds, sizes } from 'Helpers/Props'; import { icons, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './AddRootFolder.css'; import styles from './AddRootFolder.css';
class AddRootFolder extends Component { class AddRootFolder extends Component {
@ -49,7 +50,7 @@ class AddRootFolder extends Component {
className={styles.importButtonIcon} className={styles.importButtonIcon}
name={icons.DRIVE} name={icons.DRIVE}
/> />
Add Root Folder {translate('AddRootFolder')}
</Button> </Button>
<FileBrowserModal <FileBrowserModal

View File

@ -3,6 +3,7 @@ import React, { Component } from 'react';
import Card from 'Components/Card'; import Card from 'Components/Card';
import Label from 'Components/Label'; import Label from 'Components/Label';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import EditMetadataModalConnector from './EditMetadataModalConnector'; import EditMetadataModalConnector from './EditMetadataModalConnector';
import styles from './Metadata.css'; import styles from './Metadata.css';
@ -66,13 +67,13 @@ class Metadata extends Component {
{ {
enable ? enable ?
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
Enabled {translate('Enabled')}
</Label> : </Label> :
<Label <Label
kind={kinds.DISABLED} kind={kinds.DISABLED}
outline={true} outline={true}
> >
Disabled {translate('Disabled')}
</Label> </Label>
} }
</div> </div>
@ -81,7 +82,7 @@ class Metadata extends Component {
enable && !!metadataFields.length && enable && !!metadataFields.length &&
<div> <div>
<div className={styles.section}> <div className={styles.section}>
Metadata {translate('Metadata')}
</div> </div>
{ {
@ -107,7 +108,7 @@ class Metadata extends Component {
enable && !!imageFields.length && enable && !!imageFields.length &&
<div> <div>
<div className={styles.section}> <div className={styles.section}>
Images {translate('Images')}
</div> </div>
{ {

View File

@ -9,6 +9,8 @@ import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { inputTypes } from 'Helpers/Props'; import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
// Note: Do Not Translate Certification Countries
export const certificationCountryOptions = [ export const certificationCountryOptions = [
{ key: 'au', value: 'Australia' }, { key: 'au', value: 'Australia' },
{ key: 'br', value: 'Brazil' }, { key: 'br', value: 'Brazil' },

View File

@ -58,7 +58,7 @@ class AddNotificationItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onNotificationSelect} onPress={this.onNotificationSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -66,7 +66,7 @@ class AddNotificationItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>

View File

@ -28,7 +28,7 @@ class AddNotificationModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Add Notification {translate('AddNotification')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -48,7 +48,7 @@ function EditNotificationModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{`${id ? 'Edit' : 'Add'} Connection - ${implementationName}`} {`${id ? translate('Edit') : translate('Add')} ${translate('Connection')} - ${implementationName}`}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -82,42 +82,42 @@ class Notification extends Component {
{ {
supportsOnGrab && onGrab && supportsOnGrab && onGrab &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
On Grab {translate('OnGrab')}
</Label> </Label>
} }
{ {
supportsOnDelete && onDelete && supportsOnDelete && onDelete &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
On Delete {translate('OnDelete')}
</Label> </Label>
} }
{ {
supportsOnDownload && onDownload && supportsOnDownload && onDownload &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
On Import {translate('OnImport')}
</Label> </Label>
} }
{ {
supportsOnUpgrade && onDownload && onUpgrade && supportsOnUpgrade && onDownload && onUpgrade &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
On Upgrade {translate('OnUpgrade')}
</Label> </Label>
} }
{ {
supportsOnRename && onRename && supportsOnRename && onRename &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
On Rename {translate('OnRename')}
</Label> </Label>
} }
{ {
supportsOnHealthIssue && onHealthIssue && supportsOnHealthIssue && onHealthIssue &&
<Label kind={kinds.SUCCESS}> <Label kind={kinds.SUCCESS}>
On Health Issue {translate('OnHealthIssue')}
</Label> </Label>
} }
@ -127,7 +127,7 @@ class Notification extends Component {
kind={kinds.DISABLED} kind={kinds.DISABLED}
outline={true} outline={true}
> >
Disabled {translate('Disabled')}
</Label> </Label>
} }

View File

@ -88,9 +88,9 @@ class DelayProfile extends Component {
let preferred = titleCase(preferredProtocol); let preferred = titleCase(preferredProtocol);
if (!enableUsenet) { if (!enableUsenet) {
preferred = 'Only Torrent'; preferred = translate('OnlyTorrent');
} else if (!enableTorrent) { } else if (!enableTorrent) {
preferred = 'Only Usenet'; preferred = translate('OnlyUsenet');
} }
return ( return (

View File

@ -46,7 +46,7 @@ function EditDelayProfileModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Delay Profile' : 'Add Delay Profile'} {id ? translate('EditDelayProfile') : translate('AddDelayProfile')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -113,7 +113,7 @@ function EditDelayProfileModalContent(props) {
{ {
id === 1 ? id === 1 ?
<Alert> <Alert>
This is the default profile. It applies to all movies that don't have an explicit profile. {translate('DefaultDelayProfile')}
</Alert> : </Alert> :
<FormGroup> <FormGroup>

View File

@ -5,6 +5,7 @@ import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { saveDelayProfile, setDelayProfileValue } from 'Store/Actions/settingsActions'; import { saveDelayProfile, setDelayProfileValue } from 'Store/Actions/settingsActions';
import selectSettings from 'Store/Selectors/selectSettings'; import selectSettings from 'Store/Selectors/selectSettings';
import translate from 'Utilities/String/translate';
import EditDelayProfileModalContent from './EditDelayProfileModalContent'; import EditDelayProfileModalContent from './EditDelayProfileModalContent';
const newDelayProfile = { const newDelayProfile = {
@ -17,10 +18,10 @@ const newDelayProfile = {
}; };
const protocolOptions = [ const protocolOptions = [
{ key: 'preferUsenet', value: 'Prefer Usenet' }, { key: 'preferUsenet', value: translate('PreferUsenet') },
{ key: 'preferTorrent', value: 'Prefer Torrent' }, { key: 'preferTorrent', value: translate('PreferTorrent') },
{ key: 'onlyUsenet', value: 'Only Usenet' }, { key: 'onlyUsenet', value: translate('OnlyUsenet') },
{ key: 'onlyTorrent', value: 'Only Torrent' } { key: 'onlyTorrent', value: translate('OnlyTorrent') }
]; ];
function createDelayProfileSelector() { function createDelayProfileSelector() {

View File

@ -29,9 +29,9 @@ class Profiles extends Component {
<QualityProfilesConnector /> <QualityProfilesConnector />
<DelayProfilesConnector /> <DelayProfilesConnector />
<div className={styles.addCustomFormatMessage}> <div className={styles.addCustomFormatMessage}>
Looking for Release Profiles? Try {translate('LookingForReleaseProfiles1')}
<Link to='/settings/customformats'> Custom Formats </Link> <Link to='/settings/customformats'> {translate('CustomFormats')} </Link>
instead. {translate('LookingForReleaseProfiles2')}
</div> </div>
</DndProvider> </DndProvider>
</PageContentBody> </PageContentBody>

View File

@ -140,7 +140,7 @@ class EditQualityProfileModalContent extends Component {
onMeasure={this.onHeaderMeasure} onMeasure={this.onHeaderMeasure}
> >
<ModalHeader> <ModalHeader>
{id ? 'Edit Quality Profile' : 'Add Quality Profile'} {id ? translate('EditQualityProfile') : translate('AddQualityProfile')}
</ModalHeader> </ModalHeader>
</Measure> </Measure>
@ -171,7 +171,7 @@ class EditQualityProfileModalContent extends Component {
<div className={styles.formGroupWrapper}> <div className={styles.formGroupWrapper}>
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Name {translate('Name')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -184,7 +184,7 @@ class EditQualityProfileModalContent extends Component {
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Upgrades Allowed {translate('UpgradesAllowed')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -200,7 +200,7 @@ class EditQualityProfileModalContent extends Component {
upgradeAllowed.value && upgradeAllowed.value &&
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Upgrade Until Quality {translate('UpgradeUntilQuality')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -218,7 +218,7 @@ class EditQualityProfileModalContent extends Component {
formatItems.value.length > 0 && formatItems.value.length > 0 &&
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Minimum Custom Format Score {translate('MinimumCustomFormatScore')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -235,7 +235,7 @@ class EditQualityProfileModalContent extends Component {
upgradeAllowed.value && formatItems.value.length > 0 && upgradeAllowed.value && formatItems.value.length > 0 &&
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Upgrade Until Custom Format Score {translate('UpgradeUntilCustomFormatScore')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -250,7 +250,7 @@ class EditQualityProfileModalContent extends Component {
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Language {translate('Language')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -301,7 +301,7 @@ class EditQualityProfileModalContent extends Component {
className={styles.deleteButtonContainer} className={styles.deleteButtonContainer}
title={ title={
isInUse ? isInUse ?
'Can\'t delete a quality profile that is attached to a movie' : translate('QualityProfileInUse') :
undefined undefined
} }
> >

View File

@ -68,8 +68,8 @@ class QualityProfileFormatItems extends Component {
if (profileFormatItems.length < 1) { if (profileFormatItems.length < 1) {
return ( return (
<div className={styles.addCustomFormatMessage}> <div className={styles.addCustomFormatMessage}>
Want more control over which downloads are preferred? Add a {translate('MoreControlCFText')}
<Link to='/settings/customformats'> Custom Format </Link> <Link to='/settings/customformats'> {translate('CustomFormat')} </Link>
</div> </div>
); );
} }
@ -82,7 +82,7 @@ class QualityProfileFormatItems extends Component {
<div> <div>
<FormInputHelpText <FormInputHelpText
text='Radarr scores each release using the sum of scores for matching custom formats. If a new release would improve the score, at the same or better quality, then Radarr will grab it.' text={translate('CustomFormatHelpText')}
/> />
{ {
@ -114,10 +114,10 @@ class QualityProfileFormatItems extends Component {
<div className={styles.formats}> <div className={styles.formats}>
<div className={styles.headerContainer}> <div className={styles.headerContainer}>
<div className={styles.headerTitle}> <div className={styles.headerTitle}>
Custom Format {translate('CustomFormat')}
</div> </div>
<div className={styles.headerScore}> <div className={styles.headerScore}>
Score {translate('Score')}
</div> </div>
</div> </div>
{ {

View File

@ -7,6 +7,7 @@ import Icon from 'Components/Icon';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import Measure from 'Components/Measure'; import Measure from 'Components/Measure';
import { icons, kinds, sizes } from 'Helpers/Props'; import { icons, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import QualityProfileItemDragPreview from './QualityProfileItemDragPreview'; import QualityProfileItemDragPreview from './QualityProfileItemDragPreview';
import QualityProfileItemDragSource from './QualityProfileItemDragSource'; import QualityProfileItemDragSource from './QualityProfileItemDragSource';
import styles from './QualityProfileItems.css'; import styles from './QualityProfileItems.css';
@ -69,12 +70,12 @@ class QualityProfileItems extends Component {
return ( return (
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Qualities {translate('Qualities')}
</FormLabel> </FormLabel>
<div> <div>
<FormInputHelpText <FormInputHelpText
text="Qualities higher in the list are more preferred. Qualities within the same group are equal. Only checked qualities are wanted" text={translate('QualitiesHelpText')}
/> />
{ {
@ -115,7 +116,7 @@ class QualityProfileItems extends Component {
/> />
{ {
editGroups ? 'Done Editing Groups' : 'Edit Groups' editGroups ? translate('DoneEditingGroups') : translate('EditGroups')
} }
</div> </div>
</Button> </Button>

View File

@ -152,10 +152,10 @@ class QualityDefinition extends Component {
const minSixty = `${formatBytes(minBytes * 60)}/h`; const minSixty = `${formatBytes(minBytes * 60)}/h`;
const preferredBytes = preferredSize * 1024 * 1024; const preferredBytes = preferredSize * 1024 * 1024;
const preferredSixty = preferredBytes ? `${formatBytes(preferredBytes * 60)}/h` : 'Unlimited'; const preferredSixty = preferredBytes ? `${formatBytes(preferredBytes * 60)}/h` : translate('Unlimited');
const maxBytes = maxSize && maxSize * 1024 * 1024; const maxBytes = maxSize && maxSize * 1024 * 1024;
const maxSixty = maxBytes ? `${formatBytes(maxBytes * 60)}/h` : 'Unlimited'; const maxSixty = maxBytes ? `${formatBytes(maxBytes * 60)}/h` : translate('Unlimited');
return ( return (
<div className={styles.qualityDefinition}> <div className={styles.qualityDefinition}>
@ -243,7 +243,7 @@ class QualityDefinition extends Component {
advancedSettings && advancedSettings &&
<div className={styles.megabytesPerMinute}> <div className={styles.megabytesPerMinute}>
<div> <div>
Min {translate('Min')}
<NumberInput <NumberInput
className={styles.sizeInput} className={styles.sizeInput}
@ -258,7 +258,7 @@ class QualityDefinition extends Component {
</div> </div>
<div> <div>
Preferred {translate('Preferred')}
<NumberInput <NumberInput
className={styles.sizeInput} className={styles.sizeInput}
@ -273,7 +273,7 @@ class QualityDefinition extends Component {
</div> </div>
<div> <div>
Max {translate('Max')}
<NumberInput <NumberInput
className={styles.sizeInput} className={styles.sizeInput}

View File

@ -32,7 +32,7 @@ class QualityDefinitions extends Component {
{ {
advancedSettings ? advancedSettings ?
<div className={styles.megabytesPerMinute}> <div className={styles.megabytesPerMinute}>
Megabytes Per Minute {translate('MegabytesPerMinute')}
</div> : </div> :
null null
} }
@ -54,7 +54,7 @@ class QualityDefinitions extends Component {
<div className={styles.sizeLimitHelpTextContainer}> <div className={styles.sizeLimitHelpTextContainer}>
<div className={styles.sizeLimitHelpText}> <div className={styles.sizeLimitHelpText}>
Limits are automatically adjusted for the movie runtime. {translate('QualityLimitsHelpText')}
</div> </div>
</div> </div>
</PageSectionContent> </PageSectionContent>

View File

@ -1,6 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import titleCase from 'Utilities/String/titleCase'; import titleCase from 'Utilities/String/titleCase';
import translate from '../../../Utilities/String/translate';
function TagDetailsDelayProfile(props) { function TagDetailsDelayProfile(props) {
const { const {
@ -20,16 +21,16 @@ function TagDetailsDelayProfile(props) {
<div> <div>
{ {
enableUsenet ? enableUsenet ?
`Usenet Delay: ${usenetDelay}` : translate('UsenetDelayTime', [usenetDelay]) :
'Usenet disabled' translate('UsenetDisabled')
} }
</div> </div>
<div> <div>
{ {
enableTorrent ? enableTorrent ?
`Torrent Delay: ${torrentDelay}` : translate('TorrentDelayTime', [torrentDelay]) :
'Torrents disabled' translate('TorrentsDisabled')
} }
</div> </div>
</div> </div>

View File

@ -29,7 +29,7 @@ function TagDetailsModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Tag Details - {label} {translate('TagDetails', [label])}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -126,7 +126,7 @@ class Tag extends Component {
{ {
!isTagUsed && !isTagUsed &&
<div> <div>
No links {translate('NoLinks')}
</div> </div>
} }

View File

@ -13,8 +13,8 @@ import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
export const firstDayOfWeekOptions = [ export const firstDayOfWeekOptions = [
{ key: 0, value: 'Sunday' }, { key: 0, value: translate('Sunday') },
{ key: 1, value: 'Monday' } { key: 1, value: translate('Monday') }
]; ];
export const weekColumnOptions = [ export const weekColumnOptions = [

View File

@ -14,7 +14,7 @@ import styles from './RestoreBackupModalContent.css';
function getErrorMessage(error) { function getErrorMessage(error) {
if (!error || !error.responseJSON || !error.responseJSON.message) { if (!error || !error.responseJSON || !error.responseJSON.message) {
return 'Error restoring backup'; return translate('ErrorRestoringBackup');
} }
return error.responseJSON.message; return error.responseJSON.message;
@ -146,7 +146,7 @@ class RestoreBackupModalContent extends Component {
<ModalBody> <ModalBody>
{ {
!!id && `Would you like to restore the backup '${name}'?` !!id && translate('WouldYouLikeToRestoreBackup', [name])
} }
{ {
@ -203,7 +203,7 @@ class RestoreBackupModalContent extends Component {
<ModalFooter> <ModalFooter>
<div className={styles.additionalInfo}> <div className={styles.additionalInfo}>
Note: Radarr will automatically restart and reload the UI during the restore process. {translate('RestartReloadNote')}
</div> </div>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
@ -216,7 +216,7 @@ class RestoreBackupModalContent extends Component {
isSpinning={isRestoring} isSpinning={isRestoring}
onPress={this.onRestorePress} onPress={this.onRestorePress}
> >
Restore {translate('Restore')}
</SpinnerButton> </SpinnerButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

View File

@ -83,7 +83,7 @@ function LogsTable(props) {
{ {
isPopulated && !error && !items.length && isPopulated && !error && !items.length &&
<div> <div>
No events found {translate('NoEventsFound')}
</div> </div>
} }

View File

@ -28,7 +28,7 @@ function LogsTableDetailsModal(props) {
onModalClose={onModalClose} onModalClose={onModalClose}
> >
<ModalHeader> <ModalHeader>
Details {translate('Details')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

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