mirror of
https://github.com/Radarr/Radarr
synced 2025-12-07 08:54:57 +01:00
Convert Add Movie from collection to TypeScript
This commit is contained in:
parent
7e34d89069
commit
52a69b662d
45 changed files with 379 additions and 399 deletions
|
|
@ -79,9 +79,9 @@ class AddNewMovieModalContent extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
<div className={styles.info}>
|
<div className={styles.info}>
|
||||||
<div className={styles.overview}>
|
{overview ? (
|
||||||
{overview}
|
<div className={styles.overview}>{overview}</div>
|
||||||
</div>
|
) : null}
|
||||||
|
|
||||||
<Form>
|
<Form>
|
||||||
<FormGroup>
|
<FormGroup>
|
||||||
|
|
@ -98,7 +98,9 @@ class AddNewMovieModalContent extends Component {
|
||||||
movieFolder: folder,
|
movieFolder: folder,
|
||||||
isWindows
|
isWindows
|
||||||
}}
|
}}
|
||||||
helpText={translate('SubfolderWillBeCreatedAutomaticallyInterp', [folder])}
|
helpText={translate('AddNewMovieRootFolderHelpText', {
|
||||||
|
folder
|
||||||
|
})}
|
||||||
onChange={onInputChange}
|
onChange={onInputChange}
|
||||||
{...rootFolderPath}
|
{...rootFolderPath}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import AppSectionState, {
|
import AppSectionState, {
|
||||||
AppSectionFilterState,
|
AppSectionFilterState,
|
||||||
AppSectionSaveState,
|
AppSectionSaveState,
|
||||||
|
Error,
|
||||||
} from 'App/State/AppSectionState';
|
} from 'App/State/AppSectionState';
|
||||||
import MovieCollection from 'typings/MovieCollection';
|
import MovieCollection from 'typings/MovieCollection';
|
||||||
|
|
||||||
|
|
@ -10,6 +11,9 @@ interface MovieCollectionAppState
|
||||||
AppSectionSaveState {
|
AppSectionSaveState {
|
||||||
itemMap: Record<number, number>;
|
itemMap: Record<number, number>;
|
||||||
|
|
||||||
|
isAdding: boolean;
|
||||||
|
addError: Error;
|
||||||
|
|
||||||
pendingChanges: Partial<MovieCollection>;
|
pendingChanges: Partial<MovieCollection>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import React from 'react';
|
|
||||||
import Modal from 'Components/Modal/Modal';
|
|
||||||
import AddNewCollectionMovieModalContentConnector from './AddNewCollectionMovieModalContentConnector';
|
|
||||||
|
|
||||||
function AddNewCollectionMovieModal(props) {
|
|
||||||
const {
|
|
||||||
isOpen,
|
|
||||||
onModalClose,
|
|
||||||
...otherProps
|
|
||||||
} = props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Modal
|
|
||||||
isOpen={isOpen}
|
|
||||||
onModalClose={onModalClose}
|
|
||||||
>
|
|
||||||
<AddNewCollectionMovieModalContentConnector
|
|
||||||
{...otherProps}
|
|
||||||
onModalClose={onModalClose}
|
|
||||||
/>
|
|
||||||
</Modal>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
AddNewCollectionMovieModal.propTypes = {
|
|
||||||
isOpen: PropTypes.bool.isRequired,
|
|
||||||
onModalClose: PropTypes.func.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
export default AddNewCollectionMovieModal;
|
|
||||||
|
|
@ -1,204 +0,0 @@
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import React, { Component } from 'react';
|
|
||||||
import CheckInput from 'Components/Form/CheckInput';
|
|
||||||
import Form from 'Components/Form/Form';
|
|
||||||
import FormGroup from 'Components/Form/FormGroup';
|
|
||||||
import FormInputGroup from 'Components/Form/FormInputGroup';
|
|
||||||
import FormLabel from 'Components/Form/FormLabel';
|
|
||||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
|
||||||
import ModalBody from 'Components/Modal/ModalBody';
|
|
||||||
import ModalContent from 'Components/Modal/ModalContent';
|
|
||||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
|
||||||
import ModalHeader from 'Components/Modal/ModalHeader';
|
|
||||||
import { inputTypes, kinds } from 'Helpers/Props';
|
|
||||||
import MoviePoster from 'Movie/MoviePoster';
|
|
||||||
import translate from 'Utilities/String/translate';
|
|
||||||
import styles from './AddNewCollectionMovieModalContent.css';
|
|
||||||
|
|
||||||
class AddNewCollectionMovieModalContent extends Component {
|
|
||||||
|
|
||||||
//
|
|
||||||
// Listeners
|
|
||||||
|
|
||||||
onQualityProfileIdChange = ({ value }) => {
|
|
||||||
this.props.onInputChange({ name: 'qualityProfileId', value: parseInt(value) });
|
|
||||||
};
|
|
||||||
|
|
||||||
onAddMoviePress = () => {
|
|
||||||
this.props.onAddMoviePress();
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Render
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const {
|
|
||||||
title,
|
|
||||||
year,
|
|
||||||
overview,
|
|
||||||
images,
|
|
||||||
isAdding,
|
|
||||||
folder,
|
|
||||||
tags,
|
|
||||||
isSmallScreen,
|
|
||||||
isWindows,
|
|
||||||
onModalClose,
|
|
||||||
onInputChange,
|
|
||||||
rootFolderPath,
|
|
||||||
monitor,
|
|
||||||
qualityProfileId,
|
|
||||||
minimumAvailability,
|
|
||||||
searchForMovie
|
|
||||||
} = this.props;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ModalContent onModalClose={onModalClose}>
|
|
||||||
<ModalHeader>
|
|
||||||
{title}
|
|
||||||
|
|
||||||
{
|
|
||||||
!title.contains(year) && !!year &&
|
|
||||||
<span className={styles.year}>({year})</span>
|
|
||||||
}
|
|
||||||
</ModalHeader>
|
|
||||||
|
|
||||||
<ModalBody>
|
|
||||||
<div className={styles.container}>
|
|
||||||
{
|
|
||||||
!isSmallScreen &&
|
|
||||||
<div className={styles.poster}>
|
|
||||||
<MoviePoster
|
|
||||||
className={styles.poster}
|
|
||||||
images={images}
|
|
||||||
size={250}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
<div className={styles.info}>
|
|
||||||
<div className={styles.overview}>
|
|
||||||
{overview}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<Form>
|
|
||||||
<FormGroup>
|
|
||||||
<FormLabel>{translate('RootFolder')}</FormLabel>
|
|
||||||
|
|
||||||
<FormInputGroup
|
|
||||||
type={inputTypes.ROOT_FOLDER_SELECT}
|
|
||||||
name="rootFolderPath"
|
|
||||||
valueOptions={{
|
|
||||||
movieFolder: folder,
|
|
||||||
isWindows
|
|
||||||
}}
|
|
||||||
selectedValueOptions={{
|
|
||||||
movieFolder: folder,
|
|
||||||
isWindows
|
|
||||||
}}
|
|
||||||
helpText={translate('SubfolderWillBeCreatedAutomaticallyInterp', [folder])}
|
|
||||||
onChange={onInputChange}
|
|
||||||
{...rootFolderPath}
|
|
||||||
/>
|
|
||||||
</FormGroup>
|
|
||||||
|
|
||||||
<FormGroup>
|
|
||||||
<FormLabel>
|
|
||||||
{translate('Monitor')}
|
|
||||||
</FormLabel>
|
|
||||||
|
|
||||||
<FormInputGroup
|
|
||||||
type={inputTypes.MONITOR_MOVIES_SELECT}
|
|
||||||
name="monitor"
|
|
||||||
onChange={onInputChange}
|
|
||||||
{...monitor}
|
|
||||||
/>
|
|
||||||
</FormGroup>
|
|
||||||
|
|
||||||
<FormGroup>
|
|
||||||
<FormLabel>{translate('MinimumAvailability')}</FormLabel>
|
|
||||||
|
|
||||||
<FormInputGroup
|
|
||||||
type={inputTypes.AVAILABILITY_SELECT}
|
|
||||||
name="minimumAvailability"
|
|
||||||
onChange={onInputChange}
|
|
||||||
{...minimumAvailability}
|
|
||||||
/>
|
|
||||||
</FormGroup>
|
|
||||||
|
|
||||||
<FormGroup>
|
|
||||||
<FormLabel>{translate('QualityProfile')}</FormLabel>
|
|
||||||
|
|
||||||
<FormInputGroup
|
|
||||||
type={inputTypes.QUALITY_PROFILE_SELECT}
|
|
||||||
name="qualityProfileId"
|
|
||||||
onChange={this.onQualityProfileIdChange}
|
|
||||||
{...qualityProfileId}
|
|
||||||
/>
|
|
||||||
</FormGroup>
|
|
||||||
|
|
||||||
<FormGroup>
|
|
||||||
<FormLabel>{translate('Tags')}</FormLabel>
|
|
||||||
|
|
||||||
<FormInputGroup
|
|
||||||
type={inputTypes.TAG}
|
|
||||||
name="tags"
|
|
||||||
onChange={onInputChange}
|
|
||||||
{...tags}
|
|
||||||
/>
|
|
||||||
</FormGroup>
|
|
||||||
</Form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</ModalBody>
|
|
||||||
|
|
||||||
<ModalFooter className={styles.modalFooter}>
|
|
||||||
<label className={styles.searchForMissingMovieLabelContainer}>
|
|
||||||
<span className={styles.searchForMissingMovieLabel}>
|
|
||||||
{translate('StartSearchForMissingMovie')}
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<CheckInput
|
|
||||||
containerClassName={styles.searchForMissingMovieContainer}
|
|
||||||
className={styles.searchForMissingMovieInput}
|
|
||||||
name="searchForMovie"
|
|
||||||
onChange={onInputChange}
|
|
||||||
{...searchForMovie}
|
|
||||||
/>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<SpinnerButton
|
|
||||||
className={styles.addButton}
|
|
||||||
kind={kinds.SUCCESS}
|
|
||||||
isSpinning={isAdding}
|
|
||||||
onPress={this.onAddMoviePress}
|
|
||||||
>
|
|
||||||
{translate('AddMovie')}
|
|
||||||
</SpinnerButton>
|
|
||||||
</ModalFooter>
|
|
||||||
</ModalContent>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AddNewCollectionMovieModalContent.propTypes = {
|
|
||||||
title: PropTypes.string.isRequired,
|
|
||||||
year: PropTypes.number.isRequired,
|
|
||||||
overview: PropTypes.string,
|
|
||||||
images: PropTypes.arrayOf(PropTypes.object).isRequired,
|
|
||||||
isAdding: PropTypes.bool.isRequired,
|
|
||||||
addError: PropTypes.object,
|
|
||||||
rootFolderPath: PropTypes.object,
|
|
||||||
monitor: PropTypes.object.isRequired,
|
|
||||||
qualityProfileId: PropTypes.object,
|
|
||||||
minimumAvailability: PropTypes.object.isRequired,
|
|
||||||
searchForMovie: PropTypes.object.isRequired,
|
|
||||||
folder: PropTypes.string.isRequired,
|
|
||||||
tags: PropTypes.object.isRequired,
|
|
||||||
isSmallScreen: PropTypes.bool.isRequired,
|
|
||||||
isWindows: PropTypes.bool.isRequired,
|
|
||||||
onModalClose: PropTypes.func.isRequired,
|
|
||||||
onInputChange: PropTypes.func.isRequired,
|
|
||||||
onAddMoviePress: PropTypes.func.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
export default AddNewCollectionMovieModalContent;
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import React, { Component } from 'react';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
import { createSelector } from 'reselect';
|
|
||||||
import { addMovie, setMovieCollectionValue } from 'Store/Actions/movieCollectionActions';
|
|
||||||
import createCollectionSelector from 'Store/Selectors/createCollectionSelector';
|
|
||||||
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
|
||||||
import createSystemStatusSelector from 'Store/Selectors/createSystemStatusSelector';
|
|
||||||
import selectSettings from 'Store/Selectors/selectSettings';
|
|
||||||
import AddNewMovieModalContent from './AddNewCollectionMovieModalContent';
|
|
||||||
|
|
||||||
function createMapStateToProps() {
|
|
||||||
return createSelector(
|
|
||||||
(state) => state.movieCollections,
|
|
||||||
createCollectionSelector(),
|
|
||||||
createDimensionsSelector(),
|
|
||||||
createSystemStatusSelector(),
|
|
||||||
(discoverMovieState, collection, dimensions, systemStatus) => {
|
|
||||||
const {
|
|
||||||
isAdding,
|
|
||||||
addError,
|
|
||||||
pendingChanges
|
|
||||||
} = discoverMovieState;
|
|
||||||
|
|
||||||
const collectionDefaults = {
|
|
||||||
rootFolderPath: collection.rootFolderPath,
|
|
||||||
monitor: 'movieOnly',
|
|
||||||
qualityProfileId: collection.qualityProfileId,
|
|
||||||
minimumAvailability: collection.minimumAvailability,
|
|
||||||
searchForMovie: collection.searchOnAdd,
|
|
||||||
tags: collection.tags || []
|
|
||||||
};
|
|
||||||
|
|
||||||
const {
|
|
||||||
settings,
|
|
||||||
validationErrors,
|
|
||||||
validationWarnings
|
|
||||||
} = selectSettings(collectionDefaults, pendingChanges, addError);
|
|
||||||
|
|
||||||
return {
|
|
||||||
isAdding,
|
|
||||||
addError,
|
|
||||||
isSmallScreen: dimensions.isSmallScreen,
|
|
||||||
validationErrors,
|
|
||||||
validationWarnings,
|
|
||||||
isWindows: systemStatus.isWindows,
|
|
||||||
...settings
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const mapDispatchToProps = {
|
|
||||||
addMovie,
|
|
||||||
setMovieCollectionValue
|
|
||||||
};
|
|
||||||
|
|
||||||
class AddNewCollectionMovieModalContentConnector extends Component {
|
|
||||||
|
|
||||||
//
|
|
||||||
// Listeners
|
|
||||||
|
|
||||||
onInputChange = ({ name, value }) => {
|
|
||||||
this.props.setMovieCollectionValue({ name, value });
|
|
||||||
};
|
|
||||||
|
|
||||||
onAddMoviePress = () => {
|
|
||||||
const {
|
|
||||||
tmdbId,
|
|
||||||
title,
|
|
||||||
rootFolderPath,
|
|
||||||
monitor,
|
|
||||||
qualityProfileId,
|
|
||||||
minimumAvailability,
|
|
||||||
searchForMovie,
|
|
||||||
tags
|
|
||||||
} = this.props;
|
|
||||||
|
|
||||||
this.props.addMovie({
|
|
||||||
tmdbId,
|
|
||||||
title,
|
|
||||||
rootFolderPath: rootFolderPath.value,
|
|
||||||
monitor: monitor.value,
|
|
||||||
qualityProfileId: qualityProfileId.value,
|
|
||||||
minimumAvailability: minimumAvailability.value,
|
|
||||||
searchForMovie: searchForMovie.value,
|
|
||||||
tags: tags.value
|
|
||||||
});
|
|
||||||
|
|
||||||
this.props.onModalClose(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Render
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<AddNewMovieModalContent
|
|
||||||
{...this.props}
|
|
||||||
onInputChange={this.onInputChange}
|
|
||||||
onAddMoviePress={this.onAddMoviePress}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AddNewCollectionMovieModalContentConnector.propTypes = {
|
|
||||||
tmdbId: PropTypes.number.isRequired,
|
|
||||||
title: PropTypes.string.isRequired,
|
|
||||||
rootFolderPath: PropTypes.object,
|
|
||||||
monitor: PropTypes.object.isRequired,
|
|
||||||
qualityProfileId: PropTypes.object,
|
|
||||||
minimumAvailability: PropTypes.object.isRequired,
|
|
||||||
searchForMovie: PropTypes.object.isRequired,
|
|
||||||
tags: PropTypes.object.isRequired,
|
|
||||||
onModalClose: PropTypes.func.isRequired,
|
|
||||||
addMovie: PropTypes.func.isRequired,
|
|
||||||
setMovieCollectionValue: PropTypes.func.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
export default connect(createMapStateToProps, mapDispatchToProps)(AddNewCollectionMovieModalContentConnector);
|
|
||||||
36
frontend/src/Collection/AddNewMovieCollectionMovieModal.tsx
Normal file
36
frontend/src/Collection/AddNewMovieCollectionMovieModal.tsx
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
import React, { useCallback } from 'react';
|
||||||
|
import { useDispatch } from 'react-redux';
|
||||||
|
import Modal from 'Components/Modal/Modal';
|
||||||
|
import { clearPendingChanges } from 'Store/Actions/baseActions';
|
||||||
|
import AddNewMovieCollectionMovieModalContent, {
|
||||||
|
AddNewMovieCollectionMovieModalContentProps,
|
||||||
|
} from './AddNewMovieCollectionMovieModalContent';
|
||||||
|
|
||||||
|
interface AddNewCollectionMovieModalProps
|
||||||
|
extends AddNewMovieCollectionMovieModalContentProps {
|
||||||
|
isOpen: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddNewMovieCollectionMovieModal({
|
||||||
|
isOpen,
|
||||||
|
onModalClose,
|
||||||
|
...otherProps
|
||||||
|
}: AddNewCollectionMovieModalProps) {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
const handleModalClose = useCallback(() => {
|
||||||
|
dispatch(clearPendingChanges({ section: 'movieCollections' }));
|
||||||
|
onModalClose();
|
||||||
|
}, [dispatch, onModalClose]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal isOpen={isOpen} onModalClose={handleModalClose}>
|
||||||
|
<AddNewMovieCollectionMovieModalContent
|
||||||
|
{...otherProps}
|
||||||
|
onModalClose={handleModalClose}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AddNewMovieCollectionMovieModal;
|
||||||
|
|
@ -0,0 +1,269 @@
|
||||||
|
import React, { useCallback, useEffect, useMemo } from 'react';
|
||||||
|
import { useDispatch, useSelector } from 'react-redux';
|
||||||
|
import MovieMinimumAvailabilityPopoverContent from 'AddMovie/MovieMinimumAvailabilityPopoverContent';
|
||||||
|
import AppState from 'App/State/AppState';
|
||||||
|
import useMovieCollection from 'Collection/useMovieCollection';
|
||||||
|
import CheckInput from 'Components/Form/CheckInput';
|
||||||
|
import Form from 'Components/Form/Form';
|
||||||
|
import FormGroup from 'Components/Form/FormGroup';
|
||||||
|
import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||||
|
import FormLabel from 'Components/Form/FormLabel';
|
||||||
|
import Icon from 'Components/Icon';
|
||||||
|
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||||
|
import ModalBody from 'Components/Modal/ModalBody';
|
||||||
|
import ModalContent from 'Components/Modal/ModalContent';
|
||||||
|
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||||
|
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||||
|
import Popover from 'Components/Tooltip/Popover';
|
||||||
|
import usePrevious from 'Helpers/Hooks/usePrevious';
|
||||||
|
import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props';
|
||||||
|
import { Image } from 'Movie/Movie';
|
||||||
|
import MoviePoster from 'Movie/MoviePoster';
|
||||||
|
import {
|
||||||
|
addMovie,
|
||||||
|
setMovieCollectionValue,
|
||||||
|
} from 'Store/Actions/movieCollectionActions';
|
||||||
|
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
||||||
|
import selectSettings from 'Store/Selectors/selectSettings';
|
||||||
|
import useIsWindows from 'System/useIsWindows';
|
||||||
|
import { InputChanged } from 'typings/inputs';
|
||||||
|
import translate from 'Utilities/String/translate';
|
||||||
|
import styles from './AddNewMovieCollectionMovieModalContent.css';
|
||||||
|
|
||||||
|
export interface AddNewMovieCollectionMovieModalContentProps {
|
||||||
|
tmdbId: number;
|
||||||
|
title: string;
|
||||||
|
year: number;
|
||||||
|
overview?: string;
|
||||||
|
images: Image[];
|
||||||
|
collectionId: number;
|
||||||
|
folder: string;
|
||||||
|
onModalClose: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddNewMovieCollectionMovieModalContent({
|
||||||
|
tmdbId,
|
||||||
|
title,
|
||||||
|
year,
|
||||||
|
overview,
|
||||||
|
images,
|
||||||
|
collectionId,
|
||||||
|
folder,
|
||||||
|
onModalClose,
|
||||||
|
}: AddNewMovieCollectionMovieModalContentProps) {
|
||||||
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
|
const collection = useMovieCollection(collectionId)!;
|
||||||
|
|
||||||
|
const { isSmallScreen } = useSelector(createDimensionsSelector());
|
||||||
|
const isWindows = useIsWindows();
|
||||||
|
|
||||||
|
const { isAdding, addError, pendingChanges } = useSelector(
|
||||||
|
(state: AppState) => state.movieCollections
|
||||||
|
);
|
||||||
|
|
||||||
|
const wasAdding = usePrevious(isAdding);
|
||||||
|
|
||||||
|
const { settings, validationErrors, validationWarnings } = useMemo(() => {
|
||||||
|
const options = {
|
||||||
|
rootFolderPath: collection.rootFolderPath,
|
||||||
|
monitor: collection.monitored ? 'movieOnly' : 'none',
|
||||||
|
qualityProfileId: collection.qualityProfileId,
|
||||||
|
minimumAvailability: collection.minimumAvailability,
|
||||||
|
searchForMovie: collection.searchOnAdd,
|
||||||
|
tags: collection.tags || [],
|
||||||
|
};
|
||||||
|
|
||||||
|
return selectSettings(options, pendingChanges, addError);
|
||||||
|
}, [collection, pendingChanges, addError]);
|
||||||
|
|
||||||
|
const {
|
||||||
|
monitor,
|
||||||
|
qualityProfileId,
|
||||||
|
minimumAvailability,
|
||||||
|
rootFolderPath,
|
||||||
|
searchForMovie,
|
||||||
|
tags,
|
||||||
|
} = settings;
|
||||||
|
|
||||||
|
const handleInputChange = useCallback(
|
||||||
|
({ name, value }: InputChanged) => {
|
||||||
|
// @ts-expect-error actions aren't typed
|
||||||
|
dispatch(setMovieCollectionValue({ name, value }));
|
||||||
|
},
|
||||||
|
[dispatch]
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleAddMoviePress = useCallback(() => {
|
||||||
|
dispatch(
|
||||||
|
addMovie({
|
||||||
|
tmdbId,
|
||||||
|
title,
|
||||||
|
rootFolderPath: rootFolderPath.value,
|
||||||
|
monitor: monitor.value,
|
||||||
|
qualityProfileId: qualityProfileId.value,
|
||||||
|
minimumAvailability: minimumAvailability.value,
|
||||||
|
searchForMovie: searchForMovie.value,
|
||||||
|
tags: tags.value,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}, [
|
||||||
|
tmdbId,
|
||||||
|
title,
|
||||||
|
rootFolderPath,
|
||||||
|
monitor,
|
||||||
|
qualityProfileId,
|
||||||
|
minimumAvailability,
|
||||||
|
searchForMovie,
|
||||||
|
tags,
|
||||||
|
dispatch,
|
||||||
|
]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!isAdding && wasAdding && !addError) {
|
||||||
|
onModalClose();
|
||||||
|
}
|
||||||
|
}, [isAdding, wasAdding, addError, onModalClose]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalContent onModalClose={onModalClose}>
|
||||||
|
<ModalHeader>
|
||||||
|
{title}
|
||||||
|
|
||||||
|
{!title.includes(String(year)) && year ? (
|
||||||
|
<span className={styles.year}>({year})</span>
|
||||||
|
) : null}
|
||||||
|
</ModalHeader>
|
||||||
|
|
||||||
|
<ModalBody>
|
||||||
|
<div className={styles.container}>
|
||||||
|
{isSmallScreen ? null : (
|
||||||
|
<div className={styles.poster}>
|
||||||
|
<MoviePoster
|
||||||
|
className={styles.poster}
|
||||||
|
images={images}
|
||||||
|
size={250}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className={styles.info}>
|
||||||
|
{overview ? (
|
||||||
|
<div className={styles.overview}>{overview}</div>
|
||||||
|
) : null}
|
||||||
|
|
||||||
|
<Form
|
||||||
|
validationErrors={validationErrors}
|
||||||
|
validationWarnings={validationWarnings}
|
||||||
|
>
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('RootFolder')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.ROOT_FOLDER_SELECT}
|
||||||
|
name="rootFolderPath"
|
||||||
|
valueOptions={{
|
||||||
|
movieFolder: folder,
|
||||||
|
isWindows,
|
||||||
|
}}
|
||||||
|
selectedValueOptions={{
|
||||||
|
movieFolder: folder,
|
||||||
|
isWindows,
|
||||||
|
}}
|
||||||
|
helpText={translate('AddNewMovieRootFolderHelpText', {
|
||||||
|
folder,
|
||||||
|
})}
|
||||||
|
{...rootFolderPath}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('Monitor')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.MONITOR_MOVIES_SELECT}
|
||||||
|
name="monitor"
|
||||||
|
{...monitor}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>
|
||||||
|
{translate('MinimumAvailability')}
|
||||||
|
|
||||||
|
<Popover
|
||||||
|
anchor={
|
||||||
|
<Icon className={styles.labelIcon} name={icons.INFO} />
|
||||||
|
}
|
||||||
|
title={translate('MinimumAvailability')}
|
||||||
|
body={<MovieMinimumAvailabilityPopoverContent />}
|
||||||
|
position={tooltipPositions.RIGHT}
|
||||||
|
/>
|
||||||
|
</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.AVAILABILITY_SELECT}
|
||||||
|
name="minimumAvailability"
|
||||||
|
{...minimumAvailability}
|
||||||
|
helpLink="https://wiki.servarr.com/radarr/faq#what-is-minimum-availability"
|
||||||
|
onChange={handleInputChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('QualityProfile')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.QUALITY_PROFILE_SELECT}
|
||||||
|
name="qualityProfileId"
|
||||||
|
{...qualityProfileId}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('Tags')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.TAG}
|
||||||
|
name="tags"
|
||||||
|
{...tags}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
</Form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</ModalBody>
|
||||||
|
|
||||||
|
<ModalFooter className={styles.modalFooter}>
|
||||||
|
<label className={styles.searchForMissingMovieLabelContainer}>
|
||||||
|
<span className={styles.searchForMissingMovieLabel}>
|
||||||
|
{translate('StartSearchForMissingMovie')}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<CheckInput
|
||||||
|
containerClassName={styles.searchForMissingMovieContainer}
|
||||||
|
className={styles.searchForMissingMovieInput}
|
||||||
|
name="searchForMovie"
|
||||||
|
{...searchForMovie}
|
||||||
|
onChange={handleInputChange}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<SpinnerButton
|
||||||
|
className={styles.addButton}
|
||||||
|
kind={kinds.SUCCESS}
|
||||||
|
isSpinning={isAdding}
|
||||||
|
onPress={handleAddMoviePress}
|
||||||
|
>
|
||||||
|
{translate('AddMovie')}
|
||||||
|
</SpinnerButton>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalContent>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AddNewMovieCollectionMovieModalContent;
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
|
import AddNewMovieCollectionMovieModal from 'Collection/AddNewMovieCollectionMovieModal';
|
||||||
import Link from 'Components/Link/Link';
|
import Link from 'Components/Link/Link';
|
||||||
import MonitorToggleButton from 'Components/MonitorToggleButton';
|
import MonitorToggleButton from 'Components/MonitorToggleButton';
|
||||||
import EditMovieModal from 'Movie/Edit/EditMovieModal';
|
import EditMovieModal from 'Movie/Edit/EditMovieModal';
|
||||||
import MovieIndexProgressBar from 'Movie/Index/ProgressBar/MovieIndexProgressBar';
|
import MovieIndexProgressBar from 'Movie/Index/ProgressBar/MovieIndexProgressBar';
|
||||||
import MoviePoster from 'Movie/MoviePoster';
|
import MoviePoster from 'Movie/MoviePoster';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
import AddNewCollectionMovieModal from './../AddNewCollectionMovieModal';
|
|
||||||
import styles from './CollectionMovie.css';
|
import styles from './CollectionMovie.css';
|
||||||
|
|
||||||
class CollectionMovie extends Component {
|
class CollectionMovie extends Component {
|
||||||
|
|
@ -160,7 +160,7 @@ class CollectionMovie extends Component {
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<AddNewCollectionMovieModal
|
<AddNewMovieCollectionMovieModal
|
||||||
isOpen={isNewAddMovieModalOpen && !isExistingMovie}
|
isOpen={isNewAddMovieModalOpen && !isExistingMovie}
|
||||||
tmdbId={tmdbId}
|
tmdbId={tmdbId}
|
||||||
title={title}
|
title={title}
|
||||||
|
|
@ -188,7 +188,7 @@ CollectionMovie.propTypes = {
|
||||||
title: PropTypes.string.isRequired,
|
title: PropTypes.string.isRequired,
|
||||||
year: PropTypes.number.isRequired,
|
year: PropTypes.number.isRequired,
|
||||||
status: PropTypes.string.isRequired,
|
status: PropTypes.string.isRequired,
|
||||||
overview: PropTypes.string.isRequired,
|
overview: PropTypes.string,
|
||||||
monitored: PropTypes.bool,
|
monitored: PropTypes.bool,
|
||||||
collectionId: PropTypes.number.isRequired,
|
collectionId: PropTypes.number.isRequired,
|
||||||
hasFile: PropTypes.bool,
|
hasFile: PropTypes.bool,
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ import ModelBase from 'App/ModelBase';
|
||||||
import Language from 'Language/Language';
|
import Language from 'Language/Language';
|
||||||
import { MovieFile } from 'MovieFile/MovieFile';
|
import { MovieFile } from 'MovieFile/MovieFile';
|
||||||
|
|
||||||
|
export type MovieMonitor = 'movieOnly' | 'movieAndCollection' | 'none';
|
||||||
|
|
||||||
export type MovieStatus =
|
export type MovieStatus =
|
||||||
| 'tba'
|
| 'tba'
|
||||||
| 'announced'
|
| 'announced'
|
||||||
|
|
@ -48,6 +50,11 @@ export interface AlternativeTitle extends ModelBase {
|
||||||
title: string;
|
title: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface MovieAddOptions {
|
||||||
|
monitor: MovieMonitor;
|
||||||
|
searchForMovie: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
interface Movie extends ModelBase {
|
interface Movie extends ModelBase {
|
||||||
tmdbId: number;
|
tmdbId: number;
|
||||||
imdbId?: string;
|
imdbId?: string;
|
||||||
|
|
@ -87,6 +94,7 @@ interface Movie extends ModelBase {
|
||||||
lastSearchTime?: string;
|
lastSearchTime?: string;
|
||||||
isAvailable: boolean;
|
isAvailable: boolean;
|
||||||
isSaving?: boolean;
|
isSaving?: boolean;
|
||||||
|
addOptions: MovieAddOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Movie;
|
export default Movie;
|
||||||
|
|
|
||||||
|
|
@ -250,8 +250,7 @@ export const actionHandlers = handleThunks({
|
||||||
[ADD_MOVIE]: function(getState, payload, dispatch) {
|
[ADD_MOVIE]: function(getState, payload, dispatch) {
|
||||||
dispatch(set({ section, isAdding: true }));
|
dispatch(set({ section, isAdding: true }));
|
||||||
|
|
||||||
const tmdbId = payload.tmdbId;
|
const { tmdbId, title } = payload;
|
||||||
const title = payload.title;
|
|
||||||
|
|
||||||
const newMovie = getNewMovie({ tmdbId, title }, payload);
|
const newMovie = getNewMovie({ tmdbId, title }, payload);
|
||||||
newMovie.id = 0;
|
newMovie.id = 0;
|
||||||
|
|
|
||||||
8
frontend/src/System/useIsWindows.ts
Normal file
8
frontend/src/System/useIsWindows.ts
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
import { useSelector } from 'react-redux';
|
||||||
|
import AppState from 'App/State/AppState';
|
||||||
|
|
||||||
|
function useIsWindows() {
|
||||||
|
return useSelector((state: AppState) => state.system.status.item.isWindows);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useIsWindows;
|
||||||
|
|
@ -1,17 +1,27 @@
|
||||||
|
import Movie, { MovieAvailability, MovieMonitor } from 'Movie/Movie';
|
||||||
|
|
||||||
function getNewMovie(movie, payload) {
|
interface NewMoviePayload {
|
||||||
|
rootFolderPath: string;
|
||||||
|
monitor: MovieMonitor;
|
||||||
|
qualityProfileId: number;
|
||||||
|
minimumAvailability: MovieAvailability;
|
||||||
|
tags: number[];
|
||||||
|
searchForMovie?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNewMovie(movie: Movie, payload: NewMoviePayload) {
|
||||||
const {
|
const {
|
||||||
rootFolderPath,
|
rootFolderPath,
|
||||||
monitor,
|
monitor,
|
||||||
qualityProfileId,
|
qualityProfileId,
|
||||||
minimumAvailability,
|
minimumAvailability,
|
||||||
tags,
|
tags,
|
||||||
searchForMovie = false
|
searchForMovie = false,
|
||||||
} = payload;
|
} = payload;
|
||||||
|
|
||||||
const addOptions = {
|
const addOptions = {
|
||||||
monitor,
|
monitor,
|
||||||
searchForMovie
|
searchForMovie,
|
||||||
};
|
};
|
||||||
|
|
||||||
movie.addOptions = addOptions;
|
movie.addOptions = addOptions;
|
||||||
|
|
@ -494,7 +494,7 @@
|
||||||
"System": "النظام",
|
"System": "النظام",
|
||||||
"Sunday": "الأحد",
|
"Sunday": "الأحد",
|
||||||
"SuggestTranslationChange": "اقترح تغيير الترجمة",
|
"SuggestTranslationChange": "اقترح تغيير الترجمة",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "سيتم إنشاء المجلد الفرعي \"{0}\" تلقائيًا",
|
"AddNewMovieRootFolderHelpText": "سيتم إنشاء المجلد الفرعي \"{0}\" تلقائيًا",
|
||||||
"Style": "أسلوب",
|
"Style": "أسلوب",
|
||||||
"Studio": "ستوديو",
|
"Studio": "ستوديو",
|
||||||
"Status": "الحالة",
|
"Status": "الحالة",
|
||||||
|
|
|
||||||
|
|
@ -549,7 +549,7 @@
|
||||||
"Status": "Състояние",
|
"Status": "Състояние",
|
||||||
"Studio": "Студио",
|
"Studio": "Студио",
|
||||||
"Style": "Стил",
|
"Style": "Стил",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Подпапката „{0}“ ще бъде създадена автоматично",
|
"AddNewMovieRootFolderHelpText": "Подпапката „{0}“ ще бъде създадена автоматично",
|
||||||
"Sunday": "Неделя",
|
"Sunday": "Неделя",
|
||||||
"Table": "Таблица",
|
"Table": "Таблица",
|
||||||
"TableOptions": "Опции на таблицата",
|
"TableOptions": "Опции на таблицата",
|
||||||
|
|
|
||||||
|
|
@ -840,7 +840,7 @@
|
||||||
"Status": "Estat",
|
"Status": "Estat",
|
||||||
"Studio": "Estudi",
|
"Studio": "Estudi",
|
||||||
"Style": "Estil",
|
"Style": "Estil",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "La subcarpeta '{0}' es crearà automàticament",
|
"AddNewMovieRootFolderHelpText": "La subcarpeta '{0}' es crearà automàticament",
|
||||||
"SuggestTranslationChange": "Suggereix un canvi de traducció",
|
"SuggestTranslationChange": "Suggereix un canvi de traducció",
|
||||||
"Sunday": "Diumenge",
|
"Sunday": "Diumenge",
|
||||||
"System": "Sistema",
|
"System": "Sistema",
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@
|
||||||
"StartImport": "Spusťte import",
|
"StartImport": "Spusťte import",
|
||||||
"Status": "Postavení",
|
"Status": "Postavení",
|
||||||
"Studio": "Studio",
|
"Studio": "Studio",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Podsložka „{0}“ bude vytvořena automaticky",
|
"AddNewMovieRootFolderHelpText": "Podsložka „{0}“ bude vytvořena automaticky",
|
||||||
"ICalTagsMoviesHelpText": "Platí pro filmy s alespoň jednou shodnou značkou",
|
"ICalTagsMoviesHelpText": "Platí pro filmy s alespoň jednou shodnou značkou",
|
||||||
"TorrentDelayTime": "Torrent Delay: {0}",
|
"TorrentDelayTime": "Torrent Delay: {0}",
|
||||||
"Trakt": "Trakt",
|
"Trakt": "Trakt",
|
||||||
|
|
|
||||||
|
|
@ -824,7 +824,7 @@
|
||||||
"Status": "Status",
|
"Status": "Status",
|
||||||
"Studio": "Studio",
|
"Studio": "Studio",
|
||||||
"Style": "Stil",
|
"Style": "Stil",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Undermappen '{0}' oprettes automatisk",
|
"AddNewMovieRootFolderHelpText": "Undermappen '{0}' oprettes automatisk",
|
||||||
"Sunday": "Søndag",
|
"Sunday": "Søndag",
|
||||||
"Table": "Tabel",
|
"Table": "Tabel",
|
||||||
"TableOptions": "Tabelindstillinger",
|
"TableOptions": "Tabelindstillinger",
|
||||||
|
|
|
||||||
|
|
@ -579,7 +579,7 @@
|
||||||
"WaitingToImport": "Warten auf Import",
|
"WaitingToImport": "Warten auf Import",
|
||||||
"UpgradeUntilThisQualityIsMetOrExceeded": "Führe ein Upgrade durch, bis diese Qualität erreicht oder überschritten wird",
|
"UpgradeUntilThisQualityIsMetOrExceeded": "Führe ein Upgrade durch, bis diese Qualität erreicht oder überschritten wird",
|
||||||
"TagCannotBeDeletedWhileInUse": "Kann während der Benutzung nicht gelöscht werden",
|
"TagCannotBeDeletedWhileInUse": "Kann während der Benutzung nicht gelöscht werden",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' Unterordner wird automatisch erstellt",
|
"AddNewMovieRootFolderHelpText": "'{0}' Unterordner wird automatisch erstellt",
|
||||||
"SslCertPathHelpText": "Pfad zur PFX Datei",
|
"SslCertPathHelpText": "Pfad zur PFX Datei",
|
||||||
"SslCertPasswordHelpText": "Passwort für die PFX Datei",
|
"SslCertPasswordHelpText": "Passwort für die PFX Datei",
|
||||||
"ShowYear": "Jahr anzeigen",
|
"ShowYear": "Jahr anzeigen",
|
||||||
|
|
|
||||||
|
|
@ -826,7 +826,7 @@
|
||||||
"Status": "Κατάσταση",
|
"Status": "Κατάσταση",
|
||||||
"Studio": "Στούντιο",
|
"Studio": "Στούντιο",
|
||||||
"Style": "Στυλ",
|
"Style": "Στυλ",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Ο υποφάκελος \"{0}\" θα δημιουργηθεί αυτόματα",
|
"AddNewMovieRootFolderHelpText": "Ο υποφάκελος \"{0}\" θα δημιουργηθεί αυτόματα",
|
||||||
"Sunday": "Κυριακή",
|
"Sunday": "Κυριακή",
|
||||||
"Table": "Τραπέζι",
|
"Table": "Τραπέζι",
|
||||||
"TableOptions": "Επιλογές πίνακα",
|
"TableOptions": "Επιλογές πίνακα",
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@
|
||||||
"AddNew": "Add New",
|
"AddNew": "Add New",
|
||||||
"AddNewMessage": "It's easy to add a new movie, just start typing the name of the movie you want to add",
|
"AddNewMessage": "It's easy to add a new movie, just start typing the name of the movie you want to add",
|
||||||
"AddNewMovie": "Add New Movie",
|
"AddNewMovie": "Add New Movie",
|
||||||
|
"AddNewMovieRootFolderHelpText": "'{folder}' subfolder will be created automatically",
|
||||||
"AddNewRestriction": "Add new restriction",
|
"AddNewRestriction": "Add new restriction",
|
||||||
"AddNewTmdbIdMessage": "You can also search using TMDb Id of a movie. e.g. 'tmdb:71663'",
|
"AddNewTmdbIdMessage": "You can also search using TMDb Id of a movie. e.g. 'tmdb:71663'",
|
||||||
"AddNotificationError": "Unable to add a new notification, please try again.",
|
"AddNotificationError": "Unable to add a new notification, please try again.",
|
||||||
|
|
@ -1831,7 +1832,6 @@
|
||||||
"StopSelecting": "Stop Selecting",
|
"StopSelecting": "Stop Selecting",
|
||||||
"Studio": "Studio",
|
"Studio": "Studio",
|
||||||
"Style": "Style",
|
"Style": "Style",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' subfolder will be created automatically",
|
|
||||||
"SubtitleLanguages": "Subtitle Languages",
|
"SubtitleLanguages": "Subtitle Languages",
|
||||||
"SuggestTranslationChange": "Suggest translation change",
|
"SuggestTranslationChange": "Suggest translation change",
|
||||||
"Sunday": "Sunday",
|
"Sunday": "Sunday",
|
||||||
|
|
|
||||||
|
|
@ -581,7 +581,7 @@
|
||||||
"WaitingToImport": "Esperar para importar",
|
"WaitingToImport": "Esperar para importar",
|
||||||
"UpgradeUntilThisQualityIsMetOrExceeded": "Actualizar hasta que esta calidad sea alcanzada o excedida",
|
"UpgradeUntilThisQualityIsMetOrExceeded": "Actualizar hasta que esta calidad sea alcanzada o excedida",
|
||||||
"TagCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso",
|
"TagCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "La subcarpeta '{0}' se creará automáticamente",
|
"AddNewMovieRootFolderHelpText": "La subcarpeta '{0}' se creará automáticamente",
|
||||||
"SslCertPathHelpText": "Ruta del archivo pfx",
|
"SslCertPathHelpText": "Ruta del archivo pfx",
|
||||||
"SslCertPasswordHelpText": "Contraseña para archivo pfx",
|
"SslCertPasswordHelpText": "Contraseña para archivo pfx",
|
||||||
"ShowYear": "Mostrar Año",
|
"ShowYear": "Mostrar Año",
|
||||||
|
|
|
||||||
|
|
@ -828,7 +828,7 @@
|
||||||
"Status": "Tila",
|
"Status": "Tila",
|
||||||
"Studio": "Studio",
|
"Studio": "Studio",
|
||||||
"Style": "Ulkoasu",
|
"Style": "Ulkoasu",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Alikansio '{0}' luodaan automaattisesti",
|
"AddNewMovieRootFolderHelpText": "Alikansio '{0}' luodaan automaattisesti",
|
||||||
"Sunday": "Sunnuntai",
|
"Sunday": "Sunnuntai",
|
||||||
"Table": "Taulukko",
|
"Table": "Taulukko",
|
||||||
"TableOptions": "Taulukkonäkymän asetukset",
|
"TableOptions": "Taulukkonäkymän asetukset",
|
||||||
|
|
|
||||||
|
|
@ -596,7 +596,7 @@
|
||||||
"TestAllClients": "Tester tous les clients",
|
"TestAllClients": "Tester tous les clients",
|
||||||
"TagCannotBeDeletedWhileInUse": "Ne peut pas être supprimé pendant l'utilisation",
|
"TagCannotBeDeletedWhileInUse": "Ne peut pas être supprimé pendant l'utilisation",
|
||||||
"SuggestTranslationChange": "Suggérer un changement de traduction",
|
"SuggestTranslationChange": "Suggérer un changement de traduction",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' le sous-dossier sera créé automatiquement",
|
"AddNewMovieRootFolderHelpText": "'{0}' le sous-dossier sera créé automatiquement",
|
||||||
"StartupDirectory": "Répertoire de démarrage",
|
"StartupDirectory": "Répertoire de démarrage",
|
||||||
"StandardMovieFormat": "Format de film standard",
|
"StandardMovieFormat": "Format de film standard",
|
||||||
"SslPort": "Port SSL",
|
"SslPort": "Port SSL",
|
||||||
|
|
|
||||||
|
|
@ -828,7 +828,7 @@
|
||||||
"Status": "סטָטוּס",
|
"Status": "סטָטוּס",
|
||||||
"Studio": "סטוּדִיוֹ",
|
"Studio": "סטוּדִיוֹ",
|
||||||
"Style": "סִגְנוֹן",
|
"Style": "סִגְנוֹן",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "תיקיית המשנה '{0}' תיווצר באופן אוטומטי",
|
"AddNewMovieRootFolderHelpText": "תיקיית המשנה '{0}' תיווצר באופן אוטומטי",
|
||||||
"Sunday": "יוֹם רִאשׁוֹן",
|
"Sunday": "יוֹם רִאשׁוֹן",
|
||||||
"Table": "שולחן",
|
"Table": "שולחן",
|
||||||
"TableOptions": "אפשרויות טבלה",
|
"TableOptions": "אפשרויות טבלה",
|
||||||
|
|
|
||||||
|
|
@ -211,7 +211,7 @@
|
||||||
"SslCertPath": "एसएसएल सर्टिफिकेट पाथ",
|
"SslCertPath": "एसएसएल सर्टिफिकेट पाथ",
|
||||||
"StandardMovieFormat": "मानक मूवी प्रारूप",
|
"StandardMovieFormat": "मानक मूवी प्रारूप",
|
||||||
"StartSearchForMissingMovie": "लापता फिल्म की खोज शुरू करें",
|
"StartSearchForMissingMovie": "लापता फिल्म की खोज शुरू करें",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' सबफ़ोल्डर स्वचालित रूप से बनाया जाएगा",
|
"AddNewMovieRootFolderHelpText": "'{0}' सबफ़ोल्डर स्वचालित रूप से बनाया जाएगा",
|
||||||
"TableColumnsHelpText": "चुनें कि कौन से कॉलम दिखाई दे रहे हैं और वे किस क्रम में दिखाई देते हैं",
|
"TableColumnsHelpText": "चुनें कि कौन से कॉलम दिखाई दे रहे हैं और वे किस क्रम में दिखाई देते हैं",
|
||||||
"TagDetails": "टैग विवरण - {0}",
|
"TagDetails": "टैग विवरण - {0}",
|
||||||
"TagIsNotUsedAndCanBeDeleted": "टैग का उपयोग नहीं किया जाता है और इसे हटाया जा सकता है",
|
"TagIsNotUsedAndCanBeDeleted": "टैग का उपयोग नहीं किया जाता है और इसे हटाया जा सकता है",
|
||||||
|
|
|
||||||
|
|
@ -238,7 +238,7 @@
|
||||||
"EnableColorImpairedMode": "Engedélyezze a színtévesztő módot",
|
"EnableColorImpairedMode": "Engedélyezze a színtévesztő módot",
|
||||||
"System": "Rendszer",
|
"System": "Rendszer",
|
||||||
"SuggestTranslationChange": "Javasolj fordítási változtatást",
|
"SuggestTranslationChange": "Javasolj fordítási változtatást",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "A(z) „{0}” almappa automatikusan létrehozásra kerül",
|
"AddNewMovieRootFolderHelpText": "A(z) „{0}” almappa automatikusan létrehozásra kerül",
|
||||||
"Style": "Stílus",
|
"Style": "Stílus",
|
||||||
"Studio": "Stúdió",
|
"Studio": "Stúdió",
|
||||||
"Status": "Állapot",
|
"Status": "Állapot",
|
||||||
|
|
|
||||||
|
|
@ -837,7 +837,7 @@
|
||||||
"StartSearchForMissingMovie": "Byrjaðu að leita að kvikmynd sem vantar",
|
"StartSearchForMissingMovie": "Byrjaðu að leita að kvikmynd sem vantar",
|
||||||
"Studio": "Stúdíó",
|
"Studio": "Stúdíó",
|
||||||
"Style": "Stíll",
|
"Style": "Stíll",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "„{0}“ undirmöppan verður búin til sjálfkrafa",
|
"AddNewMovieRootFolderHelpText": "„{0}“ undirmöppan verður búin til sjálfkrafa",
|
||||||
"Sunday": "Sunnudag",
|
"Sunday": "Sunnudag",
|
||||||
"Table": "Tafla",
|
"Table": "Tafla",
|
||||||
"TableOptions": "Borðvalkostir",
|
"TableOptions": "Borðvalkostir",
|
||||||
|
|
|
||||||
|
|
@ -664,7 +664,7 @@
|
||||||
"TagCannotBeDeletedWhileInUse": "Non può essere cancellato mentre è in uso",
|
"TagCannotBeDeletedWhileInUse": "Non può essere cancellato mentre è in uso",
|
||||||
"Table": "Tabella",
|
"Table": "Tabella",
|
||||||
"SuggestTranslationChange": "Suggerisci un cambio nella traduzione",
|
"SuggestTranslationChange": "Suggerisci un cambio nella traduzione",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "La sottocartella '{0}' verrà creata automaticamente",
|
"AddNewMovieRootFolderHelpText": "La sottocartella '{0}' verrà creata automaticamente",
|
||||||
"StartupDirectory": "Cartella di Avvio",
|
"StartupDirectory": "Cartella di Avvio",
|
||||||
"FileBrowserPlaceholderText": "Comincia a digitare o seleziona un percorso sotto",
|
"FileBrowserPlaceholderText": "Comincia a digitare o seleziona un percorso sotto",
|
||||||
"StandardMovieFormat": "Formato Film Standard",
|
"StandardMovieFormat": "Formato Film Standard",
|
||||||
|
|
|
||||||
|
|
@ -824,7 +824,7 @@
|
||||||
"Status": "状態",
|
"Status": "状態",
|
||||||
"Studio": "スタジオ",
|
"Studio": "スタジオ",
|
||||||
"Style": "スタイル",
|
"Style": "スタイル",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}'サブフォルダは自動的に作成されます",
|
"AddNewMovieRootFolderHelpText": "'{0}'サブフォルダは自動的に作成されます",
|
||||||
"Sunday": "日曜日",
|
"Sunday": "日曜日",
|
||||||
"Table": "テーブル",
|
"Table": "テーブル",
|
||||||
"TableOptions": "テーブルオプション",
|
"TableOptions": "テーブルオプション",
|
||||||
|
|
|
||||||
|
|
@ -832,7 +832,7 @@
|
||||||
"Status": "상태",
|
"Status": "상태",
|
||||||
"Studio": "스튜디오",
|
"Studio": "스튜디오",
|
||||||
"Style": "스타일",
|
"Style": "스타일",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' 하위 폴더가 자동으로 생성됩니다",
|
"AddNewMovieRootFolderHelpText": "'{0}' 하위 폴더가 자동으로 생성됩니다",
|
||||||
"Sunday": "일요일",
|
"Sunday": "일요일",
|
||||||
"Table": "테이블",
|
"Table": "테이블",
|
||||||
"TableColumnsHelpText": "표시되는 열과 표시되는 순서를 선택하세요",
|
"TableColumnsHelpText": "표시되는 열과 표시되는 순서를 선택하세요",
|
||||||
|
|
|
||||||
|
|
@ -587,7 +587,7 @@
|
||||||
"WaitingToImport": "Wachten tot Importeren",
|
"WaitingToImport": "Wachten tot Importeren",
|
||||||
"UpgradeUntilThisQualityIsMetOrExceeded": "Bijwerken totdat deze kwaliteit is behaald of overschreden",
|
"UpgradeUntilThisQualityIsMetOrExceeded": "Bijwerken totdat deze kwaliteit is behaald of overschreden",
|
||||||
"TagCannotBeDeletedWhileInUse": "Kan niet verwijderd worden terwijl in gebruik",
|
"TagCannotBeDeletedWhileInUse": "Kan niet verwijderd worden terwijl in gebruik",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' submap zal automatisch worden aangemaakt",
|
"AddNewMovieRootFolderHelpText": "'{0}' submap zal automatisch worden aangemaakt",
|
||||||
"SslCertPathHelpText": "Pad naar pfx bestand",
|
"SslCertPathHelpText": "Pad naar pfx bestand",
|
||||||
"SslCertPasswordHelpText": "Wachtwoord voor pfx bestand",
|
"SslCertPasswordHelpText": "Wachtwoord voor pfx bestand",
|
||||||
"ShowYear": "Toon Jaar",
|
"ShowYear": "Toon Jaar",
|
||||||
|
|
|
||||||
|
|
@ -838,7 +838,7 @@
|
||||||
"Status": "Status",
|
"Status": "Status",
|
||||||
"Studio": "Studio",
|
"Studio": "Studio",
|
||||||
"Style": "Styl",
|
"Style": "Styl",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Podfolder „{0}” zostanie utworzony automatycznie",
|
"AddNewMovieRootFolderHelpText": "Podfolder „{0}” zostanie utworzony automatycznie",
|
||||||
"Sunday": "niedziela",
|
"Sunday": "niedziela",
|
||||||
"Table": "Stół",
|
"Table": "Stół",
|
||||||
"TableOptions": "Opcje tabeli",
|
"TableOptions": "Opcje tabeli",
|
||||||
|
|
|
||||||
|
|
@ -611,7 +611,7 @@
|
||||||
"TestAllClients": "Testar todos os clientes",
|
"TestAllClients": "Testar todos os clientes",
|
||||||
"ICalTagsMoviesHelpText": "Aplica-se a filmes com pelo menos uma etiqueta correspondente",
|
"ICalTagsMoviesHelpText": "Aplica-se a filmes com pelo menos uma etiqueta correspondente",
|
||||||
"TagIsNotUsedAndCanBeDeleted": "A etiqueta não é utilizada e pode ser eliminada",
|
"TagIsNotUsedAndCanBeDeleted": "A etiqueta não é utilizada e pode ser eliminada",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "A subpasta \"{0}\" será criada automaticamente",
|
"AddNewMovieRootFolderHelpText": "A subpasta \"{0}\" será criada automaticamente",
|
||||||
"FileBrowserPlaceholderText": "Começa a digitar ou seleciona um caminho abaixo",
|
"FileBrowserPlaceholderText": "Começa a digitar ou seleciona um caminho abaixo",
|
||||||
"StandardMovieFormat": "Formato padrão de filme",
|
"StandardMovieFormat": "Formato padrão de filme",
|
||||||
"SslCertPathHelpText": "Caminho para o ficheiro PFX",
|
"SslCertPathHelpText": "Caminho para o ficheiro PFX",
|
||||||
|
|
|
||||||
|
|
@ -602,7 +602,7 @@
|
||||||
"System": "Sistema",
|
"System": "Sistema",
|
||||||
"Sunday": "Domingo",
|
"Sunday": "Domingo",
|
||||||
"SuggestTranslationChange": "Sugerir mudança de tradução",
|
"SuggestTranslationChange": "Sugerir mudança de tradução",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "A subpasta \"{0}\" será criada automaticamente",
|
"AddNewMovieRootFolderHelpText": "A subpasta \"{0}\" será criada automaticamente",
|
||||||
"Style": "Estilo",
|
"Style": "Estilo",
|
||||||
"Studio": "Studio",
|
"Studio": "Studio",
|
||||||
"Status": "Status",
|
"Status": "Status",
|
||||||
|
|
|
||||||
|
|
@ -866,7 +866,7 @@
|
||||||
"StartImport": "Porniți importul",
|
"StartImport": "Porniți importul",
|
||||||
"StartProcessing": "Începeți procesarea",
|
"StartProcessing": "Începeți procesarea",
|
||||||
"StartSearchForMissingMovie": "Începeți căutarea filmului lipsă",
|
"StartSearchForMissingMovie": "Începeți căutarea filmului lipsă",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Subfolderul „{0}” va fi creat automat",
|
"AddNewMovieRootFolderHelpText": "Subfolderul „{0}” va fi creat automat",
|
||||||
"Sunday": "duminică",
|
"Sunday": "duminică",
|
||||||
"Table": "Tabel",
|
"Table": "Tabel",
|
||||||
"TagDetails": "Detalii etichetă - {0}",
|
"TagDetails": "Detalii etichetă - {0}",
|
||||||
|
|
|
||||||
|
|
@ -853,7 +853,7 @@
|
||||||
"System": "Система",
|
"System": "Система",
|
||||||
"Sunday": "Воскресенье",
|
"Sunday": "Воскресенье",
|
||||||
"SuggestTranslationChange": "Предложить изменение перевода",
|
"SuggestTranslationChange": "Предложить изменение перевода",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Подпапка \"{0}\" будет создана автоматически",
|
"AddNewMovieRootFolderHelpText": "Подпапка \"{0}\" будет создана автоматически",
|
||||||
"Style": "Стиль",
|
"Style": "Стиль",
|
||||||
"Studio": "Студия",
|
"Studio": "Студия",
|
||||||
"Status": "Статус",
|
"Status": "Статус",
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@
|
||||||
"DeleteQualityProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?",
|
"DeleteQualityProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?",
|
||||||
"DeleteReleaseProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?",
|
"DeleteReleaseProfileMessageText": "Naozaj chcete zmazať tento profil oneskorenia?",
|
||||||
"EditIndexerImplementation": "Pridať Indexer - {implementationName}",
|
"EditIndexerImplementation": "Pridať Indexer - {implementationName}",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{folder}' podpriečinok sa vytvorí automaticky",
|
"AddNewMovieRootFolderHelpText": "'{folder}' podpriečinok sa vytvorí automaticky",
|
||||||
"DeleteFormatMessageText": "Naozaj chcete zmazať značku formátu {0} ?",
|
"DeleteFormatMessageText": "Naozaj chcete zmazať značku formátu {0} ?",
|
||||||
"DownloadClientSettingsRecentPriority": "Priorita klienta",
|
"DownloadClientSettingsRecentPriority": "Priorita klienta",
|
||||||
"EditReleaseProfile": "Pridať profil vydania",
|
"EditReleaseProfile": "Pridať profil vydania",
|
||||||
|
|
|
||||||
|
|
@ -888,7 +888,7 @@
|
||||||
"SslCertPath": "SSL-certifierad sökväg",
|
"SslCertPath": "SSL-certifierad sökväg",
|
||||||
"SslPort": "SSL-port",
|
"SslPort": "SSL-port",
|
||||||
"StandardMovieFormat": "Standardfilmformat",
|
"StandardMovieFormat": "Standardfilmformat",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Undermappen \"{0}\" skapas automatiskt",
|
"AddNewMovieRootFolderHelpText": "Undermappen \"{0}\" skapas automatiskt",
|
||||||
"TagDetails": "Taggdetaljer - {0}",
|
"TagDetails": "Taggdetaljer - {0}",
|
||||||
"TagIsNotUsedAndCanBeDeleted": "Taggen används inte och kan raderas",
|
"TagIsNotUsedAndCanBeDeleted": "Taggen används inte och kan raderas",
|
||||||
"ICalTagsMoviesHelpText": "Gäller filmer med minst en matchande tagg",
|
"ICalTagsMoviesHelpText": "Gäller filmer med minst en matchande tagg",
|
||||||
|
|
|
||||||
|
|
@ -855,7 +855,7 @@
|
||||||
"Status": "สถานะ",
|
"Status": "สถานะ",
|
||||||
"Studio": "สตูดิโอ",
|
"Studio": "สตูดิโอ",
|
||||||
"Style": "สไตล์",
|
"Style": "สไตล์",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "โฟลเดอร์ย่อย \"{0}\" จะถูกสร้างขึ้นโดยอัตโนมัติ",
|
"AddNewMovieRootFolderHelpText": "โฟลเดอร์ย่อย \"{0}\" จะถูกสร้างขึ้นโดยอัตโนมัติ",
|
||||||
"Sunday": "วันอาทิตย์",
|
"Sunday": "วันอาทิตย์",
|
||||||
"TableOptions": "ตัวเลือกตาราง",
|
"TableOptions": "ตัวเลือกตาราง",
|
||||||
"TagDetails": "รายละเอียดแท็ก - {0}",
|
"TagDetails": "รายละเอียดแท็ก - {0}",
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,7 @@
|
||||||
"StandardMovieFormat": "Standart Film Formatı",
|
"StandardMovieFormat": "Standart Film Formatı",
|
||||||
"StartImport": "İçe Aktarmayı Başlat",
|
"StartImport": "İçe Aktarmayı Başlat",
|
||||||
"StartSearchForMissingMovie": "Kayıp filmi aramaya başlayın",
|
"StartSearchForMissingMovie": "Kayıp filmi aramaya başlayın",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "'{0}' alt klasörü otomatik olarak oluşturulacak",
|
"AddNewMovieRootFolderHelpText": "'{0}' alt klasörü otomatik olarak oluşturulacak",
|
||||||
"Sunday": "Pazar",
|
"Sunday": "Pazar",
|
||||||
"Table": "Tablo",
|
"Table": "Tablo",
|
||||||
"TableOptions": "Tablo Seçenekleri",
|
"TableOptions": "Tablo Seçenekleri",
|
||||||
|
|
|
||||||
|
|
@ -848,7 +848,7 @@
|
||||||
"Status": "Статус",
|
"Status": "Статус",
|
||||||
"Studio": "Студія",
|
"Studio": "Студія",
|
||||||
"Style": "Стиль",
|
"Style": "Стиль",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Вкладена папка \"{0}\" буде створена автоматично",
|
"AddNewMovieRootFolderHelpText": "Вкладена папка \"{0}\" буде створена автоматично",
|
||||||
"SuggestTranslationChange": "Запропонуйте зміну перекладу",
|
"SuggestTranslationChange": "Запропонуйте зміну перекладу",
|
||||||
"SystemTimeHealthCheckMessage": "Системний час вимкнено більш ніж на 1 день. Заплановані завдання можуть не працювати належним чином, доки час не буде виправлено",
|
"SystemTimeHealthCheckMessage": "Системний час вимкнено більш ніж на 1 день. Заплановані завдання можуть не працювати належним чином, доки час не буде виправлено",
|
||||||
"Table": "Таблиця",
|
"Table": "Таблиця",
|
||||||
|
|
|
||||||
|
|
@ -868,7 +868,7 @@
|
||||||
"StartImport": "Bắt đầu nhập",
|
"StartImport": "Bắt đầu nhập",
|
||||||
"Status": "Trạng thái",
|
"Status": "Trạng thái",
|
||||||
"Style": "Phong cách",
|
"Style": "Phong cách",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "Thư mục con '{0}' sẽ được tạo tự động",
|
"AddNewMovieRootFolderHelpText": "Thư mục con '{0}' sẽ được tạo tự động",
|
||||||
"Sunday": "chủ nhật",
|
"Sunday": "chủ nhật",
|
||||||
"Table": "Bàn",
|
"Table": "Bàn",
|
||||||
"TableOptions": "Tùy chọn bảng",
|
"TableOptions": "Tùy chọn bảng",
|
||||||
|
|
|
||||||
|
|
@ -726,7 +726,7 @@
|
||||||
"UpdateCheckUINotWritableMessage": "无法安装更新,因为用户 “{userName}” 对 UI 文件夹 “{uiFolder}” 无写入权限。",
|
"UpdateCheckUINotWritableMessage": "无法安装更新,因为用户 “{userName}” 对 UI 文件夹 “{uiFolder}” 无写入权限。",
|
||||||
"ShowMonitoredHelpText": "在海报下显示追踪状态",
|
"ShowMonitoredHelpText": "在海报下显示追踪状态",
|
||||||
"PosterSize": "海报大小",
|
"PosterSize": "海报大小",
|
||||||
"SubfolderWillBeCreatedAutomaticallyInterp": "“{0}” 子文件夹将自动创建",
|
"AddNewMovieRootFolderHelpText": "“{0}” 子文件夹将自动创建",
|
||||||
"Queued": "队列中",
|
"Queued": "队列中",
|
||||||
"WhatsNew": "什么是新的?",
|
"WhatsNew": "什么是新的?",
|
||||||
"ReleaseGroup": "发布组",
|
"ReleaseGroup": "发布组",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue