Convert Movie History to TypeScript

Closes #10755

Co-authored-by: Mark McDowall <mark@mcdowall.ca>
This commit is contained in:
Bogdan 2025-03-08 16:04:08 +02:00
parent 779292490a
commit 6a7ed22b44
42 changed files with 344 additions and 497 deletions

View file

@ -37,7 +37,7 @@ interface HistoryDetailsModalProps {
sourceTitle: string;
data: HistoryData;
downloadId?: string;
isMarkingAsFailed: boolean;
isMarkingAsFailed?: boolean;
onMarkAsFailedPress: () => void;
onModalClose: () => void;
}

View file

@ -1,13 +1,12 @@
import BlocklistAppState from './BlocklistAppState';
import CalendarAppState from './CalendarAppState';
import CommandAppState from './CommandAppState';
import HistoryAppState from './HistoryAppState';
import HistoryAppState, { MovieHistoryAppState } from './HistoryAppState';
import InteractiveImportAppState from './InteractiveImportAppState';
import MovieBlocklistAppState from './MovieBlocklistAppState';
import MovieCollectionAppState from './MovieCollectionAppState';
import MovieCreditAppState from './MovieCreditAppState';
import MovieFilesAppState from './MovieFilesAppState';
import MovieHistoryAppState from './MovieHistoryAppState';
import MoviesAppState, { MovieIndexAppState } from './MoviesAppState';
import OrganizePreviewAppState from './OrganizePreviewAppState';
import ParseAppState from './ParseAppState';

View file

@ -5,6 +5,8 @@ import AppSectionState, {
} from 'App/State/AppSectionState';
import History from 'typings/History';
export type MovieHistoryAppState = AppSectionState<History>;
interface HistoryAppState
extends AppSectionState<History>,
AppSectionFilterState<History>,

View file

@ -1,6 +0,0 @@
import AppSectionState from 'App/State/AppSectionState';
import History from 'typings/History';
type MovieHistoryAppState = AppSectionState<History>;
export default MovieHistoryAppState;

View file

@ -1,33 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import Modal from 'Components/Modal/Modal';
import { sizes } from 'Helpers/Props';
import MovieHistoryModalContentConnector from './MovieHistoryModalContentConnector';
function MovieHistoryModal(props) {
const {
isOpen,
onModalClose,
...otherProps
} = props;
return (
<Modal
isOpen={isOpen}
onModalClose={onModalClose}
size={sizes.EXTRA_EXTRA_LARGE}
>
<MovieHistoryModalContentConnector
{...otherProps}
onModalClose={onModalClose}
/>
</Modal>
);
}
MovieHistoryModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
onModalClose: PropTypes.func.isRequired
};
export default MovieHistoryModal;

View file

@ -0,0 +1,28 @@
import React from 'react';
import Modal from 'Components/Modal/Modal';
import { sizes } from 'Helpers/Props';
import MovieHistoryModalContent, {
MovieHistoryModalContentProps,
} from 'Movie/History/MovieHistoryModalContent';
interface MovieHistoryModalProps extends MovieHistoryModalContentProps {
isOpen: boolean;
}
function MovieHistoryModal({
isOpen,
onModalClose,
...otherProps
}: MovieHistoryModalProps) {
return (
<Modal
isOpen={isOpen}
size={sizes.EXTRA_EXTRA_LARGE}
onModalClose={onModalClose}
>
<MovieHistoryModalContent {...otherProps} onModalClose={onModalClose} />
</Modal>
);
}
export default MovieHistoryModal;

View file

@ -1,141 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Alert from 'Components/Alert';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
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 Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import MovieHistoryRowConnector from './MovieHistoryRowConnector';
const columns = [
{
name: 'eventType',
isVisible: true
},
{
name: 'sourceTitle',
label: () => translate('SourceTitle'),
isVisible: true
},
{
name: 'languages',
label: () => translate('Languages'),
isVisible: true
},
{
name: 'quality',
label: () => translate('Quality'),
isVisible: true
},
{
name: 'customFormats',
label: () => translate('CustomFormats'),
isSortable: false,
isVisible: true
},
{
name: 'customFormatScore',
label: React.createElement(Icon, {
name: icons.SCORE,
title: () => translate('CustomFormatScore')
}),
isSortable: true,
isVisible: true
},
{
name: 'date',
label: () => translate('Date'),
isVisible: true
},
{
name: 'actions',
isVisible: true
}
];
class MovieHistoryModalContent extends Component {
//
// Render
render() {
const {
isFetching,
isPopulated,
error,
items,
onMarkAsFailedPress,
onModalClose
} = this.props;
const hasItems = !!items.length;
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{translate('History')}
</ModalHeader>
<ModalBody>
{
isFetching &&
<LoadingIndicator />
}
{
!isFetching && !!error &&
<Alert kind={kinds.DANGER}>{translate('HistoryLoadError')}</Alert>
}
{
isPopulated && !hasItems && !error &&
<div>{translate('NoHistory')}</div>
}
{
isPopulated && hasItems && !error &&
<Table columns={columns}>
<TableBody>
{
items.map((item) => {
return (
<MovieHistoryRowConnector
key={item.id}
{...item}
onMarkAsFailedPress={onMarkAsFailedPress}
/>
);
})
}
</TableBody>
</Table>
}
</ModalBody>
<ModalFooter>
<Button onPress={onModalClose}>
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>
);
}
}
MovieHistoryModalContent.propTypes = {
isFetching: PropTypes.bool.isRequired,
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
onMarkAsFailedPress: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};
export default MovieHistoryModalContent;

