Translate frontend/AddSeries
This commit is contained in:
parent
f6c05d4456
commit
02b0710814
|
@ -9,6 +9,7 @@ import PageContent from 'Components/Page/PageContent';
|
|||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import getErrorMessage from 'Utilities/Object/getErrorMessage';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import AddNewSeriesSearchResultConnector from './AddNewSeriesSearchResultConnector';
|
||||
import styles from './AddNewSeries.css';
|
||||
|
||||
|
@ -87,7 +88,7 @@ class AddNewSeries extends Component {
|
|||
const isFetching = this.state.isFetching;
|
||||
|
||||
return (
|
||||
<PageContent title="Add New Series">
|
||||
<PageContent title={translate('AddNewSeries')}>
|
||||
<PageContentBody>
|
||||
<div className={styles.searchContainer}>
|
||||
<div className={styles.searchIconContainer}>
|
||||
|
@ -126,7 +127,7 @@ class AddNewSeries extends Component {
|
|||
!isFetching && !!error ?
|
||||
<div className={styles.message}>
|
||||
<div className={styles.helpText}>
|
||||
Failed to load search results, please try again.
|
||||
{translate('AddNewSeriesError')}
|
||||
</div>
|
||||
<div>{getErrorMessage(error)}</div>
|
||||
</div> : null
|
||||
|
@ -151,11 +152,11 @@ class AddNewSeries extends Component {
|
|||
{
|
||||
!isFetching && !error && !items.length && !!term &&
|
||||
<div className={styles.message}>
|
||||
<div className={styles.noResults}>Couldn't find any results for '{term}'</div>
|
||||
<div>You can also search using TVDB ID of a show. eg. tvdb:71663</div>
|
||||
<div className={styles.noResults}>{translate('CouldNotFindResults', { term })}</div>
|
||||
<div>{translate('SearchByTvdbId')}</div>
|
||||
<div>
|
||||
<Link to="https://wiki.servarr.com/sonarr/faq#why-cant-i-add-a-new-series-when-i-know-the-tvdb-id">
|
||||
Why can't I find my show?
|
||||
{translate('WhyCantIFindMyShow')}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -166,9 +167,9 @@ class AddNewSeries extends Component {
|
|||
null :
|
||||
<div className={styles.message}>
|
||||
<div className={styles.helpText}>
|
||||
It's easy to add a new series, just start typing the name the series you want to add.
|
||||
{translate('AddNewSeriesHelpText')}
|
||||
</div>
|
||||
<div>You can also search using TVDB ID of a show. eg. tvdb:71663</div>
|
||||
<div>{translate('SearchByTvdbId')}</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
@ -176,14 +177,14 @@ class AddNewSeries extends Component {
|
|||
!term && !hasExistingSeries ?
|
||||
<div className={styles.message}>
|
||||
<div className={styles.noSeriesText}>
|
||||
You haven't added any series yet, do you want to import some or all of your series first?
|
||||
{translate('NoSeriesHaveBeenAdded')}
|
||||
</div>
|
||||
<div>
|
||||
<Button
|
||||
to="/add/import"
|
||||
kind={kinds.PRIMARY}
|
||||
>
|
||||
Import Existing Series
|
||||
{translate('ImportExistingSeries')}
|
||||
</Button>
|
||||
</div>
|
||||
</div> :
|
||||
|
|
|
@ -120,7 +120,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
|
||||
<Form {...otherProps}>
|
||||
<FormGroup>
|
||||
<FormLabel>Root Folder</FormLabel>
|
||||
<FormLabel>{translate('RootFolder')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.ROOT_FOLDER_SELECT}
|
||||
|
@ -133,7 +133,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
seriesFolder: folder,
|
||||
isWindows
|
||||
}}
|
||||
helpText={`'${folder}' subfolder will be created automatically`}
|
||||
helpText={translate('AddNewSeriesRootFolderHelpText', { folder })}
|
||||
onChange={onInputChange}
|
||||
{...rootFolderPath}
|
||||
/>
|
||||
|
@ -141,7 +141,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
Monitor
|
||||
{translate('Monitor')}
|
||||
|
||||
<Popover
|
||||
anchor={
|
||||
|
@ -150,7 +150,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
name={icons.INFO}
|
||||
/>
|
||||
}
|
||||
title="Monitoring Options"
|
||||
title={translate('MonitoringOptions')}
|
||||
body={<SeriesMonitoringOptionsPopoverContent />}
|
||||
position={tooltipPositions.RIGHT}
|
||||
/>
|
||||
|
@ -165,7 +165,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>Quality Profile</FormLabel>
|
||||
<FormLabel>{translate('QualityProfile')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.QUALITY_PROFILE_SELECT}
|
||||
|
@ -177,7 +177,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
Series Type
|
||||
{translate('SeriesType')}
|
||||
|
||||
<Popover
|
||||
anchor={
|
||||
|
@ -186,7 +186,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
name={icons.INFO}
|
||||
/>
|
||||
}
|
||||
title="Series Types"
|
||||
title={translate('SeriesTypes')}
|
||||
body={<SeriesTypePopoverContent />}
|
||||
position={tooltipPositions.RIGHT}
|
||||
/>
|
||||
|
@ -198,14 +198,12 @@ class AddNewSeriesModalContent extends Component {
|
|||
onChange={onInputChange}
|
||||
{...seriesType}
|
||||
value={this.state.seriesType}
|
||||
helpText={translate(
|
||||
'Series type is used for renaming, parsing and searching'
|
||||
)}
|
||||
helpText={translate('SeriesTypesHelpText')}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>Season Folder</FormLabel>
|
||||
<FormLabel>{translate('SeasonFolder')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
|
@ -216,7 +214,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>Tags</FormLabel>
|
||||
<FormLabel>{translate('Tags')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TAG}
|
||||
|
@ -234,7 +232,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
<div>
|
||||
<label className={styles.searchLabelContainer}>
|
||||
<span className={styles.searchLabel}>
|
||||
Start search for missing episodes
|
||||
{translate('AddNewSeriesSearchForMissingEpisodes')}
|
||||
</span>
|
||||
|
||||
<CheckInput
|
||||
|
@ -248,7 +246,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
|
||||
<label className={styles.searchLabelContainer}>
|
||||
<span className={styles.searchLabel}>
|
||||
Start search for cutoff unmet episodes
|
||||
{translate('AddNewSeriesSearchForCutoffUnmetEpisodes')}
|
||||
</span>
|
||||
|
||||
<CheckInput
|
||||
|
@ -267,7 +265,7 @@ class AddNewSeriesModalContent extends Component {
|
|||
isSpinning={isAdding}
|
||||
onPress={this.onAddSeriesPress}
|
||||
>
|
||||
Add {title}
|
||||
{translate('AddSeriesWithTitle', { title })}
|
||||
</SpinnerButton>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
|
|
|
@ -7,6 +7,7 @@ import Link from 'Components/Link/Link';
|
|||
import MetadataAttribution from 'Components/MetadataAttribution';
|
||||
import { icons, kinds, sizes } from 'Helpers/Props';
|
||||
import SeriesPoster from 'Series/SeriesPoster';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import AddNewSeriesModal from './AddNewSeriesModal';
|
||||
import styles from './AddNewSeriesSearchResult.css';
|
||||
|
||||
|
@ -72,10 +73,10 @@ class AddNewSeriesSearchResult extends Component {
|
|||
} = this.state;
|
||||
|
||||
const linkProps = isExistingSeries ? { to: `/series/${titleSlug}` } : { onPress: this.onPress };
|
||||
let seasons = '1 Season';
|
||||
let seasons = translate('OneSeason');
|
||||
|
||||
if (seasonCount > 1) {
|
||||
seasons = `${seasonCount} Seasons`;
|
||||
seasons = translate('CountSeasons', { count: seasonCount });
|
||||
}
|
||||
|
||||
return (
|
||||
|
@ -121,14 +122,14 @@ class AddNewSeriesSearchResult extends Component {
|
|||
className={styles.alreadyExistsIcon}
|
||||
name={icons.CHECK_CIRCLE}
|
||||
size={36}
|
||||
title="Already in your library"
|
||||
title={translate('AlreadyInYourLibrary')}
|
||||
/> :
|
||||
null
|
||||
}
|
||||
|
||||
<Link
|
||||
className={styles.tvdbLink}
|
||||
to={`http://www.thetvdb.com/?tab=series&id=${tvdbId}`}
|
||||
to={`https://www.thetvdb.com/?tab=series&id=${tvdbId}`}
|
||||
onPress={this.onTVDBLinkPress}
|
||||
>
|
||||
<Icon
|
||||
|
@ -170,7 +171,7 @@ class AddNewSeriesSearchResult extends Component {
|
|||
kind={kinds.DANGER}
|
||||
size={sizes.LARGE}
|
||||
>
|
||||
Ended
|
||||
{translate('Ended')}
|
||||
</Label> :
|
||||
null
|
||||
}
|
||||
|
@ -181,7 +182,7 @@ class AddNewSeriesSearchResult extends Component {
|
|||
kind={kinds.INFO}
|
||||
size={sizes.LARGE}
|
||||
>
|
||||
Upcoming
|
||||
{translate('Upcoming')}
|
||||
</Label> :
|
||||
null
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
|||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import { kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import selectAll from 'Utilities/Table/selectAll';
|
||||
import toggleSelected from 'Utilities/Table/toggleSelected';
|
||||
import ImportSeriesFooterConnector from './ImportSeriesFooterConnector';
|
||||
|
@ -97,7 +98,7 @@ class ImportSeries extends Component {
|
|||
} = this.state;
|
||||
|
||||
return (
|
||||
<PageContent title="Import Series">
|
||||
<PageContent title={translate('ImportSeries')}>
|
||||
<PageContentBody ref={this.scrollerRef} >
|
||||
{
|
||||
rootFoldersFetching ? <LoadingIndicator /> : null
|
||||
|
@ -106,7 +107,7 @@ class ImportSeries extends Component {
|
|||
{
|
||||
!rootFoldersFetching && !!rootFoldersError ?
|
||||
<Alert kind={kinds.DANGER}>
|
||||
Unable to load root folders
|
||||
{translate('RootFoldersLoadError')}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
@ -117,7 +118,7 @@ class ImportSeries extends Component {
|
|||
rootFoldersPopulated &&
|
||||
!unmappedFolders.length ?
|
||||
<Alert kind={kinds.INFO}>
|
||||
All series in {path} have been imported
|
||||
{translate('AllSeriesInRootFolderHaveBeenImported', { path })}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
|||
import PageContentFooter from 'Components/Page/PageContentFooter';
|
||||
import Popover from 'Components/Tooltip/Popover';
|
||||
import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './ImportSeriesFooter.css';
|
||||
|
||||
const MIXED = 'mixed';
|
||||
|
@ -124,7 +125,7 @@ class ImportSeriesFooter extends Component {
|
|||
<PageContentFooter>
|
||||
<div className={styles.inputContainer}>
|
||||
<div className={styles.label}>
|
||||
Monitor
|
||||
{translate('Monitor')}
|
||||
</div>
|
||||
|
||||
<FormInputGroup
|
||||
|
@ -139,7 +140,7 @@ class ImportSeriesFooter extends Component {
|
|||
|
||||
<div className={styles.inputContainer}>
|
||||
<div className={styles.label}>
|
||||
Quality Profile
|
||||
{translate('QualityProfile')}
|
||||
</div>
|
||||
|
||||
<FormInputGroup
|
||||
|
@ -154,7 +155,7 @@ class ImportSeriesFooter extends Component {
|
|||
|
||||
<div className={styles.inputContainer}>
|
||||
<div className={styles.label}>
|
||||
Series Type
|
||||
{translate('SeriesType')}
|
||||
</div>
|
||||
|
||||
<FormInputGroup
|
||||
|
@ -169,7 +170,7 @@ class ImportSeriesFooter extends Component {
|
|||
|
||||
<div className={styles.inputContainer}>
|
||||
<div className={styles.label}>
|
||||
Season Folder
|
||||
{translate('SeasonFolder')}
|
||||
</div>
|
||||
|
||||
<CheckInput
|
||||
|
@ -193,7 +194,7 @@ class ImportSeriesFooter extends Component {
|
|||
isDisabled={!selectedCount || isLookingUpSeries}
|
||||
onPress={onImportPress}
|
||||
>
|
||||
Import {selectedCount} Series
|
||||
{translate('ImportCountSeries', { selectedCount })}
|
||||
</SpinnerButton>
|
||||
|
||||
{
|
||||
|
@ -203,7 +204,7 @@ class ImportSeriesFooter extends Component {
|
|||
kind={kinds.WARNING}
|
||||
onPress={onCancelLookupPress}
|
||||
>
|
||||
Cancel Processing
|
||||
{translate('CancelProcessing')}
|
||||
</Button> :
|
||||
null
|
||||
}
|
||||
|
@ -215,7 +216,7 @@ class ImportSeriesFooter extends Component {
|
|||
kind={kinds.SUCCESS}
|
||||
onPress={onLookupPress}
|
||||
>
|
||||
Start Processing
|
||||
{translate('StartProcessing')}
|
||||
</Button> :
|
||||
null
|
||||
}
|
||||
|
@ -231,7 +232,7 @@ class ImportSeriesFooter extends Component {
|
|||
|
||||
{
|
||||
isLookingUpSeries ?
|
||||
'Processing Folders' :
|
||||
translate('ProcessingFolders') :
|
||||
null
|
||||
}
|
||||
|
||||
|
@ -245,7 +246,7 @@ class ImportSeriesFooter extends Component {
|
|||
kind={kinds.WARNING}
|
||||
/>
|
||||
}
|
||||
title="Import Errors"
|
||||
title={translate('ImportErrors')}
|
||||
body={
|
||||
<ul>
|
||||
{
|
||||
|
|
|
@ -8,6 +8,7 @@ import VirtualTableHeaderCell from 'Components/Table/VirtualTableHeaderCell';
|
|||
import VirtualTableSelectAllHeaderCell from 'Components/Table/VirtualTableSelectAllHeaderCell';
|
||||
import Popover from 'Components/Tooltip/Popover';
|
||||
import { icons, tooltipPositions } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './ImportSeriesHeader.css';
|
||||
|
||||
function ImportSeriesHeader(props) {
|
||||
|
@ -29,14 +30,14 @@ function ImportSeriesHeader(props) {
|
|||
className={styles.folder}
|
||||
name="folder"
|
||||
>
|
||||
Folder
|
||||
{translate('Folder')}
|
||||
</VirtualTableHeaderCell>
|
||||
|
||||
<VirtualTableHeaderCell
|
||||
className={styles.monitor}
|
||||
name="monitor"
|
||||
>
|
||||
Monitor
|
||||
{translate('Monitor')}
|
||||
|
||||
<Popover
|
||||
anchor={
|
||||
|
@ -45,7 +46,7 @@ function ImportSeriesHeader(props) {
|
|||
name={icons.INFO}
|
||||
/>
|
||||
}
|
||||
title="Monitoring Options"
|
||||
title={translate('MonitoringOptions')}
|
||||
body={<SeriesMonitoringOptionsPopoverContent />}
|
||||
position={tooltipPositions.RIGHT}
|
||||
/>
|
||||
|
@ -55,14 +56,14 @@ function ImportSeriesHeader(props) {
|
|||
className={styles.qualityProfile}
|
||||
name="qualityProfileId"
|
||||
>
|
||||
Quality Profile
|
||||
{translate('QualityProfile')}
|
||||
</VirtualTableHeaderCell>
|
||||
|
||||
<VirtualTableHeaderCell
|
||||
className={styles.seriesType}
|
||||
name="seriesType"
|
||||
>
|
||||
Series Type
|
||||
{translate('SeriesType')}
|
||||
|
||||
<Popover
|
||||
anchor={
|
||||
|
@ -71,7 +72,7 @@ function ImportSeriesHeader(props) {
|
|||
name={icons.INFO}
|
||||
/>
|
||||
}
|
||||
title="Series Type"
|
||||
title={translate('SeriesType')}
|
||||
body={<SeriesTypePopoverContent />}
|
||||
position={tooltipPositions.RIGHT}
|
||||
/>
|
||||
|
@ -81,14 +82,14 @@ function ImportSeriesHeader(props) {
|
|||
className={styles.seasonFolder}
|
||||
name="seasonFolder"
|
||||
>
|
||||
Season Folder
|
||||
{translate('SeasonFolder')}
|
||||
</VirtualTableHeaderCell>
|
||||
|
||||
<VirtualTableHeaderCell
|
||||
className={styles.series}
|
||||
name="series"
|
||||
>
|
||||
Series
|
||||
{translate('Series')}
|
||||
</VirtualTableHeaderCell>
|
||||
</VirtualTableHeader>
|
||||
);
|
||||
|
|
|
@ -34,7 +34,7 @@ function ImportSeriesSearchResult(props) {
|
|||
|
||||
<Link
|
||||
className={styles.tvdbLink}
|
||||
to={`http://www.thetvdb.com/?tab=series&id=${tvdbId}`}
|
||||
to={`https://www.thetvdb.com/?tab=series&id=${tvdbId}`}
|
||||
>
|
||||
<Icon
|
||||
className={styles.tvdbLinkIcon}
|
||||
|
|
|
@ -8,7 +8,8 @@ import Link from 'Components/Link/Link';
|
|||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import Portal from 'Components/Portal';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import getUniqueElememtId from 'Utilities/getUniqueElementId';
|
||||
import getUniqueElementId from 'Utilities/getUniqueElementId';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import ImportSeriesSearchResultConnector from './ImportSeriesSearchResultConnector';
|
||||
import ImportSeriesTitle from './ImportSeriesTitle';
|
||||
import styles from './ImportSeriesSelectSeries.css';
|
||||
|
@ -23,8 +24,8 @@ class ImportSeriesSelectSeries extends Component {
|
|||
|
||||
this._seriesLookupTimeout = null;
|
||||
this._scheduleUpdate = null;
|
||||
this._buttonId = getUniqueElememtId();
|
||||
this._contentId = getUniqueElememtId();
|
||||
this._buttonId = getUniqueElementId();
|
||||
this._contentId = getUniqueElementId();
|
||||
|
||||
this.state = {
|
||||
term: props.id,
|
||||
|
@ -174,7 +175,7 @@ class ImportSeriesSelectSeries extends Component {
|
|||
kind={kinds.WARNING}
|
||||
/>
|
||||
|
||||
No match found!
|
||||
{translate('NoMatchFound')}
|
||||
</div> :
|
||||
null
|
||||
}
|
||||
|
@ -189,7 +190,7 @@ class ImportSeriesSelectSeries extends Component {
|
|||
kind={kinds.WARNING}
|
||||
/>
|
||||
|
||||
Search failed, please try again later.
|
||||
{translate('SearchFailedError')}
|
||||
</div> :
|
||||
null
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
|
|||
import React from 'react';
|
||||
import Label from 'Components/Label';
|
||||
import { kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './ImportSeriesTitle.css';
|
||||
|
||||
function ImportSeriesTitle(props) {
|
||||
|
@ -38,7 +39,7 @@ function ImportSeriesTitle(props) {
|
|||
<Label
|
||||
kind={kinds.WARNING}
|
||||
>
|
||||
Existing
|
||||
{translate('Existing')}
|
||||
</Label> :
|
||||
null
|
||||
}
|
||||
|
|
|
@ -6,10 +6,12 @@ import FileBrowserModal from 'Components/FileBrowser/FileBrowserModal';
|
|||
import Icon from 'Components/Icon';
|
||||
import Button from 'Components/Link/Button';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import { icons, kinds, sizes } from 'Helpers/Props';
|
||||
import RootFolders from 'RootFolder/RootFolders';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './ImportSeriesSelectFolder.css';
|
||||
|
||||
class ImportSeriesSelectFolder extends Component {
|
||||
|
@ -55,9 +57,11 @@ class ImportSeriesSelectFolder extends Component {
|
|||
} = this.props;
|
||||
|
||||
const hasRootFolders = items.length > 0;
|
||||
const goodFolderExample = (isWindows) ? 'C:\\tv shows' : '/tv shows';
|
||||
const badFolderExample = (isWindows) ? 'C:\\tv shows\\the simpsons' : '/tv shows/the simpsons';
|
||||
|
||||
return (
|
||||
<PageContent title="Import Series">
|
||||
<PageContent title={translate('ImportSeries')}>
|
||||
<PageContentBody>
|
||||
{
|
||||
isFetching && !isPopulated ?
|
||||
|
@ -67,7 +71,7 @@ class ImportSeriesSelectFolder extends Component {
|
|||
|
||||
{
|
||||
!isFetching && error ?
|
||||
<Alert kind={kinds.DANGER}>Unable to load root folders</Alert> :
|
||||
<Alert kind={kinds.DANGER}>{translate('RootFoldersLoadError')}</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
|
@ -75,20 +79,20 @@ class ImportSeriesSelectFolder extends Component {
|
|||
!error && isPopulated &&
|
||||
<div>
|
||||
<div className={styles.header}>
|
||||
Import series you already have
|
||||
{translate('LibraryImportHeader')}
|
||||
</div>
|
||||
|
||||
<div className={styles.tips}>
|
||||
Some tips to ensure the import goes smoothly:
|
||||
{translate('LibraryImportTips')}
|
||||
<ul>
|
||||
<li className={styles.tip}>
|
||||
Make sure that your files include the quality in their filenames. eg. <span className={styles.code}>episode.s02e15.bluray.mkv</span>
|
||||
<InlineMarkdown data={translate('LibraryImportTipsQualityInFilename')} />
|
||||
</li>
|
||||
<li className={styles.tip}>
|
||||
Point Sonarr to the folder containing all of your tv shows, not a specific one. eg. <span className={styles.code}>"{isWindows ? 'C:\\tv shows' : '/tv shows'}"</span> and not <span className={styles.code}>"{isWindows ? 'C:\\tv shows\\the simpsons' : '/tv shows/the simpsons'}"</span> Additionally, each series must be in its own folder within the root/library folder.
|
||||
<InlineMarkdown data={translate('LibraryImportTipsUseRootFolder', { goodFolderExample, badFolderExample })} />
|
||||
</li>
|
||||
<li className={styles.tip}>
|
||||
Do not use for importing downloads from your download client, this is only for existing organized libraries, not unsorted files.
|
||||
{translate('LibraryImportTipsDontUseDownloadsFolder')}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -96,7 +100,7 @@ class ImportSeriesSelectFolder extends Component {
|
|||
{
|
||||
hasRootFolders ?
|
||||
<div className={styles.recentFolders}>
|
||||
<FieldSet legend="Root Folders">
|
||||
<FieldSet legend={translate('RootFolders')}>
|
||||
<RootFolders
|
||||
isFetching={isFetching}
|
||||
isPopulated={isPopulated}
|
||||
|
@ -114,7 +118,7 @@ class ImportSeriesSelectFolder extends Component {
|
|||
className={styles.addErrorAlert}
|
||||
kind={kinds.DANGER}
|
||||
>
|
||||
Unable to add root folder
|
||||
{translate('RootFolderLoadError')}
|
||||
|
||||
<ul>
|
||||
{
|
||||
|
@ -149,8 +153,8 @@ class ImportSeriesSelectFolder extends Component {
|
|||
/>
|
||||
{
|
||||
hasRootFolders ?
|
||||
'Choose another folder' :
|
||||
'Start Import'
|
||||
translate('ChooseAnotherFolder') :
|
||||
translate('StartImport')
|
||||
}
|
||||
</Button>
|
||||
</div>
|
||||
|
|
|
@ -1,53 +1,54 @@
|
|||
import React from 'react';
|
||||
import DescriptionList from 'Components/DescriptionList/DescriptionList';
|
||||
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
function SeriesMonitoringOptionsPopoverContent() {
|
||||
return (
|
||||
<DescriptionList>
|
||||
<DescriptionListItem
|
||||
title="All Episodes"
|
||||
data="Monitor all episodes except specials"
|
||||
title={translate('MonitorAllEpisodes')}
|
||||
data={translate('MonitorAllEpisodesDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Future Episodes"
|
||||
data="Monitor episodes that have not aired yet"
|
||||
title={translate('MonitorFutureEpisodes')}
|
||||
data={translate('MonitorFutureEpisodesDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Missing Episodes"
|
||||
data="Monitor episodes that do not have files or have not aired yet"
|
||||
title={translate('MonitorMissingEpisodes')}
|
||||
data={translate('MonitorMissingEpisodesDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Existing Episodes"
|
||||
data="Monitor episodes that have files or have not aired yet"
|
||||
title={translate('MonitorExistingEpisodes')}
|
||||
data={translate('MonitorExistingEpisodesDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="First Season"
|
||||
data="Monitor all episodes of the first season. All other seasons will be ignored"
|
||||
title={translate('MonitorFirstSeason')}
|
||||
data={translate('MonitorFirstSeasonDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Latest Season"
|
||||
data="Monitor all episodes of the latest season and future seasons"
|
||||
title={translate('MonitorLatestSeason')}
|
||||
data={translate('MonitorLatestSeasonDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Monitor Specials"
|
||||
data="Monitor all special episodes without changing the monitored status of other episodes"
|
||||
title={translate('MonitorSpecials')}
|
||||
data={translate('MonitorSpecialsDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Unmonitor Specials"
|
||||
data="Unmonitor all special episodes without changing the monitored status of other episodes"
|
||||
title={translate('UnmonitorSpecials')}
|
||||
data={translate('UnmonitorSpecialsDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="None"
|
||||
data="No episodes will be monitored"
|
||||
title={translate('MonitorNone')}
|
||||
data={translate('MonitorNoneDescription')}
|
||||
/>
|
||||
</DescriptionList>
|
||||
);
|
||||
|
|
|
@ -1,23 +1,24 @@
|
|||
import React from 'react';
|
||||
import DescriptionList from 'Components/DescriptionList/DescriptionList';
|
||||
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
function SeriesTypePopoverContent() {
|
||||
return (
|
||||
<DescriptionList>
|
||||
<DescriptionListItem
|
||||
title="Anime"
|
||||
data="Episodes released using an absolute episode number"
|
||||
title={translate('Anime')}
|
||||
data={translate('AnimeTypeDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Daily"
|
||||
data="Episodes released daily or less frequently that use year-month-day (2017-05-25)"
|
||||
title={translate('Daily')}
|
||||
data={translate('DailyTypeDescription')}
|
||||
/>
|
||||
|
||||
<DescriptionListItem
|
||||
title="Standard"
|
||||
data="Episodes released with SxxEyy pattern"
|
||||
title={translate('Standard')}
|
||||
data={translate('StandardTypeDescription')}
|
||||
/>
|
||||
</DescriptionList>
|
||||
);
|
||||
|
|
|
@ -26,6 +26,12 @@
|
|||
"AddListExclusionError": "Unable to add a new list exclusion, please try again.",
|
||||
"AddNew": "Add New",
|
||||
"AddNewRestriction": "Add new restriction",
|
||||
"AddNewSeries": "Add New Series",
|
||||
"AddNewSeriesError": "Failed to load search results, please try again.",
|
||||
"AddNewSeriesHelpText": "It's easy to add a new series, just start typing the name the series you want to add.",
|
||||
"AddNewSeriesRootFolderHelpText": "'{folder}' subfolder will be created automatically",
|
||||
"AddNewSeriesSearchForCutoffUnmetEpisodes": "Start search for cutoff unmet episodes",
|
||||
"AddNewSeriesSearchForMissingEpisodes": "Start search for missing episodes",
|
||||
"AddNotification": "Add Notification",
|
||||
"AddNotificationError": "Unable to add a new notification, please try again.",
|
||||
"AddQualityProfile": "Add Quality Profile",
|
||||
|
@ -34,6 +40,7 @@
|
|||
"AddRemotePathMapping": "Add Remote Path Mapping",
|
||||
"AddRemotePathMappingError": "Unable to add a new remote path mapping, please try again.",
|
||||
"AddRootFolder": "Add Root Folder",
|
||||
"AddSeriesWithTitle": "Add {title}",
|
||||
"Added": "Added",
|
||||
"AddingTag": "Adding tag",
|
||||
"AfterManualRefresh": "After Manual Refresh",
|
||||
|
@ -41,13 +48,17 @@
|
|||
"AirDate": "Air Date",
|
||||
"All": "All",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "All results are hidden by the applied filter",
|
||||
"AllSeriesInRootFolderHaveBeenImported": "All series in {path} have been imported",
|
||||
"AllTitles": "All Titles",
|
||||
"AlreadyInYourLibrary": "Already in your library",
|
||||
"Always": "Always",
|
||||
"AnalyseVideoFiles": "Analyse video files",
|
||||
"AnalyseVideoFilesHelpText": "Extract video information such as resolution, runtime and codec information from files. This requires Sonarr to read parts of the file which may cause high disk or network activity during scans.",
|
||||
"Analytics": "Analytics",
|
||||
"AnalyticsEnabledHelpText": "Send anonymous usage and error information to Sonarr's servers. This includes information on your browser, which Sonarr WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes.",
|
||||
"Anime": "Anime",
|
||||
"AnimeEpisodeFormat": "Anime Episode Format",
|
||||
"AnimeTypeDescription": "Episodes released using an absolute episode number",
|
||||
"ApiKey": "API Key",
|
||||
"ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file",
|
||||
"AppDataDirectory": "AppData directory",
|
||||
|
@ -114,6 +125,7 @@
|
|||
"CalendarLoadError": "Unable to load the calendar",
|
||||
"Cancel": "Cancel",
|
||||
"CancelPendingTask": "Are you sure you want to cancel this pending task?",
|
||||
"CancelProcessing": "Cancel Processing",
|
||||
"CertificateValidation": "Certificate Validation",
|
||||
"CertificateValidationHelpText": "Change how strict HTTPS certification validation is. Do not change unless you understand the risks.",
|
||||
"Certification": "Certification",
|
||||
|
@ -122,6 +134,7 @@
|
|||
"ChmodFolder": "chmod Folder",
|
||||
"ChmodFolderHelpText": "Octal, applied during import/rename to media folders and files (without execute bits)",
|
||||
"ChmodFolderHelpTextWarning": "This only works if the user running sonarr is the owner of the file. It's better to ensure the download client sets the permissions properly.",
|
||||
"ChooseAnotherFolder": "Choose another folder",
|
||||
"ChownGroup": "chown Group",
|
||||
"ChownGroupHelpText": "Group name or gid. Use gid for remote file systems.",
|
||||
"ChownGroupHelpTextWarning": "This only works if the user running sonarr is the owner of the file. It's better to ensure the download client uses the same group as sonarr.",
|
||||
|
@ -150,10 +163,11 @@
|
|||
"CopyToClipboard": "Copy to Clipboard",
|
||||
"CopyUsingHardlinksHelpText": "Hardlinks allow Sonarr to import seeding torrents to the series folder without taking extra disk space or copying the entire contents of the file. Hardlinks will only work if the source and destination are on the same volume",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Sonarr's rename function as a work around.",
|
||||
"CouldNotFindResults": "Couldn't find any results for '{term}'",
|
||||
"CountDownloadClientsSelected": "{count} download client(s) selected",
|
||||
"CountImportListsSelected": "{count} import list(s) selected",
|
||||
"CountIndexersSelected": "{count} indexer(s) selected",
|
||||
"CountSeasons": "{count} seasons",
|
||||
"CountSeasons": "{count} Seasons",
|
||||
"CreateEmptySeriesFolders": "Create Empty Series Folders",
|
||||
"CreateEmptySeriesFoldersHelpText": "Create missing series folders during disk scan",
|
||||
"CreateGroup": "Create Group",
|
||||
|
@ -172,6 +186,7 @@
|
|||
"CutoffUnmet": "Cutoff Unmet",
|
||||
"Daily": "Daily",
|
||||
"DailyEpisodeFormat": "Daily Episode Format",
|
||||
"DailyTypeDescription": "Episodes released daily or less frequently that use year-month-day (2023-08-04)",
|
||||
"Dash": "Dash",
|
||||
"Date": "Date",
|
||||
"Dates": "Dates",
|
||||
|
@ -320,6 +335,7 @@
|
|||
"Events": "Events",
|
||||
"Example": "Example",
|
||||
"Exception": "Exception",
|
||||
"Existing": "Existing",
|
||||
"ExistingTag": "Existing tag",
|
||||
"ExportCustomFormat": "Export Custom Format",
|
||||
"Extend": "Extend",
|
||||
|
@ -370,7 +386,10 @@
|
|||
"Images": "Images",
|
||||
"Implementation": "Implementation",
|
||||
"Import": "Import",
|
||||
"ImportCountSeries": "Import {selectedCount} Series",
|
||||
"ImportCustomFormat": "Import Custom Format",
|
||||
"ImportErrors": "Import Errors",
|
||||
"ImportExistingSeries": "Import Existing Series",
|
||||
"ImportExtraFiles": "Import Extra Files",
|
||||
"ImportExtraFilesHelpText": "Import matching extra files (subtitles, nfo, etc) after importing an episode file",
|
||||
"ImportList": "Import List",
|
||||
|
@ -389,6 +408,7 @@
|
|||
"ImportMechanismHandlingDisabledHealthCheckMessage": "Enable Completed Download Handling",
|
||||
"ImportScriptPath": "Import Script Path",
|
||||
"ImportScriptPathHelpText": "The path to the script to use for importing",
|
||||
"ImportSeries": "Import Series",
|
||||
"ImportUsingScript": "Import Using Script",
|
||||
"ImportUsingScriptHelpText": "Copy files for importing using a script (ex. for transcoding)",
|
||||
"Imported": "Imported",
|
||||
|
@ -436,6 +456,11 @@
|
|||
"LatestSeason": "Latest Season",
|
||||
"LiberaWebchat": "Libera Webchat",
|
||||
"LibraryImport": "Library Import",
|
||||
"LibraryImportHeader": "Import series you already have",
|
||||
"LibraryImportTips": "Some tips to ensure the import goes smoothly:",
|
||||
"LibraryImportTipsDontUseDownloadsFolder": "Do not use for importing downloads from your download client, this is only for existing organized libraries, not unsorted files.",
|
||||
"LibraryImportTipsQualityInFilename": "Make sure that your files include the quality in their filenames. eg. `episode.s02e15.bluray.mkv`",
|
||||
"LibraryImportTipsUseRootFolder": "Point Sonarr to the folder containing all of your tv shows, not a specific one. eg. \"`{goodFolderExample}`\" and not \"`{badFolderExample}`\". Additionally, each series must be in its own folder within the root/library folder.",
|
||||
"ListExclusionsLoadError": "Unable to load List Exclusions",
|
||||
"ListOptionsLoadError": "Unable to load list options",
|
||||
"ListQualityProfileHelpText": "Quality Profile list items will be added with",
|
||||
|
@ -502,6 +527,23 @@
|
|||
"MissingEpisodes": "Missing Episodes",
|
||||
"Mode": "Mode",
|
||||
"Monday": "Monday",
|
||||
"Monitor": "Monitor",
|
||||
"MonitorAllEpisodes": "All Episodes",
|
||||
"MonitorAllEpisodesDescription": "Monitor all episodes except specials",
|
||||
"MonitorExistingEpisodes": "Existing Episodes",
|
||||
"MonitorExistingEpisodesDescription": "Monitor episodes that have files or have not aired yet",
|
||||
"MonitorFirstSeason": "First Season",
|
||||
"MonitorFirstSeasonDescription": "Monitor all episodes of the first season. All other seasons will be ignored",
|
||||
"MonitorFutureEpisodes": "Future Episodes",
|
||||
"MonitorFutureEpisodesDescription": "Monitor episodes that have not aired yet",
|
||||
"MonitorLatestSeason": "Latest Season",
|
||||
"MonitorLatestSeasonDescription": "Monitor all episodes of the latest season that aired within the last 90 days and all future seasons",
|
||||
"MonitorMissingEpisodes": "Missing Episodes",
|
||||
"MonitorMissingEpisodesDescription": "Monitor episodes that do not have files or have not aired yet",
|
||||
"MonitorNone": "None",
|
||||
"MonitorNoneDescription": "No episodes will be monitored",
|
||||
"MonitorSpecials": "Monitor Specials",
|
||||
"MonitorSpecialsDescription": "Monitor all special episodes without changing the monitored status of other episodes",
|
||||
"Monitored": "Monitored",
|
||||
"MonitoredOnly": "Monitored Only",
|
||||
"MonitoringOptions": "Monitoring Options",
|
||||
|
@ -542,9 +584,11 @@
|
|||
"NoLimitForAnyRuntime": "No limit for any runtime",
|
||||
"NoLinks": "No links",
|
||||
"NoLogFiles": "No log files",
|
||||
"NoMatchFound": "No match found!",
|
||||
"NoMinimumForAnyRuntime": "No minimum for any runtime",
|
||||
"NoResultsFound": "No results found",
|
||||
"NoSeasons": "No seasons",
|
||||
"NoSeriesHaveBeenAdded": "You haven't added any series yet, do you want to import some or all of your series first?",
|
||||
"NoTagsHaveBeenAddedYet": "No tags have been added yet",
|
||||
"NoUpdatesAreAvailable": "No updates are available",
|
||||
"None": "None",
|
||||
|
@ -567,7 +611,7 @@
|
|||
"OnSeriesDelete": "On Series Delete",
|
||||
"OnUpgrade": "On Upgrade",
|
||||
"OneMinute": "1 Minute",
|
||||
"OneSeason": "1 season",
|
||||
"OneSeason": "1 Season",
|
||||
"OnlyForBulkSeasonReleases": "Only for Bulk Season Releases",
|
||||
"OnlyTorrent": "Only Torrent",
|
||||
"OnlyUsenet": "Only Usenet",
|
||||
|
@ -605,6 +649,7 @@
|
|||
"Priority": "Priority",
|
||||
"PriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.",
|
||||
"PrioritySettings": "Priority: {priority}",
|
||||
"ProcessingFolders": "Processing Folders",
|
||||
"Profiles": "Profiles",
|
||||
"ProfilesSettingsSummary": "Quality, Language Delay and Release profiles",
|
||||
"Progress": "Progress",
|
||||
|
@ -767,6 +812,8 @@
|
|||
"Score": "Score",
|
||||
"Script": "Script",
|
||||
"ScriptPath": "Script Path",
|
||||
"SearchByTvdbId": "You can also search using TVDB ID of a show. eg. tvdb:71663",
|
||||
"SearchFailedError": "Search failed, please try again later.",
|
||||
"SearchForMonitoredEpisodes": "Search for monitored episodes",
|
||||
"SearchIsNotSupportedWithThisIndexer": "Search is not supported with this indexer",
|
||||
"Season": "Season",
|
||||
|
@ -791,6 +838,7 @@
|
|||
"SeriesTitleToExcludeHelpText": "The name of the series to exclude",
|
||||
"SeriesType": "Series Type",
|
||||
"SeriesTypes": "Series Types",
|
||||
"SeriesTypesHelpText": "Series type is used for renaming, parsing and searching",
|
||||
"SetPermissions": "Set Permissions",
|
||||
"SetPermissionsLinuxHelpText": "Should chmod be run when files are imported/renamed?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "If you're unsure what these settings do, do not alter them.",
|
||||
|
@ -826,7 +874,11 @@
|
|||
"SslCertPath": "SSL Cert Path",
|
||||
"SslCertPathHelpText": "Path to pfx file",
|
||||
"SslPort": "SSL Port",
|
||||
"Standard": "Standard",
|
||||
"StandardEpisodeFormat": "Standard Episode Format",
|
||||
"StandardTypeDescription": "Episodes released with SxxEyy pattern",
|
||||
"StartImport": "Start Import",
|
||||
"StartProcessing": "Start Processing",
|
||||
"Started": "Started",
|
||||
"StartupDirectory": "Startup directory",
|
||||
"Status": "Status",
|
||||
|
@ -894,9 +946,12 @@
|
|||
"UnmappedFolders": "Unmapped Folders",
|
||||
"UnmonitorDeletedEpisodes": "Unmonitor Deleted Episodes",
|
||||
"UnmonitorDeletedEpisodesHelpText": "Episodes deleted from disk are automatically unmonitored in Sonarr",
|
||||
"UnmonitorSpecials": "Unmonitor Specials",
|
||||
"UnmonitorSpecialsDescription": "Unmonitor all special episodes without changing the monitored status of other episodes",
|
||||
"Unmonitored": "Unmonitored",
|
||||
"UnmonitoredOnly": "Unmonitored Only",
|
||||
"UnsavedChanges": "Unsaved Changes",
|
||||
"Upcoming": "Upcoming",
|
||||
"UpdateAutomaticallyHelpText": "Automatically download and install updates. You will still be able to install from System: Updates",
|
||||
"UpdateAvailableHealthCheckMessage": "New update is available",
|
||||
"UpdateMechanismHelpText": "Use Sonarr's built-in updater or a script",
|
||||
|
@ -937,6 +992,7 @@
|
|||
"Warn": "Warn",
|
||||
"WeekColumnHeader": "Week Column Header",
|
||||
"WeekColumnHeaderHelpText": "Shown above each column when week is the active view",
|
||||
"WhyCantIFindMyShow": "Why can't I find my show?",
|
||||
"Wiki": "Wiki",
|
||||
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?",
|
||||
"Year": "Year",
|
||||
|
|
Loading…
Reference in New Issue