View file

@ -0,0 +1,148 @@
import React, { useCallback, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import AppState from 'App/State/AppState';
import Alert from 'Components/Alert';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
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 Column from 'Components/Table/Column';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { icons, kinds } from 'Helpers/Props';
import {
clearMovieHistory,
fetchMovieHistory,
movieHistoryMarkAsFailed,
} from 'Store/Actions/movieHistoryActions';
import translate from 'Utilities/String/translate';
import MovieHistoryRow from './MovieHistoryRow';
const columns: Column[] = [
{
name: 'eventType',
label: '',
isVisible: true,
},
{
name: 'sourceTitle',
label: () => translate('SourceTitle'),
isVisible: true,
},
{
name: 'languages',
label: () => translate('Languages'),
isVisible: true,
},
{
name: 'quality',
label: () => translate('Quality'),
isVisible: true,
},
{
name: 'customFormats',
label: () => translate('CustomFormats'),
isSortable: false,
isVisible: true,
},
{
name: 'customFormatScore',
label: React.createElement(Icon, {
name: icons.SCORE,
title: () => translate('CustomFormatScore'),
}),
isSortable: true,
isVisible: true,
},
{
name: 'date',
label: () => translate('Date'),
isVisible: true,
},
{
name: 'actions',
label: '',
isVisible: true,
},
];
export interface MovieHistoryModalContentProps {
movieId: number;
onModalClose: () => void;
}
function MovieHistoryModalContent({
movieId,
onModalClose,
}: MovieHistoryModalContentProps) {
const dispatch = useDispatch();
const { isFetching, isPopulated, error, items } = useSelector(
(state: AppState) => state.movieHistory
);
const hasItems = !!items.length;
const handleMarkAsFailedPress = useCallback(
(historyId: number) => {
dispatch(
movieHistoryMarkAsFailed({
historyId,
movieId,
})
);
},
[movieId, dispatch]
);
useEffect(() => {
dispatch(fetchMovieHistory({ movieId }));
return () => {
dispatch(clearMovieHistory());
};
}, [movieId, dispatch]);
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>{translate('History')}</ModalHeader>
<ModalBody>
{isFetching && !isPopulated ? <LoadingIndicator /> : null}
{!isFetching && !!error ? (
<Alert kind={kinds.DANGER}>{translate('HistoryLoadError')}</Alert>
) : null}
{isPopulated && !hasItems && !error ? (
<div>{translate('NoHistory')}</div>
) : null}
{isPopulated && hasItems && !error && (
<Table columns={columns}>
<TableBody>
{items.map((item) => {
return (
<MovieHistoryRow
key={item.id}
{...item}
onMarkAsFailedPress={handleMarkAsFailedPress}
/>
);
})}
</TableBody>
</Table>
)}
</ModalBody>
<ModalFooter>
<Button onPress={onModalClose}>{translate('Close')}</Button>
</ModalFooter>
</ModalContent>
);
}
export default MovieHistoryModalContent;

View file

@ -1,76 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { clearMovieHistory, fetchMovieHistory, movieHistoryMarkAsFailed } from 'Store/Actions/movieHistoryActions';
import MovieHistoryModalContent from './MovieHistoryModalContent';
function createMapStateToProps() {
return createSelector(
(state) => state.movieHistory,
(movieHistory) => {
return movieHistory;
}
);
}
const mapDispatchToProps = {
fetchMovieHistory,
clearMovieHistory,
movieHistoryMarkAsFailed
};
class MovieHistoryModalContentConnector extends Component {
//
// Lifecycle
componentDidMount() {
const {
movieId
} = this.props;
this.props.fetchMovieHistory({
movieId
});
}
componentWillUnmount() {
this.props.clearMovieHistory();
}
//
// Listeners
onMarkAsFailedPress = (historyId) => {
const {
movieId
} = this.props;
this.props.movieHistoryMarkAsFailed({
historyId,
movieId
});
};
//
// Render
render() {
return (
<MovieHistoryModalContent
{...this.props}
onMarkAsFailedPress={this.onMarkAsFailedPress}
/>
);
}
}
MovieHistoryModalContentConnector.propTypes = {
movieId: PropTypes.number.isRequired,
fetchMovieHistory: PropTypes.func.isRequired,
clearMovieHistory: PropTypes.func.isRequired,
movieHistoryMarkAsFailed: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(MovieHistoryModalContentConnector);

View file

@ -1,181 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import HistoryDetailsModal from 'Activity/History/Details/HistoryDetailsModal';
import HistoryEventTypeCell from 'Activity/History/HistoryEventTypeCell';
import IconButton from 'Components/Link/IconButton';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import RelativeDateCell from 'Components/Table/Cells/RelativeDateCell';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import { icons, kinds } from 'Helpers/Props';
import MovieFormats from 'Movie/MovieFormats';
import MovieLanguages from 'Movie/MovieLanguages';
import MovieQuality from 'Movie/MovieQuality';
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
import translate from 'Utilities/String/translate';
import styles from './MovieHistoryRow.css';
class MovieHistoryRow extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isMarkAsFailedModalOpen: false,
isDetailsModalOpen: false
};
}
//
// Listeners
onMarkAsFailedPress = () => {
this.setState({ isMarkAsFailedModalOpen: true });
};
onConfirmMarkAsFailed = () => {
this.props.onMarkAsFailedPress(this.props.id);
this.setState({ isMarkAsFailedModalOpen: false });
};
onMarkAsFailedModalClose = () => {
this.setState({ isMarkAsFailedModalOpen: false });
};
onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true });
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
};
//
// Render
render() {
const {
eventType,
sourceTitle,
quality,
customFormats,
customFormatScore,
languages,
qualityCutoffNotMet,
date,
data,
downloadId,
isMarkingAsFailed,
shortDateFormat,
timeFormat
} = this.props;
const {
isMarkAsFailedModalOpen
} = this.state;
return (
<TableRow>
<HistoryEventTypeCell
eventType={eventType}
data={data}
/>
<TableRowCell className={styles.sourceTitle}>
{sourceTitle}
</TableRowCell>
<TableRowCell>
<MovieLanguages
languages={languages}
/>
</TableRowCell>
<TableRowCell>
<MovieQuality
quality={quality}
isCutoffNotMet={qualityCutoffNotMet}
/>
</TableRowCell>
<TableRowCell>
<MovieFormats formats={customFormats} />
</TableRowCell>
<TableRowCell className={styles.customFormatScore}>
{formatCustomFormatScore(customFormatScore, customFormats.length)}
</TableRowCell>
<RelativeDateCell
date={date}
includeSeconds={true}
includeTime={true}
/>
<TableRowCell className={styles.actions}>
<IconButton
name={icons.INFO}
onPress={this.onDetailsPress}
/>
{
eventType === 'grabbed' &&
<IconButton
title={translate('MarkAsFailed')}
name={icons.REMOVE}
size={14}
onPress={this.onMarkAsFailedPress}
/>
}
</TableRowCell>
<ConfirmModal
isOpen={isMarkAsFailedModalOpen}
kind={kinds.DANGER}
title={translate('MarkAsFailed')}
message={translate('MarkAsFailedMessageText', [sourceTitle])}
confirmLabel={translate('MarkAsFailed')}
onConfirm={this.onConfirmMarkAsFailed}
onCancel={this.onMarkAsFailedModalClose}
/>
<HistoryDetailsModal
isOpen={this.state.isDetailsModalOpen}
eventType={eventType}
sourceTitle={sourceTitle}
data={data}
downloadId={downloadId}
isMarkingAsFailed={isMarkingAsFailed}
shortDateFormat={shortDateFormat}
timeFormat={timeFormat}
onMarkAsFailedPress={this.onMarkAsFailedPress}
onModalClose={this.onDetailsModalClose}
/>
</TableRow>
);
}
}
MovieHistoryRow.propTypes = {
id: PropTypes.number.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object),
customFormatScore: PropTypes.number.isRequired,
qualityCutoffNotMet: PropTypes.bool.isRequired,
date: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
downloadId: PropTypes.string,
isMarkingAsFailed: PropTypes.bool,
movie: PropTypes.object.isRequired,
shortDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired,
onMarkAsFailedPress: PropTypes.func.isRequired
};
export default MovieHistoryRow;

View file

@ -0,0 +1,134 @@
import React, { useCallback, useState } from 'react';
import HistoryDetailsModal from 'Activity/History/Details/HistoryDetailsModal';
import HistoryEventTypeCell from 'Activity/History/HistoryEventTypeCell';
import IconButton from 'Components/Link/IconButton';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import RelativeDateCell from 'Components/Table/Cells/RelativeDateCell';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import { icons, kinds } from 'Helpers/Props';
import Language from 'Language/Language';
import MovieFormats from 'Movie/MovieFormats';
import MovieLanguages from 'Movie/MovieLanguages';
import MovieQuality from 'Movie/MovieQuality';
import { QualityModel } from 'Quality/Quality';
import CustomFormat from 'typings/CustomFormat';
import { HistoryData, HistoryEventType } from 'typings/History';
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
import translate from 'Utilities/String/translate';
import styles from './MovieHistoryRow.css';
interface MovieHistoryRowProps {
id: number;
eventType: HistoryEventType;
sourceTitle: string;
languages?: Language[];
quality: QualityModel;
qualityCutoffNotMet: boolean;
customFormats?: CustomFormat[];
customFormatScore: number;
date: string;
data: HistoryData;
downloadId?: string;
onMarkAsFailedPress: (historyId: number) => void;
}
function MovieHistoryRow({
id,
eventType,
sourceTitle,
languages = [],
quality,
qualityCutoffNotMet,
customFormats = [],
customFormatScore,
date,
data,
downloadId,
onMarkAsFailedPress,
}: MovieHistoryRowProps) {
const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false);
const [isMarkAsFailedModalOpen, setIsMarkAsFailedModalOpen] = useState(false);
const handleDetailsPress = useCallback(() => {
setIsDetailsModalOpen(true);
}, [setIsDetailsModalOpen]);
const handleDetailsModalClose = useCallback(() => {
setIsDetailsModalOpen(false);
}, [setIsDetailsModalOpen]);
const handleMarkAsFailedPress = useCallback(() => {
setIsMarkAsFailedModalOpen(true);
}, []);
const handleConfirmMarkAsFailed = useCallback(() => {
onMarkAsFailedPress(id);
setIsMarkAsFailedModalOpen(false);
}, [id, onMarkAsFailedPress]);
const handleMarkAsFailedModalClose = useCallback(() => {
setIsMarkAsFailedModalOpen(false);
}, []);
return (
<TableRow>
<HistoryEventTypeCell eventType={eventType} data={data} />
<TableRowCell className={styles.sourceTitle}>{sourceTitle}</TableRowCell>
<TableRowCell>
<MovieLanguages languages={languages} />
</TableRowCell>
<TableRowCell>
<MovieQuality quality={quality} isCutoffNotMet={qualityCutoffNotMet} />
</TableRowCell>
<TableRowCell>
<MovieFormats formats={customFormats} />
</TableRowCell>
<TableRowCell className={styles.customFormatScore}>
{formatCustomFormatScore(customFormatScore, customFormats.length)}
</TableRowCell>
<RelativeDateCell date={date} includeSeconds={true} includeTime={true} />
<TableRowCell className={styles.actions}>
<IconButton name={icons.INFO} onPress={handleDetailsPress} />
{eventType === 'grabbed' ? (
<IconButton
title={translate('MarkAsFailed')}
name={icons.REMOVE}
size={14}
onPress={handleMarkAsFailedPress}
/>
) : null}
</TableRowCell>
<ConfirmModal
isOpen={isMarkAsFailedModalOpen}
kind={kinds.DANGER}
title={translate('MarkAsFailed')}
message={translate('MarkAsFailedConfirmation', { sourceTitle })}
confirmLabel={translate('MarkAsFailed')}
onConfirm={handleConfirmMarkAsFailed}
onCancel={handleMarkAsFailedModalClose}
/>
<HistoryDetailsModal
isOpen={isDetailsModalOpen}
eventType={eventType}
sourceTitle={sourceTitle}
data={data}
downloadId={downloadId}
onMarkAsFailedPress={handleMarkAsFailedPress}
onModalClose={handleDetailsModalClose}
/>
</TableRow>
);
}
export default MovieHistoryRow;

View file

@ -1,27 +0,0 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { fetchHistory, markAsFailed } from 'Store/Actions/historyActions';
import createMovieSelector from 'Store/Selectors/createMovieSelector';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import MovieHistoryRow from './MovieHistoryRow';
function createMapStateToProps() {
return createSelector(
createMovieSelector(),
createUISettingsSelector(),
(movie, uiSettings) => {
return {
movie,
shortDateFormat: uiSettings.shortDateFormat,
timeFormat: uiSettings.timeFormat
};
}
);
}
const mapDispatchToProps = {
fetchHistory,
markAsFailed
};
export default connect(createMapStateToProps, mapDispatchToProps)(MovieHistoryRow);

View file

@ -879,7 +879,7 @@
"MaximumLimits": "الحدود القصوى",
"Max": "ماكس",
"MassMovieSearch": "البحث الشامل عن الأفلام",
"MarkAsFailedMessageText": "هل أنت متأكد أنك تريد وضع علامة \"{0}\" على أنه فشل؟",
"MarkAsFailedConfirmation": "هل أنت متأكد أنك تريد وضع علامة \"{0}\" على أنه فشل؟",
"MarkAsFailed": "وضع علامة فشل",
"MappedNetworkDrivesWindowsService": "لا تتوفر محركات أقراص الشبكة المعينة عند التشغيل كخدمة Windows. يرجى الاطلاع على التعليمات لمزيد من المعلومات",
"ManualImportSelectQuality": " استيراد يدوي - حدد الجودة",

View file

@ -329,7 +329,7 @@
"ManualImportSelectMovie": "Ръчно импортиране - Изберете филм",
"ManualImportSelectQuality": " Ръчен импорт - Изберете качество",
"MappedNetworkDrivesWindowsService": "Картографираните мрежови устройства не са налични, когато се изпълняват като услуга на Windows. Моля, вижте често задаваните въпроси за повече информация",
"MarkAsFailedMessageText": "Наистина ли искате да маркирате „{0}“ като неуспешен?",
"MarkAsFailedConfirmation": "Наистина ли искате да маркирате „{0}“ като неуспешен?",
"MassMovieSearch": "Масово търсене на филми",
"MaximumLimits": "Максимални граници",
"MaximumSize": "Максимален размер",

View file

@ -324,7 +324,7 @@
"EditMovie": "Edita pel·lícula",
"EnableColorImpairedModeHelpText": "Estil alterat per a permetre als usuaris amb problemes de color distingir millor la informació codificada per colors",
"Folder": "Carpeta",
"MarkAsFailedMessageText": "Esteu segur que voleu marcar '{0}' com a fallat?",
"MarkAsFailedConfirmation": "Esteu segur que voleu marcar '{0}' com a fallat?",
"Negated": "Negat",
"Profiles": "Perfils",
"Real": "Real",

View file

@ -664,7 +664,7 @@
"ManualImportSelectMovie": "Ruční import - vyberte Film",
"ManualImportSelectQuality": " Ruční import - vyberte kvalitu",
"MappedNetworkDrivesWindowsService": "Mapované síťové jednotky nejsou k dispozici, když běží jako služba Windows. Další informace najdete v [FAQ]({url}).",
"MarkAsFailedMessageText": "Opravdu chcete označit „{0}“ jako neúspěšné?",
"MarkAsFailedConfirmation": "Opravdu chcete označit „{0}“ jako neúspěšné?",
"MassMovieSearch": "Hromadné vyhledávání filmů",
"MaximumLimits": "Maximální limity",
"MaximumSize": "Maximální velikost",

View file

@ -627,7 +627,7 @@
"ManualImportSelectLanguage": "Manuel import - Vælg sprog",
"ManualImportSelectMovie": "Manuel import - Vælg film",
"ManualImportSelectQuality": " Manuel import - Vælg kvalitet",
"MarkAsFailedMessageText": "Er du sikker på, at du vil markere '{0}' som mislykket?",
"MarkAsFailedConfirmation": "Er du sikker på, at du vil markere '{0}' som mislykket?",
"MaximumLimits": "Maksimumgrænser",
"MaximumSize": "Maksimal størrelse",
"MegabytesPerMinute": "Megabyte pr. Minut",

View file

@ -601,7 +601,7 @@
"MovieIsMonitored": "Film wird beobachtet",
"MovieExcludedFromAutomaticAdd": "Film vom automatischen hinzufügen ausgeschlossen",
"MovieAlreadyExcluded": "Film ist schon ausgeschlossen",
"MarkAsFailedMessageText": "'{0}' wirklich als fehlgeschlagen markieren?",
"MarkAsFailedConfirmation": "'{0}' wirklich als fehlgeschlagen markieren?",
"Manual": "Manuell",
"LogLevelTraceHelpTextWarning": "Die Trace-Protokollierung sollte nur vorübergehend aktiviert werden",
"LastDuration": "Letzte Dauer",

View file

@ -618,7 +618,7 @@
"ManualImportSelectLanguage": "Μη αυτόματη εισαγωγή - Επιλέξτε γλώσσα",
"ManualImportSelectQuality": " Μη αυτόματη εισαγωγή - Επιλέξτε Ποιότητα",
"MappedNetworkDrivesWindowsService": "Οι αντιστοιχισμένες μονάδες δίσκου δικτύου δεν είναι διαθέσιμες κατά την εκτέλεση ως υπηρεσία Windows. Ανατρέξτε στις Συχνές Ερωτήσεις για περισσότερες πληροφορίες",
"MarkAsFailedMessageText": "Είστε βέβαιοι ότι θέλετε να επισημάνετε \"{0}\" ως αποτυχημένο;",
"MarkAsFailedConfirmation": "Είστε βέβαιοι ότι θέλετε να επισημάνετε \"{0}\" ως αποτυχημένο;",
"MassMovieSearch": "Μαζική αναζήτηση ταινιών",
"MaximumLimits": "Μέγιστα όρια",
"MaximumSize": "Μέγιστο μέγεθος",

View file

@ -955,7 +955,7 @@
"ManualImportSetReleaseGroup": "Manual Import - Set Release Group",
"MappedNetworkDrivesWindowsService": "Mapped network drives are not available when running as a Windows Service, see the [FAQ]({url}) for more information.",
"MarkAsFailed": "Mark as Failed",
"MarkAsFailedMessageText": "Are you sure you want to mark '{0}' as failed?",
"MarkAsFailedConfirmation": "Are you sure you want to mark '{sourceTitle}' as failed?",
"MassMovieSearch": "Mass Movie Search",
"MassSearchCancelWarning": "This cannot be cancelled once started without restarting {appName} or disabling all of your indexers.",
"MatchedToMovie": "Matched to Movie",

View file

@ -602,7 +602,7 @@
"MovieIsMonitored": "La película está monitorizada",
"MovieExcludedFromAutomaticAdd": "Película Excluida de Adición Automática",
"MovieAlreadyExcluded": "Película ya Excluida",
"MarkAsFailedMessageText": "¿Estás seguro que quieres marcar '{0}' como fallida?",
"MarkAsFailedConfirmation": "¿Estás seguro que quieres marcar '{0}' como fallida?",
"Manual": "Manual",
"LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente",
"LastDuration": "Última Duración",

View file

@ -628,7 +628,7 @@
"Lowercase": "Pienet kirjaimet",
"ManualImportSelectLanguage": "Manuaalinen tuonti Valitse kieli",
"ManualImportSelectQuality": " Manuaalinen tuonti Valitse laatu",
"MarkAsFailedMessageText": "Haluatko varmasti merkitä kohteen {0} epäonnistuneeksi?",
"MarkAsFailedConfirmation": "Haluatko varmasti merkitä kohteen {0} epäonnistuneeksi?",
"MassMovieSearch": "Elokuvien massahaku",
"MaximumLimits": "Enimmäisrajoitukset",
"MaximumSize": "Enimmäiskoko",

View file

@ -653,7 +653,7 @@
"RemovingTag": "Supprimer la balise",
"RadarrTags": "Étiquettes {appName}",
"Paused": "En pause",
"MarkAsFailedMessageText": "Voulez-vous vraiment marquer '{0}' comme échoué ?",
"MarkAsFailedConfirmation": "Voulez-vous vraiment marquer '{0}' comme échoué ?",
"ExistingTag": "Balise existante",
"DownloadPropersAndRepacksHelpTextWarning": "Utilisez des formats personnalisés pour les mises à niveau automatiques vers Propers/Repacks",
"DownloadPropersAndRepacksHelpTextCustomFormat": "Utiliser 'Ne pas préférer' pour trier par score de mot préféré par rapport aux propres/repacks",

View file

@ -628,7 +628,7 @@
"ManualImportSelectMovie": "ייבוא ידני - בחר סרט",
"ManualImportSelectQuality": " יבוא ידני - בחר איכות",
"MappedNetworkDrivesWindowsService": "כונני רשת ממופים אינם זמינים כאשר הם פועלים כשירות Windows. אנא עיין בשאלות הנפוצות למידע נוסף",
"MarkAsFailedMessageText": "האם אתה בטוח שברצונך לסמן את '{0}' ככושל?",
"MarkAsFailedConfirmation": "האם אתה בטוח שברצונך לסמן את '{0}' ככושל?",
"MassMovieSearch": "חיפוש סרטים המוני",
"MaximumLimits": "מגבלות מקסימליות",
"MaximumSize": "גודל מקסימלי",

View file

@ -747,7 +747,7 @@
"LookingForReleaseProfiles2": "बजाय।",
"Lowercase": "लोअर केस",
"ManualImportSelectQuality": " मैनुअल आयात - गुणवत्ता का चयन करें",
"MarkAsFailedMessageText": "क्या आप वाकई '{0}' को चिह्नित करना चाहते हैं?",
"MarkAsFailedConfirmation": "क्या आप वाकई '{0}' को चिह्नित करना चाहते हैं?",
"MassMovieSearch": "मास मूवी सर्च",
"MaximumLimits": "अधिकतम सीमा",
"Message": "संदेश",

View file

@ -544,7 +544,7 @@
"MaximumSize": "Maximális méret",
"MaximumLimits": "Maximális korlátok",
"MassMovieSearch": "Tömeges filmkeresés",
"MarkAsFailedMessageText": "Biztosan sikertelennek szeretnéd jelölni a (z) „{0}”-t?",
"MarkAsFailedConfirmation": "Biztosan sikertelennek szeretnéd jelölni a (z) „{0}”-t?",
"MarkAsFailed": "Megjelölés sikertelenként",
"ManualImport": "Kézi importálás",
"Manual": "Kézi",

View file

@ -663,7 +663,7 @@
"ManualImportSelectMovie": "Handvirkur innflutningur - Veldu kvikmynd",
"ManualImportSelectQuality": " Handvirkur innflutningur - Veldu gæði",
"MappedNetworkDrivesWindowsService": "Kortlagðar netdrif eru ekki fáanlegar þegar þær eru keyrðar sem Windows þjónusta. Vinsamlegast skoðaðu algengar spurningar fyrir frekari upplýsingar",
"MarkAsFailedMessageText": "Ertu viss um að þú viljir merkja '{0}' sem mistókst?",
"MarkAsFailedConfirmation": "Ertu viss um að þú viljir merkja '{0}' sem mistókst?",
"MaximumLimits": "Hámarksmörk",
"MaximumSize": "Hámarksstærð",
"MegabytesPerMinute": "Megabæti á mínútu",

View file

@ -502,7 +502,7 @@
"MaximumSizeHelpText": "La dimensione massima in MB di una release affinchè sia presa, imposta zero per illimitata",
"MaximumSize": "Dimensione Massima",
"MaximumLimits": "Limiti massimi",
"MarkAsFailedMessageText": "Sei sicuro di voler segnare '{0}' come fallito?",
"MarkAsFailedConfirmation": "Sei sicuro di voler segnare '{0}' come fallito?",
"MarkAsFailed": "Segna come fallito",
"Manual": "Manuale",
"MaintenanceRelease": "Release di Manutenzione: correzione di bug e altri miglioramenti. Vedi la storia dei Commit su Github per maggiori dettagli",

View file

@ -615,7 +615,7 @@
"ManualImportSelectMovie": "手動インポート-ムービーを選択",
"ManualImportSelectQuality": " 手動インポート-品質を選択",
"MappedNetworkDrivesWindowsService": "マップされたネットワークドライブは、Windowsサービスとして実行している場合は使用できません。詳細については、FAQを参照してください",
"MarkAsFailedMessageText": "'{0}'を失敗としてマークしてもよろしいですか?",
"MarkAsFailedConfirmation": "'{0}'を失敗としてマークしてもよろしいですか?",
"MassMovieSearch": "マスムービー検索",
"MaximumLimits": "最大制限",
"MaximumSize": "最大サイズ",

View file

@ -625,7 +625,7 @@
"ManualImportSelectMovie": "수동 가져오기 - 동영상 선택",
"ManualImportSelectQuality": " 수동 가져오기-품질 선택",
"MappedNetworkDrivesWindowsService": "윈도우 서비스로 실행할 때는 매핑 된 네트워크 드라이브를 사용할 수 없습니다, 상세 내용은 FAQ를 참조하세요.",
"MarkAsFailedMessageText": "'{0}'을(를) 실패한 것으로 표시 하시겠습니까?",
"MarkAsFailedConfirmation": "'{0}'을(를) 실패한 것으로 표시 하시겠습니까?",
"MassMovieSearch": "대량 영화 검색",
"MaximumLimits": "최대 한도",
"MaximumSize": "최대 크기",

View file

@ -608,7 +608,7 @@
"MovieIsMonitored": "Film wordt gemonitord",
"MovieExcludedFromAutomaticAdd": "Film Uitgesloten Van Automatisch Toevoegen",
"MovieAlreadyExcluded": "Film werd al Uitgesloten",
"MarkAsFailedMessageText": "Bent u zeker dat u '{0}' als mislukt wilt markeren?",
"MarkAsFailedConfirmation": "Bent u zeker dat u '{0}' als mislukt wilt markeren?",
"Manual": "Manueel",
"LogLevelTraceHelpTextWarning": "Trace log niveau moet enkel tijdelijk worden gebruikt",
"LastDuration": "Laatste Looptijd",

View file

@ -100,7 +100,7 @@
"KeyboardShortcuts": "Skróty klawiszowe",
"LinkHere": "tutaj",
"ManualImportSelectQuality": " Import ręczny - wybierz Jakość",
"MarkAsFailedMessageText": "Czy na pewno chcesz oznaczyć „{0}” jako nieudany?",
"MarkAsFailedConfirmation": "Czy na pewno chcesz oznaczyć „{0}” jako nieudany?",
"MinimumAvailability": "Minimalna dostępność",
"Months": "Miesięcy",
"PreferIndexerFlagsHelpText": "Nadaj priorytet wydaniom za pomocą specjalnych flag",

View file

@ -544,7 +544,7 @@
"MinutesNinety": "90 minutos: {0}",
"MinutesHundredTwenty": "120 minutos: {0}",
"MIA": "Desaparecidos",
"MarkAsFailedMessageText": "Tem a certeza que quer marcar \"{0}\" como falhado?",
"MarkAsFailedConfirmation": "Tem a certeza que quer marcar \"{0}\" como falhado?",
"MarkAsFailed": "Marcar como falhado",
"Manual": "Manual",
"LoadingMovieFilesFailed": "Falha no carregamento dos ficheiros do filme",

View file

@ -388,7 +388,7 @@
"Max": "Máx.",
"MassMovieSearch": "Pesquisar filmes em massa",
"MarkAsFailed": "Marcar como falha",
"MarkAsFailedMessageText": "Tem certeza que deseja marcar \"{0}\" como falhado?",
"MarkAsFailedConfirmation": "Tem certeza que deseja marcar \"{0}\" como falhado?",
"MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as [FAQ]({url}) para obter mais informações.",
"ManualImportSelectQuality": " Importação manual - Selecionar qualidade",
"ManualImportSelectMovie": "Importação manual - Selecionar filme",

View file

@ -735,7 +735,7 @@
"ManualImportSelectLanguage": "Import manual - Selectați limba",
"ManualImportSelectMovie": "Import manual - Selectați film",
"ManualImportSelectQuality": " Import manual - Selectați calitatea",
"MarkAsFailedMessageText": "Sigur doriți să marcați „{0}” ca eșuat?",
"MarkAsFailedConfirmation": "Sigur doriți să marcați „{0}” ca eșuat?",
"MaximumLimits": "Limite maxime",
"MaximumSize": "Dimensiune maximă",
"MegabytesPerMinute": "Megaocteți pe minut",

View file

@ -330,7 +330,7 @@
"LogLevel": "Уровень журналирования",
"LogLevelTraceHelpTextWarning": "Включение трассировки журнала должно быть временным",
"Manual": "Ручной",
"MarkAsFailedMessageText": "Вы уверены, что хотите отметить '{0}' как неудачный?",
"MarkAsFailedConfirmation": "Вы уверены, что хотите отметить '{0}' как неудачный?",
"CustomFilters": "Настраиваемые фильтры",
"CustomFormats": "Пользовательский формат",
"ConnectSettingsSummary": "Уведомления, подключения к серверам/проигрывателям и настраиваемые скрипты",

View file

@ -599,7 +599,7 @@
"InteractiveSearch": "Interaktiv sökning",
"LookingForReleaseProfiles1": "Letar du efter utgåvorsprofiler? Prova",
"ManualImportSelectQuality": " Manuell import - Välj kvalitet",
"MarkAsFailedMessageText": "Är du säker på att du vill markera \"{0}\" som misslyckad?",
"MarkAsFailedConfirmation": "Är du säker på att du vill markera \"{0}\" som misslyckad?",
"MinimumAgeHelpText": "Endast Usenet: Lägsta ålder i minuter av NZB innan de tas. Använd detta för att ge nya utgåvor tid att sprida sig till din usenet-leverantör.",
"RecyclingBinCleanupHelpText": "Ställ in på 0 för att inaktivera automatisk rensning",
"RemoveHelpTextWarning": "Om du tar bort tas nedladdningen och filen (filerna) bort från nedladdningsklienten.",

View file

@ -695,7 +695,7 @@
"Lowercase": "ตัวพิมพ์เล็ก",
"ManualImportSelectLanguage": "นำเข้าด้วยตนเอง - เลือกภาษา",
"ManualImportSelectQuality": " นำเข้าด้วยตนเอง - เลือกคุณภาพ",
"MarkAsFailedMessageText": "แน่ใจหรือไม่ว่าต้องการทำเครื่องหมาย \"{0}\" ว่าล้มเหลว",
"MarkAsFailedConfirmation": "แน่ใจหรือไม่ว่าต้องการทำเครื่องหมาย \"{0}\" ว่าล้มเหลว",
"MaximumLimits": "ขีด จำกัด สูงสุด",
"MaximumSize": "ขนาดสูงสุด",
"MegabytesPerMinute": "เมกะไบต์ต่อนาที",

View file

@ -801,7 +801,7 @@
"ManualImportSelectMovie": "Manuel İçe Aktar - Film Seç",
"ManualImportSelectQuality": " Manuel İçe Aktar - Kalite Seç",
"MappedNetworkDrivesWindowsService": "Windows Hizmeti olarak çalıştırıldığında eşlenen ağ sürücüleri kullanılamaz, daha fazla bilgi için [SSS]({url}) bölümüne bakın.",
"MarkAsFailedMessageText": "'{0}' başarısız olarak işaretlemek istediğinizden emin misiniz?",
"MarkAsFailedConfirmation": "'{0}' başarısız olarak işaretlemek istediğinizden emin misiniz?",
"MaximumLimits": "Maksimum Sınırlar",
"MaximumSize": "Maksimum Boyut",
"MegabytesPerMinute": "Dakika Başına Megabayt",

View file

@ -667,7 +667,7 @@
"ManualImportSetReleaseGroup": "Імпорт вручну - встановити групу випуску",
"MappedNetworkDrivesWindowsService": "Підключені мережеві диски недоступні під час роботи як служби Windows. Щоб отримати додаткову інформацію, перегляньте FAQ",
"MarkAsFailed": "Позначити як помилку",
"MarkAsFailedMessageText": "Ви впевнені, що бажаєте позначити \"{0}\" як невдале?",
"MarkAsFailedConfirmation": "Ви впевнені, що бажаєте позначити \"{0}\" як невдале?",
"MassMovieSearch": "Масовий пошук фільмів",
"Max": "Максимальний",
"MaximumSize": "Максимальний розмір",

View file

@ -92,7 +92,7 @@
"ManualImportSelectMovie": "Nhập thủ công - Chọn phim",
"ManualImportSelectQuality": " Nhập thủ công - Chọn chất lượng",
"MappedNetworkDrivesWindowsService": "Các ổ đĩa mạng được ánh xạ không khả dụng khi chạy dưới dạng Dịch vụ Windows. Vui lòng xem Câu hỏi thường gặp để biết thêm thông tin",
"MarkAsFailedMessageText": "Bạn có chắc chắn muốn đánh dấu '{0}' là không thành công không?",
"MarkAsFailedConfirmation": "Bạn có chắc chắn muốn đánh dấu '{0}' là không thành công không?",
"MassMovieSearch": "Tìm kiếm phim hàng loạt",
"MaximumLimits": "Giới hạn tối đa",
"MaximumSize": "Kích thước tối đa",

View file

@ -568,7 +568,7 @@
"MaximumSizeHelpText": "抓取发布资源的最大大小MB。设置为零则不限制",
"Max": "最大的",
"MassMovieSearch": "批量搜索电影",
"MarkAsFailedMessageText": "您确定要标记'{0}'为已失败?",
"MarkAsFailedConfirmation": "您确定要标记'{0}'为已失败?",
"ManualImportSelectQuality": " 手动导入 - 选择质量",
"ManualImportSelectMovie": "手动导入 - 选择电影",
"ManualImportSelectLanguage": "手动导入 - 选择语言",