1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2026-04-16 21:15:28 -04:00

Compare commits

...

46 Commits

Author SHA1 Message Date
Weblate
cf3d51bab2 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Casselluu <jack10193@163.com>
Co-authored-by: Gianmarco Novelli <rinogaetano94@live.it>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: MadaxDeLuXe <madaxdeluxe@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: infoaitek24 <info@aitekph.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: shimmyx <shimmygodx@gmail.com>
Co-authored-by: vfaergestad <vgf@hotmail.no>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-03-21 21:21:30 -07:00
Mark McDowall
dec3fc6889 Fixed: Don't add series from import list with no matched TVDB ID 2024-03-22 00:21:04 -04:00
Mark McDowall
40bac23698 New: Support parsing season number from season folder when importing
Closes #903
2024-03-21 21:20:49 -07:00
Mark McDowall
88de927435 Fixed: Plex Watchlist import list 2024-03-21 21:20:27 -07:00
Mark McDowall
29204c93a3 New: Parsing multi-episode file with two and three digit episode numbers
Closes #6631
2024-03-21 21:20:13 -07:00
Mark McDowall
c641733781 Fixed: Task progress messages in the UI
Closes #6632
2024-03-21 21:20:08 -07:00
Weblate
58de0310fd Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Gianmarco Novelli <rinogaetano94@live.it>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: MadaxDeLuXe <madaxdeluxe@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: infoaitek24 <info@aitekph.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: vfaergestad <vgf@hotmail.no>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translation: Servarr/Sonarr
2024-03-21 21:20:01 -07:00
Bogdan
172b1a82d1 Sort series by title in task name 2024-03-21 21:19:23 -07:00
Bogdan
e14568adef Ensure not allowed cursor is shown for disabled select inputs 2024-03-21 21:19:23 -07:00
Weblate
381ce61aef Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dennis Langthjem <dennis@langthjem.dk>
Co-authored-by: DimitriDR <dimitridroeck@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Ihor Mudryi <mudryy33@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/uk/
Translation: Servarr/Sonarr
2024-03-13 21:49:22 -07:00
Mark McDowall
9f705e4161 Fixed: Release push with only Magnet URL
Closes #6622
2024-03-13 21:47:50 -07:00
Mark McDowall
063dba22a8 Fixed: Disabled select option still selectable 2024-03-13 21:47:33 -07:00
Mark McDowall
6d552f2a60 New: Show Series title and season number after task name when applicable
Closes #6601
2024-03-13 21:47:22 -07:00
Mark McDowall
4d4d63921b Add notification for build success/failures 2024-03-14 00:47:01 -04:00
Alan Collins
6584d95331 New: Update Custom Format renaming token to allow excluding specific formats
Closes #6615
2024-03-14 00:46:33 -04:00
Bogdan
86034beccd Bump ImageSharp, Polly, DryIoc, STJson, WindowsServices 2024-03-13 21:44:23 -07:00
Mark McDowall
4aa56e3f91 Fixed: Parsing of some French and Spanish anime releases 2024-03-13 21:44:07 -07:00
Stevie Robinson
2ec071a5ec Update release profile download client warning 2024-03-09 23:54:21 -05:00
Alan Collins
d86aeb7472 New: Release Hash renaming token
Closes #6570
2024-03-09 23:54:06 -05:00
Alan Collins
48cb5d2271 New: 'Custom Format: Format Name' rename token 2024-03-09 23:53:02 -05:00
bakerboy448
a0329adeba Improve single file detected as full season messaging 2024-03-09 23:51:29 -05:00
Bogdan
89bef4af99 New: Wider modal for Interactive Search and Manual Import 2024-03-09 23:50:45 -05:00
Mark McDowall
a12cdb34bc Fixed: Error sending Manual Interaction Required notification 2024-03-07 18:11:36 -08:00
Bogdan
13e29bd257 Prevent NullRef in naming when truncating a null Release Group 2024-03-07 18:11:28 -08:00
Sonarr
61a7515041 Automated API Docs update
ignore-downstream
2024-03-07 17:34:04 -08:00
Weblate
2c25245860 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: Mark Martines <mark-martines@hotmail.com>
Co-authored-by: Maxence Winandy <maxence.winandy@gmail.com>
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: linkin931 <931linkin@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-03-07 17:30:56 -08:00
Bogdan
18aadb544e Fixed: Maintain release type for items in Manual Import 2024-03-07 20:30:20 -05:00
Helvio Pedreschi
c7dd7abf89 Fixed: WebApp functionality on Apple devices 2024-03-07 20:29:50 -05:00
CheAle14
d0e9504af0 Fix import list exclusion props 2024-03-07 17:26:29 -08:00
Bogdan
e81bb3b993 Persist page size for Import List Exclusions 2024-03-07 17:25:27 -08:00
Bogdan
f211433b77 Remove debugger from metadata source and rearrange some imports 2024-03-07 17:25:19 -08:00
Bogdan
2068c5393e Fixed: URL Base setting for Kodi connections 2024-03-07 17:25:19 -08:00
Mark McDowall
0183812cc5 Fixed: Overly aggressive exception release group parsing
Closes #6591
2024-03-07 17:25:10 -08:00
Bogdan
7f09903a06 New: Episode Requested filter for Interactive Search 2024-03-02 21:26:23 -08:00
Mark McDowall
fa4c11a943 New: Do not automatically unmonitor episodes renamed outside of Sonarr
Closes #6584
2024-03-02 21:23:27 -08:00
Sonarr
653963a247 Automated API Docs update
ignore-downstream
2024-03-02 21:22:27 -08:00
Mark McDowall
32c32e2f88 Fixed: Issue extracting subtitle information for unknown episodes 2024-03-02 21:22:15 -08:00
nopoz
07bd159436 New: Add download directory & move completed for Deluge
Closes #4575
2024-03-03 00:22:03 -05:00
Mark McDowall
20273b07ad Properly type validation errors/warnings 2024-03-02 21:21:24 -08:00
bakerboy448
e5f19f01fa Update AddSeries Messaging and Logging 2024-03-03 00:21:16 -05:00
Louis R
13af6f5779 Fixed: Don't disable IPv6 in IPv6-only Environment
Closes #6545
2024-03-03 00:20:36 -05:00
Mark McDowall
71c2c0570b Renamed SeasonPackSpecification to ReleaseTypeSpecification 2024-03-03 00:19:44 -05:00
Mark McDowall
64c6a8879b Queue Manual Import commands at high priority 2024-03-02 21:19:26 -08:00
Weblate
7f061a9583 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Nicolò Castagnola <nipica@outlook.it>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-03-02 21:19:17 -08:00
The Dark
4285691064 New: Import list exclusion pagination
Closes #6079
2024-03-03 00:19:02 -05:00
Sonarr
de9899c60e Automated API Docs update
ignore-downstream
2024-03-01 17:33:41 -08:00
141 changed files with 3481 additions and 1629 deletions

View File

@@ -121,7 +121,7 @@ jobs:
run: yarn lint
- name: Stylelint
run: yarn stylelint
run: yarn stylelint -f github
- name: Build
run: yarn build --env production
@@ -225,3 +225,25 @@ jobs:
branch: ${{ github.ref_name }}
major_version: ${{ needs.backend.outputs.major_version }}
version: ${{ needs.backend.outputs.version }}
notify:
name: Discord Notification
needs: [backend, unit_test, unit_test_postgres, integration_test]
if: ${{ !cancelled() && (github.ref_name == 'develop' || github.ref_name == 'main') }}
env:
STATUS: ${{ contains(needs.*.result, 'failure') && 'failure' || 'success' }}
runs-on: ubuntu-latest
steps:
- name: Notify
uses: tsickert/discord-webhook@v5.3.0
with:
webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
username: 'GitHub Actions'
avatar-url: 'https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png'
embed-title: "${{ github.workflow }}: ${{ env.STATUS == 'success' && 'Success' || 'Failure' }}"
embed-url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
embed-description: |
**Branch** ${{ github.ref }}
**Build** ${{ needs.backend.outputs.version }}
embed-color: ${{ env.STATUS == 'success' && '3066993' || '15158332' }}

View File

@@ -19,6 +19,7 @@ export interface AppSectionSaveState {
export interface PagedAppSectionState {
pageSize: number;
totalRecords?: number;
}
export interface AppSectionFilterState<T> {
@@ -38,6 +39,7 @@ export interface AppSectionItemState<T> {
isFetching: boolean;
isPopulated: boolean;
error: Error;
pendingChanges: Partial<T>;
item: T;
}

View File

@@ -3,10 +3,12 @@ import AppSectionState, {
AppSectionItemState,
AppSectionSaveState,
AppSectionSchemaState,
PagedAppSectionState,
} from 'App/State/AppSectionState';
import Language from 'Language/Language';
import DownloadClient from 'typings/DownloadClient';
import ImportList from 'typings/ImportList';
import ImportListExclusion from 'typings/ImportListExclusion';
import ImportListOptionsSettings from 'typings/ImportListOptionsSettings';
import Indexer from 'typings/Indexer';
import IndexerFlag from 'typings/IndexerFlag';
@@ -41,6 +43,14 @@ export interface ImportListOptionsSettingsAppState
extends AppSectionItemState<ImportListOptionsSettings>,
AppSectionSaveState {}
export interface ImportListExclusionsSettingsAppState
extends AppSectionState<ImportListExclusion>,
AppSectionSaveState,
PagedAppSectionState,
AppSectionDeleteState {
pendingChanges: Partial<ImportListExclusion>;
}
export type IndexerFlagSettingsAppState = AppSectionState<IndexerFlag>;
export type LanguageSettingsAppState = AppSectionState<Language>;
export type UiSettingsAppState = AppSectionItemState<UiSettings>;
@@ -48,6 +58,7 @@ export type UiSettingsAppState = AppSectionItemState<UiSettings>;
interface SettingsAppState {
advancedSettings: boolean;
downloadClients: DownloadClientAppState;
importListExclusions: ImportListExclusionsSettingsAppState;
importListOptions: ImportListOptionsSettingsAppState;
importLists: ImportListAppState;
indexerFlags: IndexerFlagSettingsAppState;

View File

@@ -13,6 +13,8 @@ export interface CommandBody {
trigger: string;
suppressMessages: boolean;
seriesId?: number;
seriesIds?: number[];
seasonNumber?: number;
}
interface Command extends ModelBase {

View File

@@ -19,7 +19,7 @@
.isDisabled {
opacity: 0.7;
cursor: not-allowed;
cursor: not-allowed !important;
}
.dropdownArrowContainer {

View File

@@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react';
import monitorOptions from 'Utilities/Series/monitorOptions';
import translate from 'Utilities/String/translate';
import SelectInput from './SelectInput';
import EnhancedSelectInput from './EnhancedSelectInput';
function MonitorEpisodesSelectInput(props) {
const {
@@ -19,7 +19,7 @@ function MonitorEpisodesSelectInput(props) {
get value() {
return translate('NoChange');
},
disabled: true
isDisabled: true
});
}
@@ -29,12 +29,12 @@ function MonitorEpisodesSelectInput(props) {
get value() {
return `(${translate('Mixed')})`;
},
disabled: true
isDisabled: true
});
}
return (
<SelectInput
<EnhancedSelectInput
values={values}
{...otherProps}
/>

View File

@@ -1,7 +1,7 @@
import PropTypes from 'prop-types';
import React from 'react';
import monitorNewItemsOptions from 'Utilities/Series/monitorNewItemsOptions';
import SelectInput from './SelectInput';
import EnhancedSelectInput from './EnhancedSelectInput';
function MonitorNewItemsSelectInput(props) {
const {
@@ -16,7 +16,7 @@ function MonitorNewItemsSelectInput(props) {
values.unshift({
key: 'noChange',
value: 'No Change',
disabled: true
isDisabled: true
});
}
@@ -24,12 +24,12 @@ function MonitorNewItemsSelectInput(props) {
values.unshift({
key: 'mixed',
value: '(Mixed)',
disabled: true
isDisabled: true
});
}
return (
<SelectInput
<EnhancedSelectInput
values={values}
{...otherProps}
/>

View File

@@ -28,7 +28,7 @@ function createMapStateToProps() {
get value() {
return translate('NoChange');
},
disabled: includeNoChangeDisabled
isDisabled: includeNoChangeDisabled
});
}
@@ -38,7 +38,7 @@ function createMapStateToProps() {
get value() {
return `(${translate('Mixed')})`;
},
disabled: true
isDisabled: true
});
}

View File

@@ -15,7 +15,7 @@ interface ISeriesTypeOption {
key: string;
value: string;
format?: string;
disabled?: boolean;
isDisabled?: boolean;
}
const seriesTypeOptions: ISeriesTypeOption[] = [
@@ -55,7 +55,7 @@ function SeriesTypeSelectInput(props: SeriesTypeSelectInputProps) {
values.unshift({
key: 'noChange',
value: translate('NoChange'),
disabled: includeNoChangeDisabled,
isDisabled: includeNoChangeDisabled,
});
}
@@ -63,7 +63,7 @@ function SeriesTypeSelectInput(props: SeriesTypeSelectInputProps) {
values.unshift({
key: 'mixed',
value: `(${translate('Mixed')})`,
disabled: true,
isDisabled: true,
});
}

View File

@@ -63,6 +63,13 @@
width: 1280px;
}
.extraExtraLarge {
composes: modal;
width: 1600px;
}
@media only screen and (max-width: $breakpointExtraLarge) {
.modal.extraLarge {
width: 90%;
@@ -90,7 +97,8 @@
.modal.small,
.modal.medium,
.modal.large,
.modal.extraLarge {
.modal.extraLarge,
.modal.extraExtraLarge {
max-height: 100%;
width: 100%;
height: 100% !important;

View File

@@ -1,6 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'extraExtraLarge': string;
'extraLarge': string;
'large': string;
'medium': string;

View File

@@ -37,7 +37,7 @@ class EpisodeDetailsModal extends Component {
return (
<Modal
isOpen={isOpen}
size={sizes.EXTRA_LARGE}
size={sizes.EXTRA_EXTRA_LARGE}
closeOnBackgroundClick={this.state.closeOnBackgroundClick}
onModalClose={onModalClose}
>

View File

@@ -0,0 +1,17 @@
import { useCallback, useState } from 'react';
export default function useModalOpenState(
initialState: boolean
): [boolean, () => void, () => void] {
const [isOpen, setOpen] = useState(initialState);
const setModalOpen = useCallback(() => {
setOpen(true);
}, [setOpen]);
const setModalClosed = useCallback(() => {
setOpen(false);
}, [setOpen]);
return [isOpen, setModalOpen, setModalClosed];
}

View File

@@ -3,5 +3,5 @@ export const SMALL = 'small';
export const MEDIUM = 'medium';
export const LARGE = 'large';
export const EXTRA_LARGE = 'extraLarge';
export const all = [EXTRA_SMALL, SMALL, MEDIUM, LARGE, EXTRA_LARGE];
export const EXTRA_EXTRA_LARGE = 'extraExtraLarge';
export const all = [EXTRA_SMALL, SMALL, MEDIUM, LARGE, EXTRA_LARGE, EXTRA_EXTRA_LARGE];

View File

@@ -1,5 +1,6 @@
import ModelBase from 'App/ModelBase';
import Episode from 'Episode/Episode';
import ReleaseType from 'InteractiveImport/ReleaseType';
import Language from 'Language/Language';
import { QualityModel } from 'Quality/Quality';
import Series from 'Series/Series';
@@ -33,6 +34,7 @@ interface InteractiveImport extends ModelBase {
qualityWeight: number;
customFormats: object[];
indexerFlags: number;
releaseType: ReleaseType;
rejections: Rejection[];
episodeFileId?: number;
}

View File

@@ -47,7 +47,7 @@ function InteractiveImportModal(props: InteractiveImportModalProps) {
return (
<Modal
isOpen={isOpen}
size={sizes.EXTRA_LARGE}
size={sizes.EXTRA_EXTRA_LARGE}
closeOnBackgroundClick={false}
onModalClose={onModalClose}
>

View File

@@ -0,0 +1,3 @@
type ReleaseType = 'unknown' | 'singleEpisode' | 'multiEpisode' | 'seasonPack';
export default ReleaseType;

View File

@@ -36,7 +36,7 @@ const monitoredOptions = [
get value() {
return translate('NoChange');
},
disabled: true,
isDisabled: true,
},
{
key: 'monitored',
@@ -58,7 +58,7 @@ const seasonFolderOptions = [
get value() {
return translate('NoChange');
},
disabled: true,
isDisabled: true,
},
{
key: 'yes',

View File

@@ -15,7 +15,7 @@ function SeasonInteractiveSearchModal(props) {
return (
<Modal
isOpen={isOpen}
size={sizes.EXTRA_LARGE}
size={sizes.EXTRA_EXTRA_LARGE}
closeOnBackgroundClick={false}
onModalClose={onModalClose}
>

View File

@@ -32,7 +32,7 @@ const enableOptions = [
get value() {
return translate('NoChange');
},
disabled: true,
isDisabled: true,
},
{
key: 'enabled',

View File

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

View File

@@ -0,0 +1,41 @@
import React, { useCallback } from 'react';
import { useDispatch } from 'react-redux';
import Modal from 'Components/Modal/Modal';
import { sizes } from 'Helpers/Props';
import { clearPendingChanges } from 'Store/Actions/baseActions';
import EditImportListExclusionModalContent from './EditImportListExclusionModalContent';
interface EditImportListExclusionModalProps {
id?: number;
isOpen: boolean;
onModalClose: () => void;
onDeleteImportListExclusionPress?: () => void;
}
function EditImportListExclusionModal(
props: EditImportListExclusionModalProps
) {
const { isOpen, onModalClose, ...otherProps } = props;
const dispatch = useDispatch();
const onModalClosePress = useCallback(() => {
dispatch(
clearPendingChanges({
section: 'settings.importListExclusions',
})
);
onModalClose();
}, [dispatch, onModalClose]);
return (
<Modal size={sizes.MEDIUM} isOpen={isOpen} onModalClose={onModalClosePress}>
<EditImportListExclusionModalContent
{...otherProps}
onModalClose={onModalClose}
/>
</Modal>
);
}
export default EditImportListExclusionModal;

View File

@@ -1,43 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { clearPendingChanges } from 'Store/Actions/baseActions';
import EditImportListExclusionModal from './EditImportListExclusionModal';
function mapStateToProps() {
return {};
}
const mapDispatchToProps = {
clearPendingChanges
};
class EditImportListExclusionModalConnector extends Component {
//
// Listeners
onModalClose = () => {
this.props.clearPendingChanges({ section: 'settings.importListExclusions' });
this.props.onModalClose();
};
//
// Render
render() {
return (
<EditImportListExclusionModal
{...this.props}
onModalClose={this.onModalClose}
/>
);
}
}
EditImportListExclusionModalConnector.propTypes = {
onModalClose: PropTypes.func.isRequired,
clearPendingChanges: PropTypes.func.isRequired
};
export default connect(mapStateToProps, mapDispatchToProps)(EditImportListExclusionModalConnector);

View File

@@ -1,139 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import Alert from 'Components/Alert';
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 Button from 'Components/Link/Button';
import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton';
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 { inputTypes, kinds } from 'Helpers/Props';
import { numberSettingShape, stringSettingShape } from 'Helpers/Props/Shapes/settingShape';
import translate from 'Utilities/String/translate';
import styles from './EditImportListExclusionModalContent.css';
function EditImportListExclusionModalContent(props) {
const {
id,
isFetching,
error,
isSaving,
saveError,
item,
onInputChange,
onSavePress,
onModalClose,
onDeleteImportListExclusionPress,
...otherProps
} = props;
const {
title,
tvdbId
} = item;
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{id ? translate('EditImportListExclusion') : translate('AddImportListExclusion')}
</ModalHeader>
<ModalBody className={styles.body}>
{
isFetching &&
<LoadingIndicator />
}
{
!isFetching && !!error &&
<Alert kind={kinds.DANGER}>
{translate('AddImportListExclusionError')}
</Alert>
}
{
!isFetching && !error &&
<Form
{...otherProps}
>
<FormGroup>
<FormLabel>{translate('Title')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="title"
helpText={translate('SeriesTitleToExcludeHelpText')}
{...title}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('TvdbId')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="tvdbId"
helpText={translate('TvdbIdExcludeHelpText')}
{...tvdbId}
onChange={onInputChange}
/>
</FormGroup>
</Form>
}
</ModalBody>
<ModalFooter>
{
id &&
<Button
className={styles.deleteButton}
kind={kinds.DANGER}
onPress={onDeleteImportListExclusionPress}
>
{translate('Delete')}
</Button>
}
<Button
onPress={onModalClose}
>
{translate('Cancel')}
</Button>
<SpinnerErrorButton
isSpinning={isSaving}
error={saveError}
onPress={onSavePress}
>
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>
);
}
const ImportListExclusionShape = {
title: PropTypes.shape(stringSettingShape).isRequired,
tvdbId: PropTypes.shape(numberSettingShape).isRequired
};
EditImportListExclusionModalContent.propTypes = {
id: PropTypes.number,
isFetching: PropTypes.bool.isRequired,
error: PropTypes.object,
isSaving: PropTypes.bool.isRequired,
saveError: PropTypes.object,
item: PropTypes.shape(ImportListExclusionShape).isRequired,
onInputChange: PropTypes.func.isRequired,
onSavePress: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired,
onDeleteImportListExclusionPress: PropTypes.func
};
export default EditImportListExclusionModalContent;

View File

@@ -0,0 +1,188 @@
import React, { useCallback, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import Alert from 'Components/Alert';
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 Button from 'Components/Link/Button';
import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton';
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 usePrevious from 'Helpers/Hooks/usePrevious';
import { inputTypes, kinds } from 'Helpers/Props';
import {
saveImportListExclusion,
setImportListExclusionValue,
} from 'Store/Actions/settingsActions';
import selectSettings from 'Store/Selectors/selectSettings';
import ImportListExclusion from 'typings/ImportListExclusion';
import { PendingSection } from 'typings/pending';
import translate from 'Utilities/String/translate';
import styles from './EditImportListExclusionModalContent.css';
const newImportListExclusion = {
title: '',
tvdbId: 0,
};
interface EditImportListExclusionModalContentProps {
id?: number;
onModalClose: () => void;
onDeleteImportListExclusionPress?: () => void;
}
function createImportListExclusionSelector(id?: number) {
return createSelector(
(state: AppState) => state.settings.importListExclusions,
(importListExclusions) => {
const { isFetching, error, isSaving, saveError, pendingChanges, items } =
importListExclusions;
const mapping = id
? items.find((i) => i.id === id)
: newImportListExclusion;
const settings = selectSettings(mapping, pendingChanges, saveError);
return {
id,
isFetching,
error,
isSaving,
saveError,
item: settings.settings as PendingSection<ImportListExclusion>,
...settings,
};
}
);
}
function EditImportListExclusionModalContent(
props: EditImportListExclusionModalContentProps
) {
const { id, onModalClose, onDeleteImportListExclusionPress } = props;
const dispatch = useDispatch();
const dispatchSetImportListExclusionValue = (payload: {
name: string;
value: string | number;
}) => {
// @ts-expect-error 'setImportListExclusionValue' isn't typed yet
dispatch(setImportListExclusionValue(payload));
};
const { isFetching, isSaving, item, error, saveError, ...otherProps } =
useSelector(createImportListExclusionSelector(props.id));
const previousIsSaving = usePrevious(isSaving);
const { title, tvdbId } = item;
useEffect(() => {
if (!id) {
Object.keys(newImportListExclusion).forEach((name) => {
dispatchSetImportListExclusionValue({
name,
value:
newImportListExclusion[name as keyof typeof newImportListExclusion],
});
});
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
useEffect(() => {
if (previousIsSaving && !isSaving && !saveError) {
onModalClose();
}
});
const onSavePress = useCallback(() => {
dispatch(saveImportListExclusion({ id }));
}, [dispatch, id]);
const onInputChange = useCallback(
(payload: { name: string; value: string | number }) => {
// @ts-expect-error 'setImportListExclusionValue' isn't typed yet
dispatch(setImportListExclusionValue(payload));
},
[dispatch]
);
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{id
? translate('EditImportListExclusion')
: translate('AddImportListExclusion')}
</ModalHeader>
<ModalBody className={styles.body}>
{isFetching && <LoadingIndicator />}
{!isFetching && !!error && (
<Alert kind={kinds.DANGER}>
{translate('AddImportListExclusionError')}
</Alert>
)}
{!isFetching && !error && (
<Form {...otherProps}>
<FormGroup>
<FormLabel>{translate('Title')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="title"
helpText={translate('SeriesTitleToExcludeHelpText')}
{...title}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>{translate('TvdbId')}</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="tvdbId"
helpText={translate('TvdbIdExcludeHelpText')}
{...tvdbId}
onChange={onInputChange}
/>
</FormGroup>
</Form>
)}
</ModalBody>
<ModalFooter>
{id && (
<Button
className={styles.deleteButton}
kind={kinds.DANGER}
onPress={onDeleteImportListExclusionPress}
>
{translate('Delete')}
</Button>
)}
<Button onPress={onModalClose}>{translate('Cancel')}</Button>
<SpinnerErrorButton
isSpinning={isSaving}
error={saveError}
onPress={onSavePress}
>
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>
);
}
export default EditImportListExclusionModalContent;

View File

@@ -1,117 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { saveImportListExclusion, setImportListExclusionValue } from 'Store/Actions/settingsActions';
import selectSettings from 'Store/Selectors/selectSettings';
import EditImportListExclusionModalContent from './EditImportListExclusionModalContent';
const newImportListExclusion = {
title: '',
tvdbId: 0
};
function createImportListExclusionSelector() {
return createSelector(
(state, { id }) => id,
(state) => state.settings.importListExclusions,
(id, importListExclusions) => {
const {
isFetching,
error,
isSaving,
saveError,
pendingChanges,
items
} = importListExclusions;
const mapping = id ? items.find((i) => i.id === id) : newImportListExclusion;
const settings = selectSettings(mapping, pendingChanges, saveError);
return {
id,
isFetching,
error,
isSaving,
saveError,
item: settings.settings,
...settings
};
}
);
}
function createMapStateToProps() {
return createSelector(
createImportListExclusionSelector(),
(importListExclusion) => {
return {
...importListExclusion
};
}
);
}
const mapDispatchToProps = {
setImportListExclusionValue,
saveImportListExclusion
};
class EditImportListExclusionModalContentConnector extends Component {
//
// Lifecycle
componentDidMount() {
if (!this.props.id) {
Object.keys(newImportListExclusion).forEach((name) => {
this.props.setImportListExclusionValue({
name,
value: newImportListExclusion[name]
});
});
}
}
componentDidUpdate(prevProps, prevState) {
if (prevProps.isSaving && !this.props.isSaving && !this.props.saveError) {
this.props.onModalClose();
}
}
//
// Listeners
onInputChange = ({ name, value }) => {
this.props.setImportListExclusionValue({ name, value });
};
onSavePress = () => {
this.props.saveImportListExclusion({ id: this.props.id });
};
//
// Render
render() {
return (
<EditImportListExclusionModalContent
{...this.props}
onSavePress={this.onSavePress}
onInputChange={this.onInputChange}
/>
);
}
}
EditImportListExclusionModalContentConnector.propTypes = {
id: PropTypes.number,
isSaving: PropTypes.bool.isRequired,
saveError: PropTypes.object,
item: PropTypes.object.isRequired,
setImportListExclusionValue: PropTypes.func.isRequired,
saveImportListExclusion: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(EditImportListExclusionModalContentConnector);

View File

@@ -1,25 +0,0 @@
.importListExclusion {
display: flex;
align-items: stretch;
margin-bottom: 10px;
height: 30px;
border-bottom: 1px solid var(--borderColor);
line-height: 30px;
}
.title {
@add-mixin truncate;
flex: 0 1 600px;
}
.tvdbId {
flex: 0 0 70px;
}
.actions {
display: flex;
justify-content: flex-end;
flex: 1 0 auto;
padding-right: 10px;
}

View File

@@ -2,9 +2,6 @@
// Please do not change this file!
interface CssExports {
'actions': string;
'importListExclusion': string;
'title': string;
'tvdbId': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -1,112 +0,0 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import EditImportListExclusionModalConnector from './EditImportListExclusionModalConnector';
import styles from './ImportListExclusion.css';
class ImportListExclusion extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isEditImportListExclusionModalOpen: false,
isDeleteImportListExclusionModalOpen: false
};
}
//
// Listeners
onEditImportListExclusionPress = () => {
this.setState({ isEditImportListExclusionModalOpen: true });
};
onEditImportListExclusionModalClose = () => {
this.setState({ isEditImportListExclusionModalOpen: false });
};
onDeleteImportListExclusionPress = () => {
this.setState({
isEditImportListExclusionModalOpen: false,
isDeleteImportListExclusionModalOpen: true
});
};
onDeleteImportListExclusionModalClose = () => {
this.setState({ isDeleteImportListExclusionModalOpen: false });
};
onConfirmDeleteImportListExclusion = () => {
this.props.onConfirmDeleteImportListExclusion(this.props.id);
};
//
// Render
render() {
const {
id,
title,
tvdbId
} = this.props;
return (
<div
className={classNames(
styles.importListExclusion
)}
>
<div className={styles.title}>{title}</div>
<div className={styles.tvdbId}>{tvdbId}</div>
<div className={styles.actions}>
<Link
onPress={this.onEditImportListExclusionPress}
>
<Icon name={icons.EDIT} />
</Link>
</div>
<EditImportListExclusionModalConnector
id={id}
isOpen={this.state.isEditImportListExclusionModalOpen}
onModalClose={this.onEditImportListExclusionModalClose}
onDeleteImportListExclusionPress={this.onDeleteImportListExclusionPress}
/>
<ConfirmModal
isOpen={this.state.isDeleteImportListExclusionModalOpen}
kind={kinds.DANGER}
title={translate('DeleteImportListExclusion')}
message={translate('DeleteImportListExclusionMessageText')}
confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteImportListExclusion}
onCancel={this.onDeleteImportListExclusionModalClose}
/>
</div>
);
}
}
ImportListExclusion.propTypes = {
id: PropTypes.number.isRequired,
title: PropTypes.string.isRequired,
tvdbId: PropTypes.number.isRequired,
onConfirmDeleteImportListExclusion: PropTypes.func.isRequired
};
ImportListExclusion.defaultProps = {
// The drag preview will not connect the drag handle.
connectDragSource: (node) => node
};
export default ImportListExclusion;

View File

@@ -0,0 +1,6 @@
.actions {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 35px;
white-space: nowrap;
}

View File

@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'actions': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,68 @@
import React, { useCallback } from 'react';
import IconButton from 'Components/Link/IconButton';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import useModalOpenState from 'Helpers/Hooks/useModalOpenState';
import { icons, kinds } from 'Helpers/Props';
import ImportListExclusion from 'typings/ImportListExclusion';
import translate from 'Utilities/String/translate';
import EditImportListExclusionModal from './EditImportListExclusionModal';
import styles from './ImportListExclusionRow.css';
interface ImportListExclusionRowProps extends ImportListExclusion {
onConfirmDeleteImportListExclusion: (id: number) => void;
}
function ImportListExclusionRow(props: ImportListExclusionRowProps) {
const { id, title, tvdbId, onConfirmDeleteImportListExclusion } = props;
const [
isEditImportListExclusionModalOpen,
setEditImportListExclusionModalOpen,
setEditImportListExclusionModalClosed,
] = useModalOpenState(false);
const [
isDeleteImportListExclusionModalOpen,
setDeleteImportListExclusionModalOpen,
setDeleteImportListExclusionModalClosed,
] = useModalOpenState(false);
const onConfirmDeleteImportListExclusionPress = useCallback(() => {
onConfirmDeleteImportListExclusion(id);
}, [id, onConfirmDeleteImportListExclusion]);
return (
<TableRow>
<TableRowCell>{title}</TableRowCell>
<TableRowCell>{tvdbId}</TableRowCell>
<TableRowCell className={styles.actions}>
<IconButton
name={icons.EDIT}
onPress={setEditImportListExclusionModalOpen}
/>
</TableRowCell>
<EditImportListExclusionModal
id={id}
isOpen={isEditImportListExclusionModalOpen}
onModalClose={setEditImportListExclusionModalClosed}
onDeleteImportListExclusionPress={setDeleteImportListExclusionModalOpen}
/>
<ConfirmModal
isOpen={isDeleteImportListExclusionModalOpen}
kind={kinds.DANGER}
title={translate('DeleteImportListExclusion')}
message={translate('DeleteImportListExclusionMessageText')}
confirmLabel={translate('Delete')}
onConfirm={onConfirmDeleteImportListExclusionPress}
onCancel={setDeleteImportListExclusionModalClosed}
/>
</TableRow>
);
}
export default ImportListExclusionRow;

View File

@@ -1,23 +0,0 @@
.importListExclusionsHeader {
display: flex;
margin-bottom: 10px;
font-weight: bold;
}
.title {
flex: 0 1 600px;
}
.tvdbId {
flex: 0 0 70px;
}
.addImportListExclusion {
display: flex;
justify-content: flex-end;
padding-right: 10px;
}
.addButton {
text-align: center;
}

View File

@@ -3,9 +3,6 @@
interface CssExports {
'addButton': string;
'addImportListExclusion': string;
'importListExclusionsHeader': string;
'title': string;
'tvdbId': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -1,105 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import FieldSet from 'Components/FieldSet';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import PageSectionContent from 'Components/Page/PageSectionContent';
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import EditImportListExclusionModalConnector from './EditImportListExclusionModalConnector';
import ImportListExclusion from './ImportListExclusion';
import styles from './ImportListExclusions.css';
class ImportListExclusions extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isAddImportListExclusionModalOpen: false
};
}
//
// Listeners
onAddImportListExclusionPress = () => {
this.setState({ isAddImportListExclusionModalOpen: true });
};
onModalClose = () => {
this.setState({ isAddImportListExclusionModalOpen: false });
};
//
// Render
render() {
const {
items,
onConfirmDeleteImportListExclusion,
...otherProps
} = this.props;
return (
<FieldSet legend={translate('ImportListExclusions')}>
<PageSectionContent
errorMessage={translate('ImportListExclusionsLoadError')}
{...otherProps}
>
<div className={styles.importListExclusionsHeader}>
<div className={styles.title}>
{translate('Title')}
</div>
<div className={styles.tvdbId}>
{translate('TvdbId')}
</div>
</div>
<div>
{
items.map((item, index) => {
return (
<ImportListExclusion
key={item.id}
{...item}
{...otherProps}
index={index}
onConfirmDeleteImportListExclusion={onConfirmDeleteImportListExclusion}
/>
);
})
}
</div>
<div className={styles.addImportListExclusion}>
<Link
className={styles.addButton}
onPress={this.onAddImportListExclusionPress}
>
<Icon name={icons.ADD} />
</Link>
</div>
<EditImportListExclusionModalConnector
isOpen={this.state.isAddImportListExclusionModalOpen}
onModalClose={this.onModalClose}
/>
</PageSectionContent>
</FieldSet>
);
}
}
ImportListExclusions.propTypes = {
isFetching: PropTypes.bool.isRequired,
error: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
onConfirmDeleteImportListExclusion: PropTypes.func.isRequired
};
export default ImportListExclusions;

View File

@@ -0,0 +1,232 @@
import React, { useCallback, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useHistory } from 'react-router';
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import FieldSet from 'Components/FieldSet';
import IconButton from 'Components/Link/IconButton';
import PageSectionContent from 'Components/Page/PageSectionContent';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TablePager from 'Components/Table/TablePager';
import TableRow from 'Components/Table/TableRow';
import useModalOpenState from 'Helpers/Hooks/useModalOpenState';
import { icons } from 'Helpers/Props';
import * as importListExclusionActions from 'Store/Actions/Settings/importListExclusions';
import {
registerPagePopulator,
unregisterPagePopulator,
} from 'Utilities/pagePopulator';
import translate from 'Utilities/String/translate';
import EditImportListExclusionModal from './EditImportListExclusionModal';
import ImportListExclusionRow from './ImportListExclusionRow';
const COLUMNS = [
{
name: 'title',
label: () => translate('Title'),
isVisible: true,
isSortable: true,
},
{
name: 'tvdbid',
label: () => translate('TvdbId'),
isVisible: true,
isSortable: true,
},
{
name: 'actions',
isVisible: true,
isSortable: false,
},
];
function createImportListExlucionsSelector() {
return createSelector(
(state: AppState) => state.settings.importListExclusions,
(importListExclusions) => {
return {
...importListExclusions,
};
}
);
}
function ImportListExclusions() {
const history = useHistory();
const useCurrentPage = history.action === 'POP';
const dispatch = useDispatch();
const fetchImportListExclusions = useCallback(() => {
dispatch(importListExclusionActions.fetchImportListExclusions());
}, [dispatch]);
const deleteImportListExclusion = useCallback(
(payload: { id: number }) => {
dispatch(importListExclusionActions.deleteImportListExclusion(payload));
},
[dispatch]
);
const gotoImportListExclusionFirstPage = useCallback(() => {
dispatch(importListExclusionActions.gotoImportListExclusionFirstPage());
}, [dispatch]);
const gotoImportListExclusionPreviousPage = useCallback(() => {
dispatch(importListExclusionActions.gotoImportListExclusionPreviousPage());
}, [dispatch]);
const gotoImportListExclusionNextPage = useCallback(() => {
dispatch(importListExclusionActions.gotoImportListExclusionNextPage());
}, [dispatch]);
const gotoImportListExclusionLastPage = useCallback(() => {
dispatch(importListExclusionActions.gotoImportListExclusionLastPage());
}, [dispatch]);
const gotoImportListExclusionPage = useCallback(
(page: number) => {
dispatch(
importListExclusionActions.gotoImportListExclusionPage({ page })
);
},
[dispatch]
);
const setImportListExclusionSort = useCallback(
(sortKey: { sortKey: string }) => {
dispatch(
importListExclusionActions.setImportListExclusionSort({ sortKey })
);
},
[dispatch]
);
const setImportListTableOption = useCallback(
(payload: { pageSize: number }) => {
dispatch(
importListExclusionActions.setImportListExclusionTableOption(payload)
);
if (payload.pageSize) {
dispatch(importListExclusionActions.gotoImportListExclusionFirstPage());
}
},
[dispatch]
);
const repopulate = useCallback(() => {
gotoImportListExclusionFirstPage();
}, [gotoImportListExclusionFirstPage]);
useEffect(() => {
registerPagePopulator(repopulate);
if (useCurrentPage) {
fetchImportListExclusions();
} else {
gotoImportListExclusionFirstPage();
}
return () => unregisterPagePopulator(repopulate);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const onConfirmDeleteImportListExclusion = useCallback(
(id: number) => {
deleteImportListExclusion({ id });
repopulate();
},
[deleteImportListExclusion, repopulate]
);
const selected = useSelector(createImportListExlucionsSelector());
const {
isFetching,
isPopulated,
items,
pageSize,
sortKey,
error,
sortDirection,
totalRecords,
...otherProps
} = selected;
const [
isAddImportListExclusionModalOpen,
setAddImportListExclusionModalOpen,
setAddImportListExclusionModalClosed,
] = useModalOpenState(false);
const isFetchingForFirstTime = isFetching && !isPopulated;
return (
<FieldSet legend={translate('ImportListExclusions')}>
<PageSectionContent
errorMessage={translate('ImportListExclusionsLoadError')}
isFetching={isFetchingForFirstTime}
isPopulated={isPopulated}
error={error}
>
<Table
columns={COLUMNS}
canModifyColumns={false}
pageSize={pageSize}
sortKey={sortKey}
sortDirection={sortDirection}
onSortPress={setImportListExclusionSort}
onTableOptionChange={setImportListTableOption}
>
<TableBody>
{items.map((item) => {
return (
<ImportListExclusionRow
key={item.id}
{...item}
onConfirmDeleteImportListExclusion={
onConfirmDeleteImportListExclusion
}
/>
);
})}
<TableRow>
<TableRowCell />
<TableRowCell />
<TableRowCell>
<IconButton
name={icons.ADD}
onPress={setAddImportListExclusionModalOpen}
/>
</TableRowCell>
</TableRow>
</TableBody>
</Table>
<TablePager
totalRecords={totalRecords}
pageSize={pageSize}
isFetching={isFetching}
onFirstPagePress={gotoImportListExclusionFirstPage}
onPreviousPagePress={gotoImportListExclusionPreviousPage}
onNextPagePress={gotoImportListExclusionNextPage}
onLastPagePress={gotoImportListExclusionLastPage}
onPageSelect={gotoImportListExclusionPage}
{...otherProps}
/>
<EditImportListExclusionModal
isOpen={isAddImportListExclusionModalOpen}
onModalClose={setAddImportListExclusionModalClosed}
/>
</PageSectionContent>
</FieldSet>
);
}
export default ImportListExclusions;

View File

@@ -1,59 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { deleteImportListExclusion, fetchImportListExclusions } from 'Store/Actions/settingsActions';
import ImportListExclusions from './ImportListExclusions';
function createMapStateToProps() {
return createSelector(
(state) => state.settings.importListExclusions,
(importListExclusions) => {
return {
...importListExclusions
};
}
);
}
const mapDispatchToProps = {
fetchImportListExclusions,
deleteImportListExclusion
};
class ImportListExclusionsConnector extends Component {
//
// Lifecycle
componentDidMount() {
this.props.fetchImportListExclusions();
}
//
// Listeners
onConfirmDeleteImportListExclusion = (id) => {
this.props.deleteImportListExclusion({ id });
};
//
// Render
render() {
return (
<ImportListExclusions
{...this.state}
{...this.props}
onConfirmDeleteImportListExclusion={this.onConfirmDeleteImportListExclusion}
/>
);
}
}
ImportListExclusionsConnector.propTypes = {
fetchImportListExclusions: PropTypes.func.isRequired,
deleteImportListExclusion: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(ImportListExclusionsConnector);

View File

@@ -7,7 +7,7 @@ import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
import { icons } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import ImportListsExclusionsConnector from './ImportListExclusions/ImportListExclusionsConnector';
import ImportListsExclusions from './ImportListExclusions/ImportListExclusions';
import ImportListsConnector from './ImportLists/ImportListsConnector';
import ManageImportListsModal from './ImportLists/Manage/ManageImportListsModal';
import ImportListOptions from './Options/ImportListOptions';
@@ -113,7 +113,7 @@ class ImportListSettings extends Component {
onChildStateChange={this.onChildStateChange}
/>
<ImportListsExclusionsConnector />
<ImportListsExclusions />
<ManageImportListsModal
isOpen={isManageImportListsOpen}
onModalClose={this.onManageImportListsModalClose}

View File

@@ -31,7 +31,7 @@ const autoAddOptions = [
get value() {
return translate('NoChange');
},
disabled: true,
isDisabled: true,
},
{
key: 'enabled',

View File

@@ -32,7 +32,7 @@ const enableOptions = [
get value() {
return translate('NoChange');
},
disabled: true,
isDisabled: true,
},
{
key: 'enabled',

View File

@@ -150,7 +150,12 @@ const mediaInfoTokens = [
const otherTokens = [
{ token: '{Release Group}', example: 'Rls Grp' },
{ token: '{Custom Formats}', example: 'iNTERNAL' }
{ token: '{Custom Formats}', example: 'iNTERNAL' },
{ token: '{Custom Format:FormatName}', example: 'AMZN' }
];
const otherAnimeTokens = [
{ token: '{Release Hash}', example: 'ABCDEFGH' }
];
const originalTokens = [
@@ -534,6 +539,24 @@ class NamingModal extends Component {
}
)
}
{
anime && otherAnimeTokens.map(({ token, example }) => {
return (
<NamingOption
key={token}
name={name}
value={value}
token={token}
example={example}
tokenSeparator={tokenSeparator}
tokenCase={tokenCase}
onPress={this.onOptionPress}
/>
);
}
)
}
</div>
</FieldSet>

View File

@@ -26,7 +26,7 @@
.token {
flex: 0 0 50%;
padding: 6px 6px;
padding: 6px;
background-color: var(--popoverTitleBackgroundColor);
font-family: $monoSpaceFontFamily;
}
@@ -36,7 +36,7 @@
align-items: center;
justify-content: space-between;
flex: 0 0 50%;
padding: 6px 6px;
padding: 6px;
background-color: var(--popoverBodyBackgroundColor);
.footNote {

View File

@@ -4,7 +4,6 @@ import translate from 'Utilities/String/translate';
import styles from './TheTvdb.css';
function TheTvdb(props) {
debugger;
return (
<div className={styles.container}>
<img

View File

@@ -1,9 +1,11 @@
import { createAction } from 'redux-actions';
import createFetchHandler from 'Store/Actions/Creators/createFetchHandler';
import createRemoveItemHandler from 'Store/Actions/Creators/createRemoveItemHandler';
import createSaveProviderHandler from 'Store/Actions/Creators/createSaveProviderHandler';
import createServerSideCollectionHandlers from 'Store/Actions/Creators/createServerSideCollectionHandlers';
import createSetSettingValueReducer from 'Store/Actions/Creators/Reducers/createSetSettingValueReducer';
import { createThunk } from 'Store/thunks';
import createSetTableOptionReducer from 'Store/Actions/Creators/Reducers/createSetTableOptionReducer';
import { createThunk, handleThunks } from 'Store/thunks';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
//
// Variables
@@ -14,6 +16,13 @@ const section = 'settings.importListExclusions';
// Actions Types
export const FETCH_IMPORT_LIST_EXCLUSIONS = 'settings/importListExclusions/fetchImportListExclusions';
export const GOTO_FIRST_IMPORT_LIST_EXCLUSION_PAGE = 'settings/importListExclusions/gotoImportListExclusionFirstPage';
export const GOTO_PREVIOUS_IMPORT_LIST_EXCLUSION_PAGE = 'settings/importListExclusions/gotoImportListExclusionPreviousPage';
export const GOTO_NEXT_IMPORT_LIST_EXCLUSION_PAGE = 'settings/importListExclusions/gotoImportListExclusionNextPage';
export const GOTO_LAST_IMPORT_LIST_EXCLUSION_PAGE = 'settings/importListExclusions/gotoImportListExclusionLastPage';
export const GOTO_IMPORT_LIST_EXCLUSION_PAGE = 'settings/importListExclusions/gotoImportListExclusionPage';
export const SET_IMPORT_LIST_EXCLUSION_SORT = 'settings/importListExclusions/setImportListExclusionSort';
export const SET_IMPORT_LIST_EXCLUSION_TABLE_OPTION = 'settings/importListExclusions/setImportListExclusionTableOption';
export const SAVE_IMPORT_LIST_EXCLUSION = 'settings/importListExclusions/saveImportListExclusion';
export const DELETE_IMPORT_LIST_EXCLUSION = 'settings/importListExclusions/deleteImportListExclusion';
export const SET_IMPORT_LIST_EXCLUSION_VALUE = 'settings/importListExclusions/setImportListExclusionValue';
@@ -22,9 +31,16 @@ export const SET_IMPORT_LIST_EXCLUSION_VALUE = 'settings/importListExclusions/se
// Action Creators
export const fetchImportListExclusions = createThunk(FETCH_IMPORT_LIST_EXCLUSIONS);
export const gotoImportListExclusionFirstPage = createThunk(GOTO_FIRST_IMPORT_LIST_EXCLUSION_PAGE);
export const gotoImportListExclusionPreviousPage = createThunk(GOTO_PREVIOUS_IMPORT_LIST_EXCLUSION_PAGE);
export const gotoImportListExclusionNextPage = createThunk(GOTO_NEXT_IMPORT_LIST_EXCLUSION_PAGE);
export const gotoImportListExclusionLastPage = createThunk(GOTO_LAST_IMPORT_LIST_EXCLUSION_PAGE);
export const gotoImportListExclusionPage = createThunk(GOTO_IMPORT_LIST_EXCLUSION_PAGE);
export const setImportListExclusionSort = createThunk(SET_IMPORT_LIST_EXCLUSION_SORT);
export const saveImportListExclusion = createThunk(SAVE_IMPORT_LIST_EXCLUSION);
export const deleteImportListExclusion = createThunk(DELETE_IMPORT_LIST_EXCLUSION);
export const setImportListExclusionTableOption = createAction(SET_IMPORT_LIST_EXCLUSION_TABLE_OPTION);
export const setImportListExclusionValue = createAction(SET_IMPORT_LIST_EXCLUSION_VALUE, (payload) => {
return {
section,
@@ -44,6 +60,7 @@ export default {
isFetching: false,
isPopulated: false,
error: null,
pageSize: 20,
items: [],
isSaving: false,
saveError: null,
@@ -53,17 +70,31 @@ export default {
//
// Action Handlers
actionHandlers: {
[FETCH_IMPORT_LIST_EXCLUSIONS]: createFetchHandler(section, '/importlistexclusion'),
actionHandlers: handleThunks({
...createServerSideCollectionHandlers(
section,
'/importlistexclusion/paged',
fetchImportListExclusions,
{
[serverSideCollectionHandlers.FETCH]: FETCH_IMPORT_LIST_EXCLUSIONS,
[serverSideCollectionHandlers.FIRST_PAGE]: GOTO_FIRST_IMPORT_LIST_EXCLUSION_PAGE,
[serverSideCollectionHandlers.PREVIOUS_PAGE]: GOTO_PREVIOUS_IMPORT_LIST_EXCLUSION_PAGE,
[serverSideCollectionHandlers.NEXT_PAGE]: GOTO_NEXT_IMPORT_LIST_EXCLUSION_PAGE,
[serverSideCollectionHandlers.LAST_PAGE]: GOTO_LAST_IMPORT_LIST_EXCLUSION_PAGE,
[serverSideCollectionHandlers.EXACT_PAGE]: GOTO_IMPORT_LIST_EXCLUSION_PAGE,
[serverSideCollectionHandlers.SORT]: SET_IMPORT_LIST_EXCLUSION_SORT
}
),
[SAVE_IMPORT_LIST_EXCLUSION]: createSaveProviderHandler(section, '/importlistexclusion'),
[DELETE_IMPORT_LIST_EXCLUSION]: createRemoveItemHandler(section, '/importlistexclusion')
},
}),
//
// Reducers
reducers: {
[SET_IMPORT_LIST_EXCLUSION_VALUE]: createSetSettingValueReducer(section)
[SET_IMPORT_LIST_EXCLUSION_VALUE]: createSetSettingValueReducer(section),
[SET_IMPORT_LIST_EXCLUSION_TABLE_OPTION]: createSetTableOptionReducer(section)
}
};

View File

@@ -163,6 +163,7 @@ export const actionHandlers = handleThunks({
languages: item.languages,
releaseGroup: item.releaseGroup,
indexerFlags: item.indexerFlags,
releaseType: item.releaseType,
downloadId: item.downloadId
};
});

View File

@@ -250,6 +250,12 @@ export const defaultState = {
label: () => translate('SeasonPack'),
type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL
},
{
name: 'episodeRequested',
label: () => translate('EpisodeRequested'),
type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL
}
],

View File

@@ -1,5 +1,4 @@
import { createAction } from 'redux-actions';
import indexerFlags from 'Store/Actions/Settings/indexerFlags';
import { handleThunks } from 'Store/thunks';
import createHandleActions from './Creators/createHandleActions';
import autoTaggings from './Settings/autoTaggings';
@@ -13,6 +12,7 @@ import general from './Settings/general';
import importListExclusions from './Settings/importListExclusions';
import importListOptions from './Settings/importListOptions';
import importLists from './Settings/importLists';
import indexerFlags from './Settings/indexerFlags';
import indexerOptions from './Settings/indexerOptions';
import indexers from './Settings/indexers';
import languages from './Settings/languages';
@@ -91,7 +91,8 @@ export const defaultState = {
};
export const persistState = [
'settings.advancedSettings'
'settings.advancedSettings',
'settings.importListExclusions.pageSize'
];
//

View File

@@ -0,0 +1,14 @@
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
function createMultiSeriesSelector(seriesIds: number[]) {
return createSelector(
(state: AppState) => state.series.itemMap,
(state: AppState) => state.series.items,
(itemMap, allSeries) => {
return seriesIds.map((seriesId) => allSeries[itemMap[seriesId]]);
}
);
}
export default createMultiSeriesSelector;

View File

@@ -1,45 +1,44 @@
import { createSelector } from 'reselect';
import AppSectionState, {
AppSectionItemState,
} from 'App/State/AppSectionState';
import { AppSectionItemState } from 'App/State/AppSectionState';
import AppState from 'App/State/AppState';
import SettingsAppState from 'App/State/SettingsAppState';
import selectSettings from 'Store/Selectors/selectSettings';
import { PendingSection } from 'typings/pending';
type SettingNames = keyof Omit<AppState['settings'], 'advancedSettings'>;
type GetSectionState<Name extends SettingNames> = AppState['settings'][Name];
type GetSettingsSectionItemType<Name extends SettingNames> =
GetSectionState<Name> extends AppSectionItemState<infer R>
? R
: GetSectionState<Name> extends AppSectionState<infer R>
? R
type SectionsWithItemNames = {
[K in keyof SettingsAppState]: SettingsAppState[K] extends AppSectionItemState<unknown>
? K
: never;
}[keyof SettingsAppState];
type AppStateWithPending<Name extends SettingNames> = {
item?: GetSettingsSectionItemType<Name>;
pendingChanges?: Partial<GetSettingsSectionItemType<Name>>;
saveError?: Error;
} & GetSectionState<Name>;
type GetSectionState<Name extends SectionsWithItemNames> =
SettingsAppState[Name];
type GetSettingsSectionItemType<Name extends SectionsWithItemNames> =
GetSectionState<Name> extends AppSectionItemState<infer R> ? R : never;
function createSettingsSectionSelector<Name extends SettingNames>(
section: Name
) {
function createSettingsSectionSelector<
Name extends SectionsWithItemNames,
T extends GetSettingsSectionItemType<Name>
>(section: Name) {
return createSelector(
(state: AppState) => state.settings[section],
(sectionSettings) => {
const { item, pendingChanges, saveError, ...other } =
sectionSettings as AppStateWithPending<Name>;
const { item, pendingChanges, ...other } = sectionSettings;
const { settings, ...rest } = selectSettings(
item,
pendingChanges,
saveError
);
const saveError =
'saveError' in sectionSettings ? sectionSettings.saveError : undefined;
const {
settings,
pendingChanges: selectedPendingChanges,
...rest
} = selectSettings(item, pendingChanges, saveError);
return {
...other,
saveError,
settings: settings as PendingSection<GetSettingsSectionItemType<Name>>,
settings: settings as PendingSection<T>,
pendingChanges: selectedPendingChanges as Partial<T>,
...rest,
};
}

View File

@@ -10,15 +10,6 @@
width: 100%;
}
.commandName {
display: inline-block;
min-width: 220px;
}
.userAgent {
color: #b0b0b0;
}
.queued,
.started,
.ended {

View File

@@ -2,14 +2,12 @@
// Please do not change this file!
interface CssExports {
'actions': string;
'commandName': string;
'duration': string;
'ended': string;
'queued': string;
'started': string;
'trigger': string;
'triggerContent': string;
'userAgent': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -1,279 +0,0 @@
import moment from 'moment';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Icon from 'Components/Icon';
import IconButton from 'Components/Link/IconButton';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import { icons, kinds } from 'Helpers/Props';
import formatDate from 'Utilities/Date/formatDate';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatTimeSpan from 'Utilities/Date/formatTimeSpan';
import titleCase from 'Utilities/String/titleCase';
import translate from 'Utilities/String/translate';
import styles from './QueuedTaskRow.css';
function getStatusIconProps(status, message) {
const title = titleCase(status);
switch (status) {
case 'queued':
return {
name: icons.PENDING,
title
};
case 'started':
return {
name: icons.REFRESH,
isSpinning: true,
title
};
case 'completed':
return {
name: icons.CHECK,
kind: kinds.SUCCESS,
title: message === 'Completed' ? title : `${title}: ${message}`
};
case 'failed':
return {
name: icons.FATAL,
kind: kinds.DANGER,
title: `${title}: ${message}`
};
default:
return {
name: icons.UNKNOWN,
title
};
}
}
function getFormattedDates(props) {
const {
queued,
started,
ended,
showRelativeDates,
shortDateFormat
} = props;
if (showRelativeDates) {
return {
queuedAt: moment(queued).fromNow(),
startedAt: started ? moment(started).fromNow() : '-',
endedAt: ended ? moment(ended).fromNow() : '-'
};
}
return {
queuedAt: formatDate(queued, shortDateFormat),
startedAt: started ? formatDate(started, shortDateFormat) : '-',
endedAt: ended ? formatDate(ended, shortDateFormat) : '-'
};
}
class QueuedTaskRow extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
...getFormattedDates(props),
isCancelConfirmModalOpen: false
};
this._updateTimeoutId = null;
}
componentDidMount() {
this.setUpdateTimer();
}
componentDidUpdate(prevProps) {
const {
queued,
started,
ended
} = this.props;
if (
queued !== prevProps.queued ||
started !== prevProps.started ||
ended !== prevProps.ended
) {
this.setState(getFormattedDates(this.props));
}
}
componentWillUnmount() {
if (this._updateTimeoutId) {
this._updateTimeoutId = clearTimeout(this._updateTimeoutId);
}
}
//
// Control
setUpdateTimer() {
this._updateTimeoutId = setTimeout(() => {
this.setState(getFormattedDates(this.props));
this.setUpdateTimer();
}, 30000);
}
//
// Listeners
onCancelPress = () => {
this.setState({
isCancelConfirmModalOpen: true
});
};
onAbortCancel = () => {
this.setState({
isCancelConfirmModalOpen: false
});
};
//
// Render
render() {
const {
trigger,
commandName,
queued,
started,
ended,
status,
duration,
message,
clientUserAgent,
longDateFormat,
timeFormat,
onCancelPress
} = this.props;
const {
queuedAt,
startedAt,
endedAt,
isCancelConfirmModalOpen
} = this.state;
let triggerIcon = icons.QUICK;
if (trigger === 'manual') {
triggerIcon = icons.INTERACTIVE;
} else if (trigger === 'scheduled') {
triggerIcon = icons.SCHEDULED;
}
return (
<TableRow>
<TableRowCell className={styles.trigger}>
<span className={styles.triggerContent}>
<Icon
name={triggerIcon}
title={titleCase(trigger)}
/>
<Icon
{...getStatusIconProps(status, message)}
/>
</span>
</TableRowCell>
<TableRowCell>
<span className={styles.commandName}>
{commandName}
</span>
{
clientUserAgent ?
<span className={styles.userAgent} title={translate('TaskUserAgentTooltip')}>
{translate('From')}: {clientUserAgent}
</span> :
null
}
</TableRowCell>
<TableRowCell
className={styles.queued}
title={formatDateTime(queued, longDateFormat, timeFormat)}
>
{queuedAt}
</TableRowCell>
<TableRowCell
className={styles.started}
title={formatDateTime(started, longDateFormat, timeFormat)}
>
{startedAt}
</TableRowCell>
<TableRowCell
className={styles.ended}
title={formatDateTime(ended, longDateFormat, timeFormat)}
>
{endedAt}
</TableRowCell>
<TableRowCell className={styles.duration}>
{formatTimeSpan(duration)}
</TableRowCell>
<TableRowCell
className={styles.actions}
>
{
status === 'queued' &&
<IconButton
title={translate('RemovedFromTaskQueue')}
name={icons.REMOVE}
onPress={this.onCancelPress}
/>
}
</TableRowCell>
<ConfirmModal
isOpen={isCancelConfirmModalOpen}
kind={kinds.DANGER}
title={translate('Cancel')}
message={translate('CancelPendingTask')}
confirmLabel={translate('YesCancel')}
cancelLabel={translate('NoLeaveIt')}
onConfirm={onCancelPress}
onCancel={this.onAbortCancel}
/>
</TableRow>
);
}
}
QueuedTaskRow.propTypes = {
trigger: PropTypes.string.isRequired,
commandName: PropTypes.string.isRequired,
queued: PropTypes.string.isRequired,
started: PropTypes.string,
ended: PropTypes.string,
status: PropTypes.string.isRequired,
duration: PropTypes.string,
message: PropTypes.string,
clientUserAgent: PropTypes.string,
showRelativeDates: PropTypes.bool.isRequired,
shortDateFormat: PropTypes.string.isRequired,
longDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired,
onCancelPress: PropTypes.func.isRequired
};
export default QueuedTaskRow;

View File

@@ -0,0 +1,238 @@
import moment from 'moment';
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { CommandBody } from 'Commands/Command';
import Icon from 'Components/Icon';
import IconButton from 'Components/Link/IconButton';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import useModalOpenState from 'Helpers/Hooks/useModalOpenState';
import { icons, kinds } from 'Helpers/Props';
import { cancelCommand } from 'Store/Actions/commandActions';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import formatDate from 'Utilities/Date/formatDate';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatTimeSpan from 'Utilities/Date/formatTimeSpan';
import titleCase from 'Utilities/String/titleCase';
import translate from 'Utilities/String/translate';
import QueuedTaskRowNameCell from './QueuedTaskRowNameCell';
import styles from './QueuedTaskRow.css';
function getStatusIconProps(status: string, message: string | undefined) {
const title = titleCase(status);
switch (status) {
case 'queued':
return {
name: icons.PENDING,
title,
};
case 'started':
return {
name: icons.REFRESH,
isSpinning: true,
title,
};
case 'completed':
return {
name: icons.CHECK,
kind: kinds.SUCCESS,
title: message === 'Completed' ? title : `${title}: ${message}`,
};
case 'failed':
return {
name: icons.FATAL,
kind: kinds.DANGER,
title: `${title}: ${message}`,
};
default:
return {
name: icons.UNKNOWN,
title,
};
}
}
function getFormattedDates(
queued: string,
started: string | undefined,
ended: string | undefined,
showRelativeDates: boolean,
shortDateFormat: string
) {
if (showRelativeDates) {
return {
queuedAt: moment(queued).fromNow(),
startedAt: started ? moment(started).fromNow() : '-',
endedAt: ended ? moment(ended).fromNow() : '-',
};
}
return {
queuedAt: formatDate(queued, shortDateFormat),
startedAt: started ? formatDate(started, shortDateFormat) : '-',
endedAt: ended ? formatDate(ended, shortDateFormat) : '-',
};
}
interface QueuedTimes {
queuedAt: string;
startedAt: string;
endedAt: string;
}
export interface QueuedTaskRowProps {
id: number;
trigger: string;
commandName: string;
queued: string;
started?: string;
ended?: string;
status: string;
duration?: string;
message?: string;
body: CommandBody;
clientUserAgent?: string;
}
export default function QueuedTaskRow(props: QueuedTaskRowProps) {
const {
id,
trigger,
commandName,
queued,
started,
ended,
status,
duration,
message,
body,
clientUserAgent,
} = props;
const dispatch = useDispatch();
const { longDateFormat, shortDateFormat, showRelativeDates, timeFormat } =
useSelector(createUISettingsSelector());
const updateTimeTimeoutId = useRef<ReturnType<typeof setTimeout> | null>(
null
);
const [times, setTimes] = useState<QueuedTimes>(
getFormattedDates(
queued,
started,
ended,
showRelativeDates,
shortDateFormat
)
);
const [
isCancelConfirmModalOpen,
openCancelConfirmModal,
closeCancelConfirmModal,
] = useModalOpenState(false);
const handleCancelPress = useCallback(() => {
dispatch(cancelCommand({ id }));
}, [id, dispatch]);
useEffect(() => {
updateTimeTimeoutId.current = setTimeout(() => {
setTimes(
getFormattedDates(
queued,
started,
ended,
showRelativeDates,
shortDateFormat
)
);
}, 30000);
return () => {
if (updateTimeTimeoutId.current) {
clearTimeout(updateTimeTimeoutId.current);
}
};
}, [queued, started, ended, showRelativeDates, shortDateFormat, setTimes]);
const { queuedAt, startedAt, endedAt } = times;
let triggerIcon = icons.QUICK;
if (trigger === 'manual') {
triggerIcon = icons.INTERACTIVE;
} else if (trigger === 'scheduled') {
triggerIcon = icons.SCHEDULED;
}
return (
<TableRow>
<TableRowCell className={styles.trigger}>
<span className={styles.triggerContent}>
<Icon name={triggerIcon} title={titleCase(trigger)} />
<Icon {...getStatusIconProps(status, message)} />
</span>
</TableRowCell>
<QueuedTaskRowNameCell
commandName={commandName}
body={body}
clientUserAgent={clientUserAgent}
/>
<TableRowCell
className={styles.queued}
title={formatDateTime(queued, longDateFormat, timeFormat)}
>
{queuedAt}
</TableRowCell>
<TableRowCell
className={styles.started}
title={formatDateTime(started, longDateFormat, timeFormat)}
>
{startedAt}
</TableRowCell>
<TableRowCell
className={styles.ended}
title={formatDateTime(ended, longDateFormat, timeFormat)}
>
{endedAt}
</TableRowCell>
<TableRowCell className={styles.duration}>
{formatTimeSpan(duration)}
</TableRowCell>
<TableRowCell className={styles.actions}>
{status === 'queued' && (
<IconButton
title={translate('RemovedFromTaskQueue')}
name={icons.REMOVE}
onPress={openCancelConfirmModal}
/>
)}
</TableRowCell>
<ConfirmModal
isOpen={isCancelConfirmModalOpen}
kind={kinds.DANGER}
title={translate('Cancel')}
message={translate('CancelPendingTask')}
confirmLabel={translate('YesCancel')}
cancelLabel={translate('NoLeaveIt')}
onConfirm={handleCancelPress}
onCancel={closeCancelConfirmModal}
/>
</TableRow>
);
}

View File

@@ -1,31 +0,0 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { cancelCommand } from 'Store/Actions/commandActions';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import QueuedTaskRow from './QueuedTaskRow';
function createMapStateToProps() {
return createSelector(
createUISettingsSelector(),
(uiSettings) => {
return {
showRelativeDates: uiSettings.showRelativeDates,
shortDateFormat: uiSettings.shortDateFormat,
longDateFormat: uiSettings.longDateFormat,
timeFormat: uiSettings.timeFormat
};
}
);
}
function createMapDispatchToProps(dispatch, props) {
return {
onCancelPress() {
dispatch(cancelCommand({
id: props.id
}));
}
};
}
export default connect(createMapStateToProps, createMapDispatchToProps)(QueuedTaskRow);

View File

@@ -0,0 +1,8 @@
.commandName {
display: inline-block;
min-width: 220px;
}
.userAgent {
color: #b0b0b0;
}

View File

@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'commandName': string;
'userAgent': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,57 @@
import React from 'react';
import { useSelector } from 'react-redux';
import { CommandBody } from 'Commands/Command';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import createMultiSeriesSelector from 'Store/Selectors/createMultiSeriesSelector';
import translate from 'Utilities/String/translate';
import styles from './QueuedTaskRowNameCell.css';
export interface QueuedTaskRowNameCellProps {
commandName: string;
body: CommandBody;
clientUserAgent?: string;
}
export default function QueuedTaskRowNameCell(
props: QueuedTaskRowNameCellProps
) {
const { commandName, body, clientUserAgent } = props;
const seriesIds = [...(body.seriesIds ?? [])];
if (body.seriesId) {
seriesIds.push(body.seriesId);
}
const series = useSelector(createMultiSeriesSelector(seriesIds));
const sortedSeries = series.sort((a, b) =>
a.sortTitle.localeCompare(b.sortTitle)
);
return (
<TableRowCell>
<span className={styles.commandName}>
{commandName}
{sortedSeries.length ? (
<span> - {sortedSeries.map((s) => s.title).join(', ')}</span>
) : null}
{body.seasonNumber ? (
<span>
{' '}
{translate('SeasonNumberToken', {
seasonNumber: body.seasonNumber,
})}
</span>
) : null}
</span>
{clientUserAgent ? (
<span
className={styles.userAgent}
title={translate('TaskUserAgentTooltip')}
>
{translate('From')}: {clientUserAgent}
</span>
) : null}
</TableRowCell>
);
}

View File

@@ -1,90 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import FieldSet from 'Components/FieldSet';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import translate from 'Utilities/String/translate';
import QueuedTaskRowConnector from './QueuedTaskRowConnector';
const columns = [
{
name: 'trigger',
label: '',
isVisible: true
},
{
name: 'commandName',
label: () => translate('Name'),
isVisible: true
},
{
name: 'queued',
label: () => translate('Queued'),
isVisible: true
},
{
name: 'started',
label: () => translate('Started'),
isVisible: true
},
{
name: 'ended',
label: () => translate('Ended'),
isVisible: true
},
{
name: 'duration',
label: () => translate('Duration'),
isVisible: true
},
{
name: 'actions',
isVisible: true
}
];
function QueuedTasks(props) {
const {
isFetching,
isPopulated,
items
} = props;
return (
<FieldSet legend={translate('Queue')}>
{
isFetching && !isPopulated &&
<LoadingIndicator />
}
{
isPopulated &&
<Table
columns={columns}
>
<TableBody>
{
items.map((item) => {
return (
<QueuedTaskRowConnector
key={item.id}
{...item}
/>
);
})
}
</TableBody>
</Table>
}
</FieldSet>
);
}
QueuedTasks.propTypes = {
isFetching: PropTypes.bool.isRequired,
isPopulated: PropTypes.bool.isRequired,
items: PropTypes.array.isRequired
};
export default QueuedTasks;

View File

@@ -0,0 +1,74 @@
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import AppState from 'App/State/AppState';
import FieldSet from 'Components/FieldSet';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { fetchCommands } from 'Store/Actions/commandActions';
import translate from 'Utilities/String/translate';
import QueuedTaskRow from './QueuedTaskRow';
const columns = [
{
name: 'trigger',
label: '',
isVisible: true,
},
{
name: 'commandName',
label: () => translate('Name'),
isVisible: true,
},
{
name: 'queued',
label: () => translate('Queued'),
isVisible: true,
},
{
name: 'started',
label: () => translate('Started'),
isVisible: true,
},
{
name: 'ended',
label: () => translate('Ended'),
isVisible: true,
},
{
name: 'duration',
label: () => translate('Duration'),
isVisible: true,
},
{
name: 'actions',
isVisible: true,
},
];
export default function QueuedTasks() {
const dispatch = useDispatch();
const { isFetching, isPopulated, items } = useSelector(
(state: AppState) => state.commands
);
useEffect(() => {
dispatch(fetchCommands());
}, [dispatch]);
return (
<FieldSet legend={translate('Queue')}>
{isFetching && !isPopulated && <LoadingIndicator />}
{isPopulated && (
<Table columns={columns}>
<TableBody>
{items.map((item) => {
return <QueuedTaskRow key={item.id} {...item} />;
})}
</TableBody>
</Table>
)}
</FieldSet>
);
}

View File

@@ -1,46 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { fetchCommands } from 'Store/Actions/commandActions';
import QueuedTasks from './QueuedTasks';
function createMapStateToProps() {
return createSelector(
(state) => state.commands,
(commands) => {
return commands;
}
);
}
const mapDispatchToProps = {
dispatchFetchCommands: fetchCommands
};
class QueuedTasksConnector extends Component {
//
// Lifecycle
componentDidMount() {
this.props.dispatchFetchCommands();
}
//
// Render
render() {
return (
<QueuedTasks
{...this.props}
/>
);
}
}
QueuedTasksConnector.propTypes = {
dispatchFetchCommands: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(QueuedTasksConnector);

View File

@@ -2,7 +2,7 @@ import React from 'react';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import translate from 'Utilities/String/translate';
import QueuedTasksConnector from './Queued/QueuedTasksConnector';
import QueuedTasks from './Queued/QueuedTasks';
import ScheduledTasksConnector from './Scheduled/ScheduledTasksConnector';
function Tasks() {
@@ -10,7 +10,7 @@ function Tasks() {
<PageContent title={translate('Tasks')}>
<PageContentBody>
<ScheduledTasksConnector />
<QueuedTasksConnector />
<QueuedTasks />
</PageContentBody>
</PageContent>
);

View File

@@ -3,13 +3,16 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- Chrome, Opera, and Firefox OS -->
<meta name="theme-color" content="#3a3f51" />
<!-- Windows Phone -->
<meta name="msapplication-navbutton-color" content="#3a3f51" />
<!-- Android/Apple Phone -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="format-detection" content="telephone=no">
<meta name="description" content="Sonarr" />

View File

@@ -3,13 +3,16 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- Chrome, Opera, and Firefox OS -->
<meta name="theme-color" content="#3a3f51" />
<!-- Windows Phone -->
<meta name="msapplication-navbutton-color" content="#3a3f51" />
<!-- Android/Apple Phone -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="format-detection" content="telephone=no">
<meta name="description" content="Sonarr" />

View File

@@ -0,0 +1,6 @@
import ModelBase from 'App/ModelBase';
export default interface ImportListExclusion extends ModelBase {
tvdbId: number;
title: string;
}

View File

@@ -1,7 +1,21 @@
export interface ValidationFailure {
propertyName: string;
errorMessage: string;
severity: 'error' | 'warning';
}
export interface ValidationError extends ValidationFailure {
isWarning: false;
}
export interface ValidationWarning extends ValidationFailure {
isWarning: true;
}
export interface Pending<T> {
value: T;
errors: any[];
warnings: any[];
errors: ValidationError[];
warnings: ValidationWarning[];
}
export type PendingSection<T> = {

View File

@@ -10,7 +10,7 @@
"watch": "webpack --watch --config ./frontend/build/webpack.config.js",
"lint": "eslint --config frontend/.eslintrc.js --ignore-path frontend/.eslintignore frontend/",
"lint-fix": "yarn lint --fix",
"stylelint": "stylelint frontend/**/*.css --config frontend/.stylelintrc"
"stylelint": "stylelint \"frontend/**/*.css\" --config frontend/.stylelintrc"
},
"repository": "https://github.com/Sonarr/Sonarr",
"author": "Team Sonarr",

View File

@@ -1,7 +1,9 @@
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.NetworkInformation;
using System.Net.Security;
using System.Net.Sockets;
using System.Text;
@@ -247,6 +249,18 @@ namespace NzbDrone.Common.Http.Dispatchers
return _credentialCache.Get("credentialCache", () => new CredentialCache());
}
private static bool HasRoutableIPv4Address()
{
// Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
return networkInterfaces.Any(ni =>
ni.OperationalStatus == OperationalStatus.Up &&
ni.GetIPProperties().UnicastAddresses.Any(ip =>
ip.Address.AddressFamily == AddressFamily.InterNetwork &&
!IPAddress.IsLoopback(ip.Address)));
}
private static async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
{
// Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way.
@@ -270,10 +284,8 @@ namespace NzbDrone.Common.Http.Dispatchers
}
catch
{
// very naively fallback to ipv4 permanently for this execution based on the response of the first connection attempt.
// note that this may cause users to eventually get switched to ipv4 (on a random failure when they are switching networks, for instance)
// but in the interest of keeping this implementation simple, this is acceptable.
useIPv6 = false;
// Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections.
useIPv6 = !HasRoutableIPv4Address();
}
finally
{

View File

@@ -4,16 +4,16 @@
<DefineConstants Condition="'$(RuntimeIdentifier)' == 'linux-musl-x64' or '$(RuntimeIdentifier)' == 'linux-musl-arm64'">ISMUSL</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DryIoc.dll" Version="5.4.1" />
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NLog" Version="4.7.14" />
<PackageReference Include="NLog.Targets.Syslog" Version="6.0.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.7.4" />
<PackageReference Include="Sentry" Version="4.0.2" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="System.Text.Json" Version="6.0.8" />
<PackageReference Include="System.Text.Json" Version="6.0.9" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.1" />

View File

@@ -120,6 +120,17 @@ namespace NzbDrone.Core.Test.ImportListTests
private void WithImdbId()
{
_list1Series.First().ImdbId = "tt0496424";
Mocker.GetMock<ISearchForNewSeries>()
.Setup(s => s.SearchForNewSeriesByImdbId(_list1Series.First().ImdbId))
.Returns(
Builder<Series>
.CreateListOfSize(1)
.All()
.With(s => s.Title = "Breaking Bad")
.With(s => s.TvdbId = 81189)
.Build()
.ToList());
}
private void WithExistingSeries()
@@ -342,6 +353,7 @@ namespace NzbDrone.Core.Test.ImportListTests
public void should_add_new_series_from_single_list_to_library()
{
_importListFetch.Series.ForEach(m => m.ImportListId = 1);
WithTvdbId();
WithList(1, true);
WithCleanLevel(ListSyncLevelType.Disabled);
@@ -358,6 +370,7 @@ namespace NzbDrone.Core.Test.ImportListTests
_importListFetch.Series.ForEach(m => m.ImportListId = 1);
_importListFetch.Series.AddRange(_list2Series);
WithTvdbId();
WithList(1, true);
WithList(2, true);
@@ -376,6 +389,7 @@ namespace NzbDrone.Core.Test.ImportListTests
_importListFetch.Series.ForEach(m => m.ImportListId = 1);
_importListFetch.Series.AddRange(_list2Series);
WithTvdbId();
WithList(1, true);
WithList(2, false);
@@ -422,12 +436,17 @@ namespace NzbDrone.Core.Test.ImportListTests
public void should_search_by_imdb_if_series_title_and_series_imdb()
{
_importListFetch.Series.ForEach(m => m.ImportListId = 1);
WithList(1, true);
WithImdbId();
Subject.Execute(_commandAll);
Mocker.GetMock<ISearchForNewSeries>()
.Verify(v => v.SearchForNewSeriesByImdbId(It.IsAny<string>()), Times.Once());
Mocker.GetMock<IAddSeriesService>()
.Verify(v => v.AddSeries(It.Is<List<Series>>(t => t.Count == 1), It.IsAny<bool>()));
}
[Test]
@@ -498,5 +517,18 @@ namespace NzbDrone.Core.Test.ImportListTests
Mocker.GetMock<IImportListExclusionService>()
.Verify(v => v.All(), Times.Never);
}
[Test]
public void should_not_add_if_tvdbid_is_0()
{
_importListFetch.Series.ForEach(m => m.ImportListId = 1);
WithList(1, true);
WithExcludedSeries();
Subject.Execute(_commandAll);
Mocker.GetMock<IAddSeriesService>()
.Verify(v => v.AddSeries(It.Is<List<Series>>(t => t.Count == 0), It.IsAny<bool>()));
}
}
}

View File

@@ -0,0 +1,83 @@
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation.Aggregators;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Aggregation.Aggregators
{
[TestFixture]
public class AggregateReleaseHashFixture : CoreTest<AggregateReleaseHash>
{
private Series _series;
[SetUp]
public void Setup()
{
_series = Builder<Series>.CreateNew().Build();
}
[Test]
public void should_prefer_file()
{
var fileEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC) [ABCDEFGH]");
var folderEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 [12345678]");
var downloadClientEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC) [ABCD1234]");
var localEpisode = new LocalEpisode
{
FileEpisodeInfo = fileEpisodeInfo,
FolderEpisodeInfo = folderEpisodeInfo,
DownloadClientEpisodeInfo = downloadClientEpisodeInfo,
Path = @"C:\Test\Unsorted TV\Series.Title.S01\Series.Title.S01E01.mkv".AsOsAgnostic(),
Series = _series
};
Subject.Aggregate(localEpisode, null);
localEpisode.ReleaseHash.Should().Be("ABCDEFGH");
}
[Test]
public void should_fallback_to_downloadclient()
{
var fileEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC)");
var downloadClientEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC) [ABCD1234]");
var folderEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 [12345678]");
var localEpisode = new LocalEpisode
{
FileEpisodeInfo = fileEpisodeInfo,
FolderEpisodeInfo = folderEpisodeInfo,
DownloadClientEpisodeInfo = downloadClientEpisodeInfo,
Path = @"C:\Test\Unsorted TV\Series.Title.S01\Series.Title.S01E01.WEB-DL.mkv".AsOsAgnostic(),
Series = _series
};
Subject.Aggregate(localEpisode, null);
localEpisode.ReleaseHash.Should().Be("ABCD1234");
}
[Test]
public void should_fallback_to_folder()
{
var fileEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC)");
var downloadClientEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 (1280x720 10bit AAC)");
var folderEpisodeInfo = Parser.Parser.ParseTitle("[DHD] Series Title! - 08 [12345678]");
var localEpisode = new LocalEpisode
{
FileEpisodeInfo = fileEpisodeInfo,
FolderEpisodeInfo = folderEpisodeInfo,
DownloadClientEpisodeInfo = downloadClientEpisodeInfo,
Path = @"C:\Test\Unsorted TV\Series.Title.S01\Series.Title.S01E01.WEB-DL.mkv".AsOsAgnostic(),
Series = _series
};
Subject.Aggregate(localEpisode, null);
localEpisode.ReleaseHash.Should().Be("12345678");
}
}
}

View File

@@ -0,0 +1,146 @@
using System.Collections.Generic;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.CustomFormats;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Organizer;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
{
[TestFixture]
public class CustomFormatsFixture : CoreTest<FileNameBuilder>
{
private Series _series;
private Episode _episode1;
private EpisodeFile _episodeFile;
private NamingConfig _namingConfig;
private List<CustomFormat> _customFormats;
[SetUp]
public void Setup()
{
_series = Builder<Series>
.CreateNew()
.With(s => s.Title = "South Park")
.Build();
_namingConfig = NamingConfig.Default;
_namingConfig.RenameEpisodes = true;
Mocker.GetMock<INamingConfigService>()
.Setup(c => c.GetConfig()).Returns(_namingConfig);
_episode1 = Builder<Episode>.CreateNew()
.With(e => e.Title = "City Sushi")
.With(e => e.SeasonNumber = 15)
.With(e => e.EpisodeNumber = 6)
.With(e => e.AbsoluteEpisodeNumber = 100)
.Build();
_episodeFile = new EpisodeFile { Quality = new QualityModel(Quality.HDTV720p), ReleaseGroup = "SonarrTest" };
_customFormats = new List<CustomFormat>()
{
new CustomFormat()
{
Name = "INTERNAL",
IncludeCustomFormatWhenRenaming = true
},
new CustomFormat()
{
Name = "AMZN",
IncludeCustomFormatWhenRenaming = true
},
new CustomFormat()
{
Name = "NAME WITH SPACES",
IncludeCustomFormatWhenRenaming = true
},
new CustomFormat()
{
Name = "NotIncludedFormat",
IncludeCustomFormatWhenRenaming = false
}
};
Mocker.GetMock<IQualityDefinitionService>()
.Setup(v => v.Get(Moq.It.IsAny<Quality>()))
.Returns<Quality>(v => Quality.DefaultQualityDefinitions.First(c => c.Quality == v));
}
[TestCase("{Custom Formats}", "INTERNAL AMZN NAME WITH SPACES")]
public void should_replace_custom_formats(string format, string expected)
{
_namingConfig.StandardEpisodeFormat = format;
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile, customFormats: _customFormats)
.Should().Be(expected);
}
[TestCase("{Custom Formats}", "")]
public void should_replace_custom_formats_with_no_custom_formats(string format, string expected)
{
_namingConfig.StandardEpisodeFormat = format;
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile, customFormats: new List<CustomFormat>())
.Should().Be(expected);
}
[TestCase("{Custom Formats:-INTERNAL}", "AMZN NAME WITH SPACES")]
[TestCase("{Custom Formats:-NAME WITH SPACES}", "INTERNAL AMZN")]
[TestCase("{Custom Formats:-INTERNAL,NAME WITH SPACES}", "AMZN")]
[TestCase("{Custom Formats:INTERNAL}", "INTERNAL")]
[TestCase("{Custom Formats:NAME WITH SPACES}", "NAME WITH SPACES")]
[TestCase("{Custom Formats:INTERNAL,NAME WITH SPACES}", "INTERNAL NAME WITH SPACES")]
public void should_replace_custom_formats_with_filtered_names(string format, string expected)
{
_namingConfig.StandardEpisodeFormat = format;
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile, customFormats: _customFormats)
.Should().Be(expected);
}
[TestCase("{Custom Formats:-}", "{Custom Formats:-}")]
[TestCase("{Custom Formats:}", "{Custom Formats:}")]
public void should_not_replace_custom_formats_due_to_invalid_token(string format, string expected)
{
_namingConfig.StandardEpisodeFormat = format;
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile, customFormats: _customFormats)
.Should().Be(expected);
}
[TestCase("{Custom Format}", "")]
[TestCase("{Custom Format:INTERNAL}", "INTERNAL")]
[TestCase("{Custom Format:AMZN}", "AMZN")]
[TestCase("{Custom Format:NAME WITH SPACES}", "NAME WITH SPACES")]
[TestCase("{Custom Format:DOESNOTEXIST}", "")]
[TestCase("{Custom Format:INTERNAL} - {Custom Format:AMZN}", "INTERNAL - AMZN")]
[TestCase("{Custom Format:AMZN} - {Custom Format:INTERNAL}", "AMZN - INTERNAL")]
public void should_replace_custom_format(string format, string expected)
{
_namingConfig.StandardEpisodeFormat = format;
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile, customFormats: _customFormats)
.Should().Be(expected);
}
[TestCase("{Custom Format}", "")]
[TestCase("{Custom Format:INTERNAL}", "")]
[TestCase("{Custom Format:AMZN}", "")]
public void should_replace_custom_format_with_no_custom_formats(string format, string expected)
{
_namingConfig.StandardEpisodeFormat = format;
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile, customFormats: new List<CustomFormat>())
.Should().Be(expected);
}
}
}

View File

@@ -991,6 +991,28 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
result.Should().EndWith("HDR");
}
[Test]
public void should_replace_release_hash_with_stored_hash()
{
_namingConfig.StandardEpisodeFormat = "{Release Hash}";
_episodeFile.ReleaseHash = "ABCDEFGH";
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile)
.Should().Be("ABCDEFGH");
}
[Test]
public void should_replace_null_release_hash_with_empty_string()
{
_namingConfig.StandardEpisodeFormat = "{Release Hash}";
_episodeFile.ReleaseHash = null;
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile)
.Should().Be(string.Empty);
}
private void GivenMediaInfoModel(string videoCodec = "h264",
string audioCodec = "dts",
int audioChannels = 6,

View File

@@ -132,6 +132,8 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("[Naruto-Kun.Hu] Dr Series S3 - 21 [1080p]", "Dr Series S3", 21, 0, 0)]
[TestCase("[Naruto-Kun.Hu] Series Title - 12 [1080p].mkv", "Series Title", 12, 0, 0)]
[TestCase("[Naruto-Kun.Hu] Anime Triangle - 08 [1080p].mkv", "Anime Triangle", 8, 0, 0)]
[TestCase("[Mystic Z-Team] Series Title Super - Episode 013 VF - Non-censuré [720p].mp4", "Series Title Super", 13, 0, 0)]
[TestCase("Series Title Kai Episodio 13 Audio Latino", "Series Title Kai", 13, 0, 0)]
// [TestCase("", "", 0, 0, 0)]
public void should_parse_absolute_numbers(string postTitle, string title, int absoluteEpisodeNumber, int seasonNumber, int episodeNumber)

View File

@@ -22,12 +22,42 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("Series Title - 031 - The Resolution to Kill [Lunar].avi", "Lunar", "")]
[TestCase("[ACX]Series Title 01 Episode Name [Kosaka] [9C57891E].mkv", "ACX", "9C57891E")]
[TestCase("[S-T-D] Series Title! - 06 (1280x720 10bit AAC) [59B3F2EA].mkv", "S-T-D", "59B3F2EA")]
public void should_parse_absolute_numbers(string postTitle, string subGroup, string hash)
// These tests are dupes of the above, except with parenthesized hashes instead of square bracket
[TestCase("[SubDESU]_Show_Title_DxD_07_(1280x720_x264-AAC)_(6B7FD717)", "SubDESU", "6B7FD717")]
[TestCase("[Chihiro]_Show_Title!!_-_06_[848x480_H.264_AAC](859EEAFA)", "Chihiro", "859EEAFA")]
[TestCase("[Underwater]_Show_Title_-_12_(720p)_(5C7BC4F9)", "Underwater", "5C7BC4F9")]
[TestCase("[HorribleSubs]_Show_Title_-_33_[720p]", "HorribleSubs", "")]
[TestCase("[HorribleSubs] Show-Title - 13 [1080p].mkv", "HorribleSubs", "")]
[TestCase("[Doremi].Show.Title.5.Go.Go!.31.[1280x720].(C65D4B1F).mkv", "Doremi", "C65D4B1F")]
[TestCase("[Doremi].Show.Title.5.Go.Go!.31[1280x720].(C65D4B1F)", "Doremi", "C65D4B1F")]
[TestCase("[Doremi].Show.Title.5.Go.Go!.31.[1280x720].mkv", "Doremi", "")]
[TestCase("[K-F] Series Title 214", "K-F", "")]
[TestCase("[K-F] Series Title S10E14 214", "K-F", "")]
[TestCase("[K-F] Series Title 10x14 214", "K-F", "")]
[TestCase("[K-F] Series Title 214 10x14", "K-F", "")]
[TestCase("Series Title - 031 - The Resolution to Kill [Lunar].avi", "Lunar", "")]
[TestCase("[ACX]Series Title 01 Episode Name [Kosaka] (9C57891E).mkv", "ACX", "9C57891E")]
[TestCase("[S-T-D] Series Title! - 06 (1280x720 10bit AAC) (59B3F2EA).mkv", "S-T-D", "59B3F2EA")]
public void should_parse_releasegroup_and_hash(string postTitle, string subGroup, string hash)
{
var result = Parser.Parser.ParseTitle(postTitle);
result.Should().NotBeNull();
result.ReleaseGroup.Should().Be(subGroup);
result.ReleaseHash.Should().Be(hash);
}
[TestCase("[DHD] Series Title! - 08 (1280x720 10bit AAC) [8B00F2EA].mkv", "8B00F2EA")]
[TestCase("[DHD] Series Title! - 10 (1280x720 10bit AAC) [10BBF2EA].mkv", "10BBF2EA")]
[TestCase("[DHD] Series Title! - 08 (1280x720 10bit AAC) [008BF28B].mkv", "008BF28B")]
[TestCase("[DHD] Series Title! - 10 (1280x720 10bit AAC) [000BF10B].mkv", "000BF10B")]
[TestCase("[DHD] Series Title! - 08 (1280x720 8bit AAC) [8B8BF2EA].mkv", "8B8BF2EA")]
[TestCase("[DHD] Series Title! - 10 (1280x720 8bit AAC) [10B10BEA].mkv", "10B10BEA")]
public void should_parse_release_hashes_with_10b_or_8b(string postTitle, string hash)
{
var result = Parser.Parser.ParseTitle(postTitle);
result.Should().NotBeNull();
result.ReleaseHash.Should().Be(hash);
}
}
}

View File

@@ -77,6 +77,7 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("Series Title (S15E06-08) City Sushi", "Series Title", 15, new[] { 6, 7, 8 })]
[TestCase("Босх: Спадок (S2E1-4) / Series: Legacy (S2E1-4) (2023) WEB-DL 1080p Ukr/Eng | sub Eng", "Series: Legacy", 2, new[] { 1, 2, 3, 4 })]
[TestCase("Босх: Спадок / Series: Legacy / S2E1-4 of 10 (2023) WEB-DL 1080p Ukr/Eng | sub Eng", "Series: Legacy", 2, new[] { 1, 2, 3, 4 })]
[TestCase("Series Title - S26E96-97-98-99-100 - Episode 5931 + Episode 5932 + Episode 5933 + Episode 5934 + Episode 5935", "Series Title", 26, new[] { 96, 97, 98, 99, 100 })]
// [TestCase("", "", , new [] { })]
public void should_parse_multiple_episodes(string postTitle, string title, int season, int[] episodes)

View File

@@ -29,6 +29,8 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase(@"C:\Test\Series\Season 01\1 Pilot (1080p HD).mkv", 1, 1)]
[TestCase(@"C:\Test\Series\Season 1\02 Honor Thy Father (1080p HD).m4v", 1, 2)]
[TestCase(@"C:\Test\Series\Season 1\2 Honor Thy Developer (1080p HD).m4v", 1, 2)]
[TestCase(@"C:\Test\Series\Season 2 - Total Series Action\01. Total Series Action - Episode 1 - Monster Cash.mkv", 2, 1)]
[TestCase(@"C:\Test\Series\Season 2\01. Total Series Action - Episode 1 - Monster Cash.mkv", 2, 1)]
// [TestCase(@"C:\series.state.S02E04.720p.WEB-DL.DD5.1.H.264\73696S02-04.mkv", 2, 4)] //Gets treated as S01E04 (because it gets parsed as anime); 2020-01 broken test case: Expected result.EpisodeNumbers to contain 1 item(s), but found 0
public void should_parse_from_path(string path, int season, int episode)
@@ -45,6 +47,7 @@ namespace NzbDrone.Core.Test.ParserTests
}
[TestCase("01-03\\The Series Title (2010) - 1x01-02-03 - Episode Title HDTV-720p Proper", "The Series Title (2010)", 1, new[] { 1, 2, 3 })]
[TestCase("Season 2\\E05-06 - Episode Title HDTV-720p Proper", "", 2, new[] { 5, 6 })]
public void should_parse_multi_episode_from_path(string path, string title, int season, int[] episodes)
{
var result = Parser.Parser.ParsePath(path.AsOsAgnostic());

View File

@@ -44,6 +44,7 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("[Erai-raws] Series - 0955 ~ 1005 [1080p]", "Erai-raws")]
[TestCase("[Exiled-Destiny] Series Title", "Exiled-Destiny")]
[TestCase("Series.Title.S01E09.1080p.DSNP.WEB-DL.DDP2.0.H.264-VARYG", "VARYG")]
[TestCase("Stargate SG-1 (1997) - S01E01-02 - Children of the Gods (Showtime) (1080p.BD.DD5.1.x265-TheSickle[TAoE])", "TheSickle")]
// [TestCase("", "")]
public void should_parse_release_group(string title, string expected)

View File

@@ -1,9 +1,11 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using FizzWare.NBuilder;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Test.Framework;
@@ -14,14 +16,20 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeServiceTests
[TestFixture]
public class HandleEpisodeFileDeletedFixture : CoreTest<EpisodeService>
{
private Series _series;
private EpisodeFile _episodeFile;
private List<Episode> _episodes;
[SetUp]
public void Setup()
{
_series = Builder<Series>
.CreateNew()
.Build();
_episodeFile = Builder<EpisodeFile>
.CreateNew()
.With(e => e.SeriesId = _series.Id)
.Build();
}
@@ -30,6 +38,7 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeServiceTests
_episodes = Builder<Episode>
.CreateListOfSize(1)
.All()
.With(e => e.SeriesId = _series.Id)
.With(e => e.Monitored = true)
.Build()
.ToList();
@@ -44,6 +53,7 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeServiceTests
_episodes = Builder<Episode>
.CreateListOfSize(2)
.All()
.With(e => e.SeriesId = _series.Id)
.With(e => e.Monitored = true)
.Build()
.ToList();
@@ -85,9 +95,31 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeServiceTests
.Returns(true);
Subject.Handle(new EpisodeFileDeletedEvent(_episodeFile, DeleteMediaFileReason.MissingFromDisk));
Subject.HandleAsync(new SeriesScannedEvent(_series, new List<string>()));
Mocker.GetMock<IEpisodeRepository>()
.Verify(v => v.ClearFileId(It.IsAny<Episode>(), true), Times.Once());
.Verify(v => v.SetMonitored(It.IsAny<IEnumerable<int>>(), false), Times.Once());
}
[Test]
public void should_leave_monitored_if_autoUnmonitor_is_true_and_missing_episode_is_replaced()
{
GivenSingleEpisodeFile();
var newEpisodeFile = _episodeFile.JsonClone();
newEpisodeFile.Id = 123;
newEpisodeFile.Episodes = new LazyLoaded<List<Episode>>(_episodes);
Mocker.GetMock<IConfigService>()
.SetupGet(s => s.AutoUnmonitorPreviouslyDownloadedEpisodes)
.Returns(true);
Subject.Handle(new EpisodeFileDeletedEvent(_episodeFile, DeleteMediaFileReason.MissingFromDisk));
Subject.Handle(new EpisodeFileAddedEvent(newEpisodeFile));
Subject.HandleAsync(new SeriesScannedEvent(_series, new List<string>()));
Mocker.GetMock<IEpisodeRepository>()
.Verify(v => v.SetMonitored(It.IsAny<IEnumerable<int>>(), false), Times.Never());
}
[Test]

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Core.Datastore;

View File

@@ -6,7 +6,7 @@ using NzbDrone.Core.Validation;
namespace NzbDrone.Core.CustomFormats
{
public class SeasonPackSpecificationValidator : AbstractValidator<SeasonPackSpecification>
public class SeasonPackSpecificationValidator : AbstractValidator<ReleaseTypeSpecification>
{
public SeasonPackSpecificationValidator()
{
@@ -20,7 +20,7 @@ namespace NzbDrone.Core.CustomFormats
}
}
public class SeasonPackSpecification : CustomFormatSpecificationBase
public class ReleaseTypeSpecification : CustomFormatSpecificationBase
{
private static readonly SeasonPackSpecificationValidator Validator = new ();

View File

@@ -0,0 +1,76 @@
using System.Collections.Generic;
using System.Data;
using System.IO;
using Dapper;
using FluentMigrator;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore.Migration.Framework;
using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(204)]
public class add_add_release_hash : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Alter.Table("EpisodeFiles").AddColumn("ReleaseHash").AsString().Nullable();
Execute.WithConnection(UpdateEpisodeFiles);
}
private void UpdateEpisodeFiles(IDbConnection conn, IDbTransaction tran)
{
var updates = new List<object>();
using (var cmd = conn.CreateCommand())
{
cmd.Transaction = tran;
cmd.CommandText = "SELECT \"Id\", \"SceneName\", \"RelativePath\", \"OriginalFilePath\" FROM \"EpisodeFiles\"";
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
var id = reader.GetInt32(0);
var sceneName = reader[1] as string;
var relativePath = reader[2] as string;
var originalFilePath = reader[3] as string;
ParsedEpisodeInfo parsedEpisodeInfo = null;
var originalTitle = sceneName;
if (originalTitle.IsNullOrWhiteSpace() && originalFilePath.IsNotNullOrWhiteSpace())
{
originalTitle = Path.GetFileNameWithoutExtension(originalFilePath);
}
if (originalTitle.IsNotNullOrWhiteSpace())
{
parsedEpisodeInfo = Parser.Parser.ParseTitle(originalTitle);
}
if (parsedEpisodeInfo == null || parsedEpisodeInfo.ReleaseHash.IsNullOrWhiteSpace())
{
parsedEpisodeInfo = Parser.Parser.ParseTitle(Path.GetFileNameWithoutExtension(relativePath));
}
if (parsedEpisodeInfo != null && parsedEpisodeInfo.ReleaseHash.IsNotNullOrWhiteSpace())
{
updates.Add(new
{
Id = id,
ReleaseHash = parsedEpisodeInfo.ReleaseHash
});
}
}
}
if (updates.Count > 0)
{
var updateEpisodeFilesSql = "UPDATE \"EpisodeFiles\" SET \"ReleaseHash\" = @ReleaseHash WHERE \"Id\" = @Id";
conn.Execute(updateEpisodeFilesSql, updates, transaction: tran);
}
}
}
}

View File

@@ -0,0 +1,14 @@
using FluentMigrator;
using NzbDrone.Core.Datastore.Migration.Framework;
namespace NzbDrone.Core.Datastore.Migration
{
[Migration(205)]
public class rename_season_pack_spec : NzbDroneMigrationBase
{
protected override void MainDbUpgrade()
{
Execute.Sql("UPDATE \"CustomFormats\" SET \"Specifications\" = REPLACE(\"Specifications\", 'SeasonPackSpecification', 'ReleaseTypeSpecification')");
}
}
}

View File

@@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Net;
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
@@ -101,11 +103,21 @@ namespace NzbDrone.Core.Download.Clients.Deluge
public string AddTorrentFromMagnet(string magnetLink, DelugeSettings settings)
{
var options = new
{
add_paused = settings.AddPaused,
remove_at_ratio = false
};
dynamic options = new ExpandoObject();
options.add_paused = settings.AddPaused;
options.remove_at_ratio = false;
if (settings.DownloadDirectory.IsNotNullOrWhiteSpace())
{
options.download_location = settings.DownloadDirectory;
}
if (settings.CompletedDirectory.IsNotNullOrWhiteSpace())
{
options.move_completed_path = settings.CompletedDirectory;
options.move_completed = true;
}
var response = ProcessRequest<string>(settings, "core.add_torrent_magnet", magnetLink, options);
@@ -114,11 +126,21 @@ namespace NzbDrone.Core.Download.Clients.Deluge
public string AddTorrentFromFile(string filename, byte[] fileContent, DelugeSettings settings)
{
var options = new
{
add_paused = settings.AddPaused,
remove_at_ratio = false
};
dynamic options = new ExpandoObject();
options.add_paused = settings.AddPaused;
options.remove_at_ratio = false;
if (settings.DownloadDirectory.IsNotNullOrWhiteSpace())
{
options.download_location = settings.DownloadDirectory;
}
if (settings.CompletedDirectory.IsNotNullOrWhiteSpace())
{
options.move_completed_path = settings.CompletedDirectory;
options.move_completed = true;
}
var response = ProcessRequest<string>(settings, "core.add_torrent_file", filename, fileContent, options);

View File

@@ -61,6 +61,12 @@ namespace NzbDrone.Core.Download.Clients.Deluge
[FieldDefinition(9, Label = "DownloadClientSettingsAddPaused", Type = FieldType.Checkbox)]
public bool AddPaused { get; set; }
[FieldDefinition(10, Label = "DownloadClientDelugeSettingsDirectory", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientDelugeSettingsDirectoryHelpText")]
public string DownloadDirectory { get; set; }
[FieldDefinition(11, Label = "DownloadClientDelugeSettingsDirectoryCompleted", Type = FieldType.Textbox, Advanced = true, HelpText = "DownloadClientDelugeSettingsDirectoryCompletedHelpText")]
public string CompletedDirectory { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));

View File

@@ -4,6 +4,7 @@ using System.Linq;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Extras.Files;
using NzbDrone.Core.Languages;
using NzbDrone.Core.MediaFiles.EpisodeImport.Aggregation;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Tv;
@@ -78,11 +79,11 @@ namespace NzbDrone.Core.Extras.Subtitles
SeasonNumber = localEpisode.SeasonNumber,
EpisodeFileId = firstEpisode.EpisodeFileId,
RelativePath = series.Path.GetRelativePath(possibleSubtitleFile),
Language = localEpisode.SubtitleInfo.Language,
LanguageTags = localEpisode.SubtitleInfo.LanguageTags,
Title = localEpisode.SubtitleInfo.Title,
Language = localEpisode.SubtitleInfo?.Language ?? Language.Unknown,
LanguageTags = localEpisode.SubtitleInfo?.LanguageTags ?? new List<string>(),
Title = localEpisode.SubtitleInfo?.Title,
Extension = extension,
Copy = localEpisode.SubtitleInfo.Copy
Copy = localEpisode.SubtitleInfo?.Copy ?? 0
};
subtitleFiles.Add(subtitleFile);

View File

@@ -57,7 +57,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
_localizationService.GetLocalizedString("DownloadClientRootFolderHealthCheckMessage", new Dictionary<string, object>
{
{ "downloadClientName", client.Definition.Name },
{ "path", folder.FullPath }
{ "rootFolderPath", folder.FullPath }
}),
"#downloads-in-root-folder");
}

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Tv.Events;
@@ -9,6 +10,7 @@ namespace NzbDrone.Core.ImportLists.Exclusions
{
ImportListExclusion Add(ImportListExclusion importListExclusion);
List<ImportListExclusion> All();
PagingSpec<ImportListExclusion> Paged(PagingSpec<ImportListExclusion> pagingSpec);
void Delete(int id);
ImportListExclusion Get(int id);
ImportListExclusion FindByTvdbId(int tvdbId);
@@ -54,6 +56,11 @@ namespace NzbDrone.Core.ImportLists.Exclusions
return _repo.All().ToList();
}
public PagingSpec<ImportListExclusion> Paged(PagingSpec<ImportListExclusion> pagingSpec)
{
return _repo.GetPaged(pagingSpec);
}
public void HandleAsync(SeriesDeletedEvent message)
{
if (!message.AddImportListExclusion)

View File

@@ -190,6 +190,12 @@ namespace NzbDrone.Core.ImportLists
item.Title = mappedSeries.Title;
}
if (item.TvdbId == 0)
{
_logger.Debug("[{0}] Rejected, unable to find TVDB ID", item.Title);
continue;
}
// Check to see if series excluded
var excludedSeries = listExclusions.Where(s => s.TvdbId == item.TvdbId).SingleOrDefault();
@@ -202,7 +208,7 @@ namespace NzbDrone.Core.ImportLists
// Break if Series Exists in DB
if (existingTvdbIds.Any(x => x == item.TvdbId))
{
_logger.Debug("{0} [{1}] Rejected, Series Exists in DB", item.TvdbId, item.Title);
_logger.Debug("{0} [{1}] Rejected, series exists in database", item.TvdbId, item.Title);
continue;
}

View File

@@ -522,7 +522,7 @@ namespace NzbDrone.Core.IndexerSearch
var reports = batch.SelectMany(x => x).ToList();
_logger.Debug("Total of {0} reports were found for {1} from {2} indexers", reports.Count, criteriaBase, indexers.Count);
_logger.ProgressDebug("Total of {0} reports were found for {1} from {2} indexers", reports.Count, criteriaBase, indexers.Count);
// Update the last search time for all episodes if at least 1 indexer was searched.
if (indexers.Any())

View File

@@ -5,7 +5,6 @@ namespace NzbDrone.Core.Indexers
public class RssSyncCommand : Command
{
public override bool SendUpdatesToClient => true;
public override bool IsLongRunning => true;
}
}

View File

@@ -164,7 +164,7 @@
"AirsTbaOn": "Pendent el seu anunci a {networkLabel}",
"AllFiles": "Tots els fitxers",
"AllSeriesAreHiddenByTheAppliedFilter": "Tots els resultats estan ocults pel filtre aplicat",
"AllSeriesInRootFolderHaveBeenImported": "S'han importat totes les sèries de {0}",
"AllSeriesInRootFolderHaveBeenImported": "S'han importat totes les sèries de {path}",
"AlreadyInYourLibrary": "Ja a la vostra biblioteca",
"AlternateTitles": "Títols alternatius",
"AnalyseVideoFilesHelpText": "Extraieu informació de vídeo com ara la resolució, el temps d'execució i la informació del còdec dels fitxers. Això requereix que {appName} llegeixi parts del fitxer que poden provocar una activitat elevada al disc o a la xarxa durant les exploracions.",
@@ -183,7 +183,7 @@
"DeleteRootFolder": "Suprimeix la carpeta arrel",
"DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "No es pot comunicar amb {downloadClientName}. {errorMessage}",
"DownloadClientStatusSingleClientHealthCheckMessage": "Clients de baixada no disponibles a causa d'errors: {downloadClientNames}",
"DownloadClientRootFolderHealthCheckMessage": "El client de baixada {downloadClientName} col·loca les baixades a la carpeta arrel {path}. No s'hauria de baixar a una carpeta arrel.",
"DownloadClientRootFolderHealthCheckMessage": "El client de baixada {downloadClientName} col·loca les baixades a la carpeta arrel {rootFolderPath}. No s'hauria de baixar a una carpeta arrel.",
"DownloadClientSortingHealthCheckMessage": "El client de baixada {downloadClientName} té l'ordenació {sortingMode} activada per a la categoria de {appName}. Hauríeu de desactivar l'ordenació al vostre client de descàrrega per a evitar problemes d'importació.",
"HiddenClickToShow": "Amagat, feu clic per a mostrar",
"ImportUsingScript": "Importa amb script",
@@ -213,7 +213,7 @@
"FailedToFetchUpdates": "No s'han pogut obtenir les actualitzacions",
"False": "Fals",
"Implementation": "Implementació",
"ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Falten diverses carpetes arrel per a les llistes d'importació: {rootFoldersInfo}",
"ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Falten diverses carpetes arrel per a les llistes d'importació: {rootFolderInfo}",
"ImportListRootFolderMissingRootHealthCheckMessage": "Falta la carpeta arrel per a les llistes d'importació: {rootFolderInfo}",
"IndexerRssNoIndexersEnabledHealthCheckMessage": "No hi ha indexadors disponibles amb la sincronització RSS activada, {appName} no capturarà els nous llançaments automàticament",
"ImportListStatusAllUnavailableHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors",
@@ -301,7 +301,7 @@
"Clone": "Clona",
"CloneProfile": "Clona el perfil",
"CompletedDownloadHandling": "Gestió de descàrregues completades",
"CountSeriesSelected": "{selectedCount} sèries seleccionades",
"CountSeriesSelected": "{count} sèries seleccionades",
"InteractiveImportLoadError": "No es poden carregar els elements d'importació manual",
"ChownGroupHelpTextWarning": "Això només funciona si l'usuari que executa {appName} és el propietari del fitxer. És millor assegurar-se que el client de descàrrega utilitza el mateix grup que {appName}.",
"ChmodFolderHelpTextWarning": "Això només funciona si l'usuari que executa {appName} és el propietari del fitxer. És millor assegurar-se que el client de descàrrega estableixi correctament els permisos.",
@@ -665,5 +665,13 @@
"NotificationsPushoverSettingsRetry": "Torna-ho a provar",
"NotificationsSettingsWebhookMethod": "Mètode",
"Other": "Altres",
"Monitor": "Monitora"
"Monitor": "Monitora",
"AutoTaggingSpecificationOriginalLanguage": "Llenguatge",
"AutoTaggingSpecificationQualityProfile": "Perfil de Qualitat",
"AutoTaggingSpecificationRootFolder": "Carpeta arrel",
"AddDelayProfileError": "No s'ha pogut afegir un perfil realentit, torna-ho a probar",
"AutoTaggingSpecificationSeriesType": "Tipus de Sèries",
"AutoTaggingSpecificationStatus": "Estat",
"BlocklistAndSearch": "Llista de bloqueig i cerca",
"BlocklistAndSearchHint": "Comença una cerca per reemplaçar després d'haver bloquejat"
}

View File

@@ -30,7 +30,7 @@
"CancelProcessing": "Zrušit zpracování",
"CheckDownloadClientForDetails": "zkontrolujte klienta pro stahování pro více informací",
"ChmodFolderHelpText": "Octal, aplikováno během importu / přejmenování na mediální složky a soubory (bez provádění bitů)",
"ChmodFolderHelpTextWarning": "Toto funguje pouze v případě, že uživatel, který spustil sonarr, je vlastníkem souboru. Je lepší zajistit, aby klient pro stahování správně nastavil oprávnění.",
"ChmodFolderHelpTextWarning": "Toto funguje pouze v případě, že uživatel, který spustil {appName}, je vlastníkem souboru. Je lepší zajistit, aby klient pro stahování správně nastavil oprávnění.",
"ChooseAnotherFolder": "Vyberte jinou složku",
"ChownGroup": "Skupina chown",
"ConnectSettings": "Nastavení připojení",
@@ -67,7 +67,7 @@
"CalendarLoadError": "Nelze načíst kalendář",
"CertificateValidationHelpText": "Změňte přísnost ověřování certifikátů HTTPS. Neměňte, pokud nerozumíte rizikům.",
"ChownGroupHelpText": "Název skupiny nebo gid. Použijte gid pro vzdálené systémy souborů.",
"ChownGroupHelpTextWarning": "Toto funguje pouze v případě, že uživatel, který spustil sonarr, je vlastníkem souboru. Je lepší zajistit, aby klient pro stahování správně nastavil oprávnění.",
"ChownGroupHelpTextWarning": "Toto funguje pouze v případě, že uživatel, který spustil {appName}, je vlastníkem souboru. Je lepší zajistit, aby klient stahování používal stejnou skupinu jako {appName}.",
"ClientPriority": "Priorita klienta",
"Clone": "Klonovat",
"CloneIndexer": "Klonovat indexátor",
@@ -319,5 +319,5 @@
"EditSelectedImportLists": "Upravit vybrané seznamy k importu",
"FormatDateTime": "{formattedDate} {formattedTime}",
"AddRootFolderError": "Nepodařilo se přidat kořenový adresář",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Klient stahování {downloadClientName} je nastaven na odstranění dokončených stahování. To může vést k tomu, že stahování budou z klienta odstraněna dříve, než je bude moci importovat {1}."
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Klient stahování {downloadClientName} je nastaven na odstranění dokončených stahování. To může vést k tomu, že stahování budou z klienta odstraněna dříve, než je bude moci importovat {appName}."
}

View File

@@ -17,5 +17,22 @@
"AddANewPath": "Tilføj en ny sti",
"AddConditionImplementation": "Tilføj betingelse - {implementationName}",
"AddConnectionImplementation": "Tilføj forbindelse - {implementationName}",
"AddCustomFilter": "Tilføj tilpasset filter"
"AddCustomFilter": "Tilføj tilpasset filter",
"ApplyChanges": "Anvend ændringer",
"Test": "Afprøv",
"AddImportList": "Tilføj importliste",
"AddExclusion": "Tilføj undtagelse",
"TestAll": "Afprøv alle",
"TestAllClients": "Afprøv alle klienter",
"TestAllLists": "Afprøv alle lister",
"Unknown": "Ukendt",
"AllTitles": "All titler",
"TablePageSize": "Sidestørrelse",
"TestAllIndexers": "Afprøv alle indeks",
"AddDownloadClientImplementation": "Tilføj downloadklient - {implementationName}",
"AddIndexerError": "Kunne ikke tilføje en ny indekser. Prøv igen.",
"AddImportListImplementation": "Tilføj importliste - {implementationName}",
"AddRootFolderError": "Kunne ikke tilføje rodmappe",
"Table": "Tabel",
"AddIndexer": "Tilføj indekser"
}

View File

@@ -6,9 +6,9 @@
"RemoveFailedDownloads": "Entferne fehlgeschlagene Downloads",
"ApplyChanges": "Änderungen anwenden",
"AutomaticAdd": "Automatisch hinzufügen",
"CountSeasons": "{Anzahl} Staffeln",
"CountSeasons": "{count} Staffeln",
"DownloadClientCheckNoneAvailableHealthCheckMessage": "Es ist kein Download-Client verfügbar",
"DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Kommunikation mit {downloadClientName} nicht möglich.",
"DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Kommunikation mit {downloadClientName} nicht möglich. {errorMessage}",
"DownloadClientRootFolderHealthCheckMessage": "Der Download-Client {downloadClientName} legt Downloads im Stammordner {rootFolderPath} ab. Sie sollten nicht in einen Stammordner herunterladen.",
"DownloadClientSortingHealthCheckMessage": "Im Download-Client {downloadClientName} ist die Sortierung {sortingMode} für die Kategorie von {appName} aktiviert. Sie sollten die Sortierung in Ihrem Download-Client deaktivieren, um Importprobleme zu vermeiden.",
"DownloadClientStatusSingleClientHealthCheckMessage": "Download-Clients sind aufgrund von Fehlern nicht verfügbar: {downloadClientNames}",
@@ -41,7 +41,7 @@
"SkipFreeSpaceCheck": "Prüfung des freien Speichers überspringen",
"AbsoluteEpisodeNumber": "Exakte Folgennummer",
"AddConnection": "Verbindung hinzufügen",
"AddAutoTagError": "Der neue automatische Tag konnte nicht hinzugefügt werden, bitte versuche es erneut.",
"AddAutoTagError": "Auto-Tag konnte nicht hinzugefügt werden. Bitte erneut versuchen.",
"AddConditionError": "Neue Bedingung konnte nicht hinzugefügt werden, bitte erneut versuchen.",
"AddCustomFormat": "Eigenes Format hinzufügen",
"AddCustomFormatError": "Neues eigenes Format kann nicht hinzugefügt werden, bitte versuchen Sie es erneut.",
@@ -86,7 +86,7 @@
"QuickSearch": "Schnelle Suche",
"ReadTheWikiForMoreInformation": "Lesen Sie das Wiki für weitere Informationen",
"Real": "Real",
"RecycleBinUnableToWriteHealthCheckMessage": "Es kann nicht in den konfigurierten Papierkorb-Ordner geschrieben werden: {Pfad}. Stellen Sie sicher, dass dieser Pfad vorhanden ist und vom Benutzer, der {appName} ausführt, beschreibbar ist.",
"RecycleBinUnableToWriteHealthCheckMessage": "Es kann nicht in den konfigurierten Papierkorb-Ordner geschrieben werden: {path}. Stellen Sie sicher, dass dieser Pfad vorhanden ist und vom Benutzer, der {appName} ausführt, beschreibbar ist.",
"RecyclingBin": "Papierkorb",
"RecyclingBinCleanup": "Papierkorb leeren",
"RefreshSeries": "Serie aktualisieren",
@@ -146,7 +146,7 @@
"AuthenticationRequiredHelpText": "Ändern, welche anfragen Authentifizierung benötigen. Ändere nichts wenn du dir nicht des Risikos bewusst bist.",
"AnalyseVideoFilesHelpText": "Videoinformationen wie Auflösung, Laufzeit und Codec-Informationen aus Dateien extrahieren. Dies erfordert, dass {appName} Teile der Datei liest, was bei Scans zu hoher Festplatten- oder Netzwerkaktivität führen kann.",
"AnalyticsEnabledHelpText": "Senden Sie anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen zu Ihrem Browser, welche {appName}-WebUI-Seiten Sie verwenden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
"AutoTaggingNegateHelpText": "Wenn diese Option aktiviert ist, wird die automatische Tagging-Regel nicht angewendet, wenn diese {implementationName}-Bedingung zutrifft.",
"AutoTaggingNegateHelpText": "Falls aktiviert wird das eigene Format nicht angewendet solange diese {0} Bedingung zutrifft.",
"CopyUsingHardlinksSeriesHelpText": "Mithilfe von Hardlinks kann {appName} Seeding-Torrents in den Serienordner importieren, ohne zusätzlichen Speicherplatz zu beanspruchen oder den gesamten Inhalt der Datei zu kopieren. Hardlinks funktionieren nur, wenn sich Quelle und Ziel auf demselben Volume befinden",
"DailyEpisodeTypeFormat": "Datum ({format})",
"DefaultDelayProfileSeries": "Dies ist das Standardprofil. Es gilt für alle Serien, die kein explizites Profil haben.",
@@ -157,7 +157,6 @@
"VisitTheWikiForMoreDetails": "Besuchen Sie das Wiki für weitere Details: ",
"UpgradeUntilEpisodeHelpText": "Sobald diese Qualität erreicht ist, lädt {appName} keine Episoden mehr herunter",
"SslCertPasswordHelpText": "Passwort für die PFX-Datei",
"ShowMonitoredHelpText": "",
"SeriesEditRootFolderHelpText": "Durch das Verschieben von Serien in denselben Stammordner können Serienordner umbenannt werden, um sie an den aktualisierten Titel oder das Benennungsformat anzupassen",
"SelectLanguages": "Sprache auswählen",
"SelectEpisodesModalTitle": "{modalTitle} Episode(n) auswählen",
@@ -172,7 +171,7 @@
"BackupIntervalHelpText": "Intervall zwischen automatischen Sicherungen",
"BuiltIn": "Eingebaut",
"ChangeFileDate": "Ändern Sie das Dateidatum",
"CustomFormatsLoadError": "Benutzerdefinierte Formate können nicht geladen werden",
"CustomFormatsLoadError": "Eigene Formate konnten nicht geladen werden",
"DeleteQualityProfileMessageText": "Sind Sie sicher, dass Sie das Qualitätsprofil „{name}“ löschen möchten?",
"DeletedReasonUpgrade": "Die Datei wurde gelöscht, um ein Upgrade zu importieren",
"DeleteEpisodesFiles": "{episodeFileCount} Episodendateien löschen",
@@ -203,10 +202,10 @@
"AuthBasic": "Basis (Browser-Popup)",
"AuthForm": "Formulare (Anmeldeseite)",
"Authentication": "Authentifizierung",
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich.",
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich",
"Automatic": "Automatisch",
"AutomaticSearch": "Automatische Suche",
"AutoTaggingRequiredHelpText": "Diese {implementationName}-Bedingung muss zutreffen, damit die automatische Tagging-Regel angewendet wird. Andernfalls reicht eine einzelne {implementationName}-Übereinstimmung aus.",
"AutoTaggingRequiredHelpText": "Diese {0} Bedingungen müssen erfüllt sein, damit das eigene Format zutrifft. Ansonsten reicht ein einzelner {1} Treffer.",
"BackupRetentionHelpText": "Automatische Backups, die älter als der Aufbewahrungszeitraum sind, werden automatisch bereinigt",
"BindAddressHelpText": "Gültige IP-Adresse, localhost oder „*“ für alle Schnittstellen",
"BackupsLoadError": "Sicherrungen können nicht geladen werden",
@@ -242,7 +241,6 @@
"ApplyTagsHelpTextHowToApplyImportLists": "So wenden Sie Tags auf die ausgewählten Importlisten an",
"ApplyTagsHelpTextHowToApplyDownloadClients": "So wenden Sie Tags auf die ausgewählten Download-Clients an",
"ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an",
"Retention": "",
"RestrictionsLoadError": "Einschränkungen können nicht geladen werden",
"SslCertPath": "SSL-Zertifikatpfad",
"TheTvdb": "TheTVDB",
@@ -282,23 +280,23 @@
"Custom": "Benutzerdefiniert",
"CustomFilters": "Benutzerdefinierte Filter",
"CustomFormat": "Benutzerdefiniertes Format",
"CustomFormats": "Benutzerdefinierte Formate",
"CustomFormatsSettingsSummary": "Benutzerdefinierte Formate und Einstellungen",
"CustomFormats": "Eigene Formate",
"CustomFormatsSettingsSummary": "Eigene Formate und Einstellungen",
"DailyEpisodeFormat": "Tägliches Episodenformat",
"Database": "Datenbank",
"Dates": "Termine",
"Day": "Tag",
"Default": "Standard",
"DefaultCase": "Standardfall",
"DefaultNameCopiedProfile": "{Name} Kopieren",
"DefaultNameCopiedSpecification": "{Name} Kopieren",
"DefaultNameCopiedProfile": "{name} Kopieren",
"DefaultNameCopiedSpecification": "{name} Kopieren",
"DefaultNotFoundMessage": "Sie müssen verloren sein, hier gibt es nichts zu sehen.",
"DelayMinutes": "{delay} Minuten",
"DelayProfile": "Verzögerungsprofil",
"DelayProfileProtocol": "Protokoll: {preferredProtocol}",
"DelayProfiles": "Verzögerungsprofile",
"DelayProfilesLoadError": "Verzögerungsprofile können nicht geladen werden",
"DelayingDownloadUntil": "Download wird bis zum {Datum} um {Uhrzeit} verzögert",
"DelayingDownloadUntil": "Download wird bis zum {date} um {time} verzögert",
"DeleteAutoTag": "Auto-Tag löschen",
"DeleteAutoTagHelpText": "Sind Sie sicher, dass Sie das automatische Tag „{name}“ löschen möchten?",
"DeleteBackup": "Sicherung löschen",
@@ -313,8 +311,6 @@
"DeleteEpisodeFromDisk": "Episode von der Festplatte löschen",
"DeleteEpisodesFilesHelpText": "Löschen Sie die Episodendateien und den Serienordner",
"DeleteImportList": "Importliste löschen",
"DeleteImportListExclusion": "",
"DeleteImportListExclusionMessageText": "",
"DeleteIndexerMessageText": "Sind Sie sicher, dass Sie den Indexer „{name}“ löschen möchten?",
"DeleteQualityProfile": "Qualitätsprofil löschen",
"DeleteReleaseProfile": "Release-Profil löschen",
@@ -342,7 +338,6 @@
"DoneEditingGroups": "Bearbeiten der Gruppen abgeschlossen",
"DotNetVersion": ".NET",
"Download": "Herunterladen",
"DownloadClient": "",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Fügt der Deluge-JSON-URL ein Präfix hinzu, siehe {url}",
"DownloadClientDelugeTorrentStateError": "Deluge meldet einen Fehler",
"DownloadClientDelugeValidationLabelPluginFailure": "Konfiguration des Labels fehlgeschlagen",
@@ -355,7 +350,7 @@
"DownloadClientDownloadStationValidationFolderMissing": "Ordner existiert nicht",
"DownloadClientDownloadStationValidationFolderMissingDetail": "Der Ordner „{downloadDir}“ existiert nicht, er muss manuell im freigegebenen Ordner „{sharedFolder}“ erstellt werden.",
"DownloadClientDownloadStationValidationNoDefaultDestination": "Kein Standardziel",
"DownloadClientDownloadStationValidationNoDefaultDestinationDetail": "Sie müssen sich bei Ihrer Diskstation als {Benutzername} anmelden und sie manuell in den DownloadStation-Einstellungen unter BT/HTTP/FTP/NZB -> Standort einrichten.",
"DownloadClientDownloadStationValidationNoDefaultDestinationDetail": "Sie müssen sich bei Ihrer Diskstation als {username} anmelden und sie manuell in den DownloadStation-Einstellungen unter BT/HTTP/FTP/NZB -> Standort einrichten.",
"DownloadClientDownloadStationValidationSharedFolderMissing": "Der freigegebene Ordner existiert nicht",
"DownloadClientDownloadStationValidationSharedFolderMissingDetail": "Die Diskstation verfügt nicht über einen freigegebenen Ordner mit dem Namen „{sharedFolder}“. Sind Sie sicher, dass Sie ihn richtig angegeben haben?",
"DownloadClientFloodSettingsAdditionalTags": "Zusätzliche Tags",
@@ -377,7 +372,7 @@
"DownloadClientFreeboxSettingsAppTokenHelpText": "App-Token, das beim Erstellen des Zugriffs auf die Freebox-API abgerufen wird (z. B. „app_token“)",
"DownloadClientFreeboxSettingsHostHelpText": "Hostname oder Host-IP-Adresse der Freebox, standardmäßig „{url}“ (funktioniert nur im selben Netzwerk)",
"DownloadClientFreeboxSettingsPortHelpText": "Port, der für den Zugriff auf die Freebox-Schnittstelle verwendet wird, standardmäßig ist „{port}“",
"DownloadClientFreeboxUnableToReachFreebox": "Die Freebox-API kann nicht erreicht werden. Überprüfen Sie die Einstellungen „Host“, „Port“ oder „SSL verwenden“. (Fehler: {ExceptionMessage})",
"DownloadClientFreeboxUnableToReachFreebox": "Die Freebox-API kann nicht erreicht werden. Überprüfen Sie die Einstellungen „Host“, „Port“ oder „SSL verwenden“. (Fehler: {exceptionMessage})",
"DownloadClientFreeboxUnableToReachFreeboxApi": "Die Freebox-API kann nicht erreicht werden. Überprüfen Sie die Einstellung „API-URL“ für Basis-URL und Version.",
"DownloadClientNzbVortexMultipleFilesMessage": "Der Download enthält mehrere Dateien und befindet sich nicht in einem Jobordner: {outputPath}",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Diese Option erfordert mindestens NzbGet Version 16.0",
@@ -451,7 +446,7 @@
"Restore": "Wiederherstellen",
"RestartRequiredWindowsService": "Je nachdem, welcher Benutzer den {appName}-Dienst ausführt, müssen Sie {appName} möglicherweise einmal als Administrator neu starten, bevor der Dienst automatisch gestartet wird.",
"RestartSonarr": "{appName} neu starten",
"RetryingDownloadOn": "Erneuter Downloadversuch am {Datum} um {Uhrzeit}",
"RetryingDownloadOn": "Erneuter Downloadversuch am {date} um {time}",
"SceneInfo": "Szeneninfo",
"Scene": "Szene",
"SaveSettings": "Einstellungen speichern",
@@ -483,7 +478,6 @@
"Settings": "Einstellungen",
"SetTags": "Tags festlegen",
"SetPermissionsLinuxHelpTextWarning": "Wenn Sie nicht sicher sind, was diese Einstellungen bewirken, ändern Sie sie nicht.",
"ShowMonitored": "",
"ShowEpisodeInformation": "Episodeninformationen anzeigen",
"ShowAdvanced": "Erweitert anzeigen",
"Space": "Platz",
@@ -492,8 +486,6 @@
"StartImport": "Import starten",
"StartProcessing": "Verarbeitung starten",
"Tasks": "Aufgaben",
"TagIsNotUsedAndCanBeDeleted": "",
"TagDetails": "",
"ThemeHelpText": "Ändern Sie das Benutzeroberflächen-Design der Anwendung. Das „Auto“-Design verwendet Ihr Betriebssystemdesign, um den Hell- oder Dunkelmodus festzulegen. Inspiriert vom Theme.Park",
"Theme": "Design",
"TestAllLists": "Prüfe alle Listen",
@@ -501,13 +493,11 @@
"TimeLeft": "Zeit übrig",
"Title": "Titel",
"ToggleMonitoredToUnmonitored": "Überwacht, klicken Sie, um die Überwachung aufzuheben",
"ToggleMonitoredSeriesUnmonitored ": "",
"TorrentBlackholeSaveMagnetFiles": "Speicher Magnetdateien",
"Total": "Gesamt",
"TorrentsDisabled": "Torrents deaktiviert",
"Torrents": "Torrents",
"TvdbIdExcludeHelpText": "Die TVDB-ID der auszuschließenden Serie",
"Trace": "",
"UiSettingsLoadError": "Die Benutzeroberflächen Einstellungen können nicht geladen werden",
"Umask750Description": "{octal} Besitzer schreibt, Gruppe liest",
"Umask": "Umask",
@@ -519,7 +509,6 @@
"Unavailable": "Nicht verfügbar",
"UnselectAll": "Alle abwählen",
"UnsavedChanges": "Nicht gespeicherte Änderungen",
"Unmonitored": "",
"UpdateAutomaticallyHelpText": "Updates automatisch herunterladen und installieren. Sie können weiterhin über System: Updates installieren",
"UpdateAvailableHealthCheckMessage": "Neues Update ist verfügbar",
"UpdateMechanismHelpText": "Verwenden Sie den integrierten Updater von {appName} oder ein Skript",
@@ -535,9 +524,8 @@
"Username": "Nutzername",
"UsenetDelayTime": "Usenet-Verzögerung: {usenetDelay}",
"UsenetDelayHelpText": "Verzögerung in Minuten, bevor Sie eine Veröffentlichung aus dem Usenet erhalten",
"VideoDynamicRange": "",
"VideoCodec": "Video-Codec",
"VersionNumber": "Version {Version}",
"VersionNumber": "Version {version}",
"Version": "Version",
"WantMoreControlAddACustomFormat": "Möchten Sie mehr Kontrolle darüber haben, welche Downloads bevorzugt werden? Fügen Sie ein [benutzerdefiniertes Format] hinzu (/settings/customformats)",
"WaitingToProcess": "Warten auf Bearbeitung",
@@ -552,7 +540,7 @@
"ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu",
"ApplyTagsHelpTextRemove": "Entfernen: Die eingegebenen Tags entfernen",
"ApplyTagsHelpTextReplace": "Ersetzen: Ersetzen Sie die Tags durch die eingegebenen Tags (geben Sie keine Tags ein, um alle Tags zu löschen).",
"Wanted": " Gesucht",
"Wanted": "Gesucht",
"ConnectionLostToBackend": "{appName} hat die Verbindung zum Backend verloren und muss neu geladen werden, um die Funktionalität wiederherzustellen.",
"Continuing": "Fortsetzung",
"CopyUsingHardlinksHelpTextWarning": "Gelegentlich können Dateisperren das Umbenennen von Dateien verhindern, die geseedet werden. Sie können das Seeding vorübergehend deaktivieren und als Workaround die Umbenennungsfunktion von {appName} verwenden.",
@@ -561,9 +549,8 @@
"CountImportListsSelected": "{count} Importliste(n) ausgewählt",
"CountIndexersSelected": "{count} Indexer ausgewählt",
"CountSelectedFiles": "{selectedCount} ausgewählte Dateien",
"CustomFormatUnknownCondition": "Unknown Custom Format condition '{implementation}'",
"CustomFormatUnknownConditionOption": "Unbekannte Option „{key}“ für Bedingung „{implementation}“",
"CustomFormatsSettings": "Benutzerdefinierte Formateinstellungen",
"CustomFormatsSettings": "Einstellungen für eigene Formate",
"Daily": "Täglich",
"Dash": "Bindestrich",
"Debug": "Debuggen",
@@ -572,7 +559,6 @@
"DeleteRemotePathMappingMessageText": "Sind Sie sicher, dass Sie diese Remote-Pfadzuordnung löschen möchten?",
"DeleteSelectedEpisodeFilesHelpText": "Sind Sie sicher, dass Sie die ausgewählten Episodendateien löschen möchten?",
"DeleteSpecificationHelpText": "Sind Sie sicher, dass Sie die Spezifikation „{name}“ löschen möchten?",
"DeleteTag": "",
"Donations": "Spenden",
"Release": "Veröffentlichung",
"RelativePath": "Relativer Pfad",
@@ -606,7 +592,6 @@
"RemoveSelectedItems": "Markierte Einträge löschen",
"RetentionHelpText": "Nur Usenet: Auf Null setzen, um eine unbegrenzte Aufbewahrung festzulegen",
"Standard": "Standard",
"Tags": "",
"Usenet": "Usenet",
"ConnectionLostReconnect": "{appName} wird versuchen, automatisch eine Verbindung herzustellen, oder Sie können unten auf „Neu laden“ klicken.",
"CustomFormatJson": "Benutzerdefiniertes JSON-Format",
@@ -620,7 +605,6 @@
"UsenetDisabled": "Usenet deaktiviert",
"UrlBase": "URL-Basis",
"UpgradeUntilThisQualityIsMetOrExceeded": "Führe ein Upgrade durch, bis diese Qualität erreicht oder überschritten wird",
"UpgradesAllowedHelpText": "",
"RemovedSeriesMultipleRemovedHealthCheckMessage": "Die Serien {series} wurden aus TheTVDB entfernt",
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlange entfernt",
"SceneNumbering": "Szenennummerierung",
@@ -725,7 +709,7 @@
"ClickToChangeSeason": "Klicken Sie hier, um die Staffel zu ändern",
"BlackholeFolderHelpText": "Ordner, in dem {appName} die Datei {extension} speichert",
"BlackholeWatchFolder": "Überwachter Ordner",
"BlackholeWatchFolderHelpText": "Ordner, aus dem {appName} abgeschlossene Downloads importieren soll",
"BlackholeWatchFolderHelpText": "Der Ordner, aus dem {appName} fertige Downloads importieren soll",
"BrowserReloadRequired": "Neuladen des Browsers erforderlich",
"CalendarOptions": "Kalenderoptionen",
"CancelPendingTask": "Möchten Sie diese ausstehende Aufgabe wirklich abbrechen?",
@@ -770,7 +754,6 @@
"UsenetDelay": "Usenet-Verzögerung",
"UsenetBlackholeNzbFolder": "NZB-Ordner",
"UrlBaseHelpText": "Für die Reverse-Proxy-Unterstützung ist der Standardwert leer",
"UpgradeUntilCustomFormatScoreEpisodeHelpText": "",
"TestParsing": "Parsing testen",
"Test": "Prüfen",
"TestAll": "Alle prüfen",
@@ -793,5 +776,16 @@
"Airs": "Wird ausgestrahlt",
"AddRootFolderError": "Stammverzeichnis kann nicht hinzugefügt werden",
"IconForCutoffUnmet": "Symbol für Schwelle nicht erreicht",
"DownloadClientSettingsAddPaused": "Pausiert hinzufügen"
"DownloadClientSettingsAddPaused": "Pausiert hinzufügen",
"ClickToChangeIndexerFlags": "Klicken, um Indexer-Flags zu ändern",
"BranchUpdate": "Branch, der verwendet werden soll, um {appName} zu updaten",
"BlocklistAndSearch": "Sperrliste und Suche",
"AddDelayProfileError": "Verzögerungsprofil konnte nicht hinzugefügt werden. Bitte erneut versuchen.",
"BlocklistAndSearchHint": "Starte Suche nach einer Alternative, falls es der Sperrliste hinzugefügt wurde",
"BlocklistAndSearchMultipleHint": "Starte Suchen nach einer Alternative, falls es der Sperrliste hinzugefügt wurde",
"BlocklistMultipleOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternativen zu suchen",
"BlocklistOnly": "Nur der Sperrliste hinzufügen",
"BlocklistOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternative zu suchen",
"BlocklistReleaseHelpText": "Dieses Release für erneuten Download durch {appName} via RSS oder automatische Suche sperren",
"ChangeCategory": "Kategorie wechseln"
}

View File

@@ -15,8 +15,8 @@
"RemoveSelectedItemsQueueMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε {selectedCount} αντικείμενα από την ουρά;",
"CloneCondition": "Κλωνοποίηση συνθήκης",
"RemoveSelectedItemQueueMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε 1 αντικείμενο από την ουρά;",
"AddConditionImplementation": "Προσθήκη",
"AddConditionImplementation": "Προσθήκη - {implementationName}",
"AppUpdated": "{appName} Ενημερώθηκε",
"AutoAdd": "Προσθήκη",
"AddConnectionImplementation": "Προσθήκη"
"AddConnectionImplementation": "Προσθήκη - {implementationName}"
}

View File

@@ -413,6 +413,10 @@
"DownloadClientDelugeValidationLabelPluginFailureDetail": "{appName} was unable to add the label to {clientName}.",
"DownloadClientDelugeValidationLabelPluginInactive": "Label plugin not activated",
"DownloadClientDelugeValidationLabelPluginInactiveDetail": "You must have the Label plugin enabled in {clientName} to use categories.",
"DownloadClientDelugeSettingsDirectory": "Download Directory",
"DownloadClientDelugeSettingsDirectoryHelpText": "Optional location to put downloads in, leave blank to use the default Deluge location",
"DownloadClientDelugeSettingsDirectoryCompleted": "Move When Completed Directory",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Optional location to move completed downloads to, leave blank to use the default Deluge location",
"DownloadClientDownloadStationProviderMessage": "{appName} is unable to connect to Download Station if 2-Factor Authentication is enabled on your DSM account",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Optional shared folder to put downloads into, leave blank to use the default Download Station location",
"DownloadClientDownloadStationValidationApiVersion": "Download Station API version not supported, should be at least {requiredVersion}. It supports from {minVersion} to {maxVersion}",
@@ -628,6 +632,7 @@
"EpisodeNaming": "Episode Naming",
"EpisodeNumbers": "Episode Number(s)",
"EpisodeProgress": "Episode Progress",
"EpisodeRequested": "Episode Requested",
"EpisodeSearchResultsLoadError": "Unable to load results for this episode search. Try again later",
"EpisodeTitle": "Episode Title",
"EpisodeTitleRequired": "Episode Title Required",
@@ -1585,7 +1590,7 @@
"ReleaseHash": "Release Hash",
"ReleaseProfile": "Release Profile",
"ReleaseProfileIndexerHelpText": "Specify what indexer the profile applies to",
"ReleaseProfileIndexerHelpTextWarning": "Using a specific indexer with release profiles can lead to duplicate releases being grabbed",
"ReleaseProfileIndexerHelpTextWarning": "Setting a specific indexer on a release profile will cause this profile to only apply to releases from that indexer.",
"ReleaseProfileTagSeriesHelpText": "Release profiles will apply to series with at least one matching tag. Leave blank to apply to all series",
"ReleaseProfiles": "Release Profiles",
"ReleaseProfilesLoadError": "Unable to load Release Profiles",

View File

@@ -167,8 +167,8 @@
"AllResultsAreHiddenByTheAppliedFilter": "Todos los resultados están ocultos por el filtro aplicado",
"AnalyseVideoFilesHelpText": "Extraer información de video como la resolución, el tiempo de ejecución y la información del códec de los archivos. Esto requiere que {appName} lea partes del archivo lo cual puede causar una alta actividad en el disco o en la red durante los escaneos.",
"AnimeEpisodeTypeDescription": "Episodios lanzados usando un número de episodio absoluto",
"ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {length} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración",
"AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir la eliminación de AppData al Actualizar",
"ApiKeyValidationHealthCheckMessage": "Por favor actualiza tu clave API para que tenga de longitud al menos {length} caracteres. Puedes hacerlo en los ajustes o en el archivo de configuración",
"AppDataLocationHealthCheckMessage": "No será posible actualizar para evitar la eliminación de AppData al actualizar",
"Scheduled": "Programado",
"Season": "Temporada",
"Clone": "Clonar",
@@ -308,7 +308,7 @@
"CountSeasons": "{count} Temporadas",
"BranchUpdate": "Rama a usar para actualizar {appName}",
"ChmodFolder": "Carpeta chmod",
"CheckDownloadClientForDetails": "Revisar cliente de descarpa para mas detalles",
"CheckDownloadClientForDetails": "Revisar el cliente de descarga para más detalles",
"ChooseAnotherFolder": "Elige otra Carpeta",
"ClientPriority": "Prioridad del Cliente",
"CloneIndexer": "Clonar Indexer",
@@ -325,10 +325,10 @@
"ConnectSettings": "Conectar Ajustes",
"CustomFormatUnknownCondition": "Condición de Formato Personalizado Desconocida '{implementation}'",
"XmlRpcPath": "Ruta XML RPC",
"AutoTaggingNegateHelpText": "Si está marcado, la regla de etiquetado automático no aplicará si la condición {implementationName} coincide.",
"AutoTaggingNegateHelpText": "Si está marcado, la regla de etiquetado automático no se aplicará si esta condición {implementationName} coincide.",
"CloneCustomFormat": "Clonar formato personalizado",
"Close": "Cerrar",
"AutoTaggingRequiredHelpText": "Esta condición {implementationName} debe coincidir para que la regla de etiquetado automático se aplique. De lo contrario una sola coincidencia de {0} será suficiente.",
"AutoTaggingRequiredHelpText": "Esta condición {implementationName} debe coincidir para que la regla de etiquetado automático se aplique. De lo contrario una sola coincidencia de {implementationName} será suficiente.",
"WeekColumnHeaderHelpText": "Mostrado sobre cada columna cuando la vista activa es semana",
"WhyCantIFindMyShow": "Por que no puedo encontrar mi serie?",
"WouldYouLikeToRestoreBackup": "Te gustaria restaurar la copia de seguridad '{name}'?",
@@ -357,7 +357,7 @@
"ChangeFileDate": "Cambiar fecha de archivo",
"CertificateValidationHelpText": "Cambiar como es la validacion de la certificacion estricta de HTTPS. No cambiar a menos que entiendas las consecuencias.",
"AddListExclusion": "Agregar Lista de Exclusión",
"AddedDate": "Agregado: {fecha}",
"AddedDate": "Agregado: {date}",
"AllSeriesAreHiddenByTheAppliedFilter": "Todos los resultados estan ocultos por el filtro aplicado",
"AlternateTitles": "Titulos alternativos",
"ChmodFolderHelpText": "Octal, aplicado durante la importación / cambio de nombre a carpetas y archivos multimedia (sin bits de ejecución)",
@@ -369,7 +369,7 @@
"AirsTbaOn": "A anunciar en {networkLabel}",
"AllFiles": "Todos los archivos",
"Any": "Cualquiera",
"AirsTomorrowOn": "Mañana a las {hora} en {networkLabel}",
"AirsTomorrowOn": "Mañana a las {time} en {networkLabel}",
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName} ",
"AddListExclusionSeriesHelpText": "Evitar que las series sean agregadas a {appName} por las listas",
"CalendarLegendEpisodeDownloadedTooltip": "El episodio fue descargado y ordenado",
@@ -616,7 +616,7 @@
"DownloadClientRTorrentSettingsUrlPath": "Ruta de la url",
"DownloadClientSabnzbdValidationDevelopVersion": "Versión de desarrollo de Sabnzbd, asumiendo versión 3.0.0 o superior.",
"DownloadClientSabnzbdValidationCheckBeforeDownloadDetail": "Usar 'Verificar antes de descargar' afecta a la habilidad de {appName} de rastrear nuevas descargas. Sabnzbd también recomienda 'Abortar trabajos que no pueden ser completados' en su lugar ya que resulta más efectivo.",
"DownloadClientSabnzbdValidationDevelopVersionDetail": "{appName] puede no ser capaz de soportar nuevas características añadidas a SABnzbd cuando se ejecutan versiones de desarrollo.",
"DownloadClientSabnzbdValidationDevelopVersionDetail": "{appName} puede no ser capaz de soportar nuevas características añadidas a SABnzbd cuando se ejecutan versiones de desarrollo.",
"DownloadClientSabnzbdValidationEnableDisableDateSortingDetail": "Debe deshabilitar la ordenación por fechas para la categoría que {appName} usa para evitar problemas al importar. Vaya a Sabnzbd para arreglarlo.",
"DownloadClientSabnzbdValidationEnableJobFolders": "Habilitar carpetas de trabajo",
"DownloadClientSettingsUrlBaseHelpText": "Añade un prefijo a la url de {clientName}, como {url}",
@@ -825,7 +825,7 @@
"Existing": "Existentes",
"ExportCustomFormat": "Exportar formato personalizado",
"EpisodeFilesLoadError": "No se puede cargar los archivos de episodios",
"EpisodeGrabbedTooltip": "Episodio capturado desde {indexer} y enviado a {downloadCliente}",
"EpisodeGrabbedTooltip": "Episodio capturado desde {indexer} y enviado a {downloadClient}",
"EpisodeInfo": "Información del episodio",
"EpisodeMissingAbsoluteNumber": "El episodio no tiene un número de episodio absoluto",
"EpisodeTitleRequired": "Título del episodio requerido",
@@ -873,7 +873,7 @@
"FilterNotInLast": "no en el último",
"Group": "Grupo",
"ImportListSearchForMissingEpisodes": "Buscar episodios faltantes",
"EnableProfileHelpText": "Señalar para habilitar el perfil de lanzamiento",
"EnableProfileHelpText": "Marcar para habilitar el perfil de lanzamiento",
"EnableRssHelpText": "Se usará cuando {appName} busque periódicamente lanzamientos vía Sincronización RSS",
"EndedSeriesDescription": "No se esperan episodios o temporadas adicionales",
"EpisodeFileDeleted": "Archivo de episodio eliminado",
@@ -1059,7 +1059,7 @@
"ICalTagsSeriesHelpText": "El feed solo contendrá series con al menos una etiqueta coincidente",
"IconForCutoffUnmet": "Icono para Umbrales no alcanzados",
"IconForCutoffUnmetHelpText": "Mostrar icono para archivos cuando el umbral no haya sido alcanzado",
"EpisodeCount": "Número de episodios",
"EpisodeCount": "Recuento de episodios",
"IndexerSettings": "Ajustes de Indexador",
"AddDelayProfileError": "No se pudo añadir un nuevo perfil de retraso, inténtelo de nuevo.",
"IndexerRssNoIndexersAvailableHealthCheckMessage": "Todos los indexers capaces de RSS están temporalmente desactivados debido a errores recientes con el indexer",
@@ -1177,7 +1177,7 @@
"LogFiles": "Archivos de Registro",
"LogLevel": "Nivel de Registro",
"LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente",
"LibraryImportTipsQualityInEpisodeFilename": "Asegúrate de que tus archivos incluyen la calidad en sus nombres de archivo. ej. 'episodio.s02e15.bluray.mkv'.",
"LibraryImportTipsQualityInEpisodeFilename": "Asegúrate de que tus archivos incluyen la calidad en sus nombres de archivo. P. ej. `episodio.s02e15.bluray.mkv`",
"ListSyncLevelHelpText": "Las series de la biblioteca se gestionarán en función de su selección si se caen o no aparecen en su(s) lista(s)",
"LogOnly": "Sólo Registro",
"LongDateFormat": "Formato de Fecha Larga",
@@ -1335,7 +1335,7 @@
"Monitor": "Monitorizar",
"MonitorAllEpisodes": "Todos los episodios",
"MonitorAllSeasons": "Todas las temporadas",
"NotificationsCustomScriptSettingsProviderMessage": "El test ejecutará el script con el EventType establecido en {eventTypeSet}, asegúrate de que tu script maneja esto correctamente",
"NotificationsCustomScriptSettingsProviderMessage": "El test ejecutará el script con el EventType establecido en {eventTypeTest}, asegúrate de que tu script maneja esto correctamente",
"NotificationsDiscordSettingsAvatar": "Avatar",
"NotificationsDiscordSettingsAvatarHelpText": "Cambia el avatar que es usado para mensajes desde esta integración",
"NotificationsAppriseSettingsNotificationType": "Tipo de notificación de Apprise",
@@ -1351,7 +1351,7 @@
"NotificationsDiscordSettingsAuthorHelpText": "Sobrescribe el autor incrustado que se muestra para esta notificación. En blanco es el nombre de la instancia",
"MonitorNewItems": "Monitorizar nuevos elementos",
"MonitoredEpisodesHelpText": "Descargar episodios monitorizados en estas series",
"NegateHelpText": "Si se elige, el formato personalizado no se aplica si coincide la condición {implementationName}.",
"NegateHelpText": "Si se marca, el formato personalizado no se aplica si coincide la condición {implementationName}.",
"NotificationsCustomScriptSettingsName": "Script personalizado",
"ImportListsSonarrSettingsSyncSeasonMonitoring": "Sincronizar la monitorización de temporada",
"ImportListsSonarrSettingsSyncSeasonMonitoringHelpText": "Sincroniza la monitorización de temporada de la instancia de {appName}, si se habilita 'Monitorizar' será ignorado",
@@ -1361,5 +1361,701 @@
"MoreDetails": "Más detalles",
"MoreInfo": "Más información",
"NoEpisodesInThisSeason": "No hay episodios en esta temporada",
"NoLinks": "No hay enlaces"
"NoLinks": "No hay enlaces",
"OrganizeSelectedSeriesModalAlert": "Consejo: Para previsualizar un renombrado, selecciona \"Cancelar\", entonces selecciona cualquier título de serie y usa este icono:",
"OrganizeSelectedSeriesModalConfirmation": "¿Estás seguro que quieres organizar todos los archivos en las {count} series seleccionadas?",
"Password": "Contraseña",
"Permissions": "Permisos",
"Port": "Puerto",
"RecyclingBinCleanup": "Limpieza de la papelera de reciclaje",
"ReleaseSceneIndicatorSourceMessage": "Los lanzamientos {message} existen con numeración ambigua, no se pudo identificar de forma fiable el episodio.",
"SeriesTitle": "Título de serie",
"ShowEpisodes": "Mostrar episodios",
"ShowBanners": "Mostrar banners",
"ShowSeriesTitleHelpText": "Muestra el título de serie bajo el póster",
"SkipFreeSpaceCheck": "Saltar comprobación de espacio libre",
"OneSeason": "1 temporada",
"OnlyTorrent": "Solo torrent",
"OpenBrowserOnStart": "Abrir navegador al inicio",
"OnlyUsenet": "Solo Usenet",
"OverrideAndAddToDownloadQueue": "Sobrescribe y añade a la cola de descarga",
"Table": "Tabla",
"TagsLoadError": "No se pudo cargar Etiquetas",
"OverviewOptions": "Opciones de vista general",
"Umask775Description": "{octal} - Usuario y grupo escriben, Otros leen",
"PendingChangesStayReview": "Quedarse y revisar cambios",
"PendingDownloadClientUnavailable": "Pendiente - El cliente de descarga no está disponible",
"PostImportCategory": "Categoría de post-importación",
"PreferUsenet": "Preferir usenet",
"PreviousAiringDate": "Emisiones anteriores: {date}",
"Profiles": "Perfiles",
"PrioritySettings": "Prioridad: {priority}",
"Ok": "Ok",
"PrefixedRange": "Rango prefijado",
"Qualities": "Calidades",
"PublishedDate": "Fecha de publicación",
"QualitySettings": "Opciones de calidad",
"QualitySettingsSummary": "Tamaños de calidad y nombrado",
"RecentChanges": "Cambios recientes",
"MountSeriesHealthCheckMessage": "El montaje que contiene una ruta de series se monta en solo lectura: ",
"NotificationsEmailSettingsBccAddress": "Dirección(es) BCC",
"NotificationsEmailSettingsBccAddressHelpText": "Lista separada por coma de destinatarios de e-mail bcc",
"NotificationsEmailSettingsName": "E-mail",
"NotificationsEmailSettingsRecipientAddress": "Dirección(es) de destinatario",
"NotificationsEmbySettingsSendNotificationsHelpText": "Hacer que MediaBrowser envíe notificaciones a los proveedores configurados",
"NotificationsGotifySettingsAppToken": "Token de app",
"NotificationsGotifySettingIncludeSeriesPosterHelpText": "Incluye poster de serie en mensaje",
"NotificationsJoinSettingsDeviceNames": "Nombres de dispositivo",
"NotificationsJoinSettingsDeviceNamesHelpText": "Lista separada por coma de nombres de dispositivo completos o parciales a los que te gustaría enviar notificaciones. Si no se establece, todos los dispositivos recibirán notificaciones.",
"NotificationsJoinSettingsNotificationPriority": "Prioridad de notificación",
"NotificationsNtfySettingsClickUrlHelpText": "Enlace opcional cuando el usuario hace clic en la notificación",
"NotificationsNtfySettingsPasswordHelpText": "Contraseña opcional",
"NotificationsNtfySettingsTagsEmojis": "Etiquetas y emojis de Ntfy",
"NotificationsNtfySettingsServerUrlHelpText": "Deja en blanco para usar el servidor público ({url})",
"NotificationsNtfySettingsTopicsHelpText": "Lista de temas a la que enviar notificaciones",
"NotificationsPushBulletSettingSenderIdHelpText": "La ID del dispositivo desde la que enviar notificaciones, usa device_iden en la URL del dispositivo en pushbullet.com (deja en blanco para enviarla por ti mismo)",
"NotificationsPushBulletSettingsChannelTagsHelpText": "Lista de etiquetas de canal a las que enviar notificaciones",
"NotificationsSettingsUpdateMapPathsFromHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')",
"NotificationsSettingsUpdateMapPathsFrom": "Mapear rutas desde",
"NotificationsTagsSeriesHelpText": "Envía notificaciones solo para series con al menos una etiqueta coincidente",
"NotificationsTraktSettingsRefreshToken": "Refrescar token",
"OnEpisodeFileDelete": "Al borrar un archivo de episodio",
"OnGrab": "Al capturar",
"OneMinute": "1 minuto",
"Or": "o",
"OrganizeSelectedSeriesModalHeader": "Organizar series seleccionadas",
"Original": "Original",
"OriginalLanguage": "Idioma original",
"OverrideGrabNoLanguage": "Al menos un idioma debe ser seleccionado",
"ParseModalHelpTextDetails": "{appName} intentará analizar el título y te mostrará detalles sobre ello",
"Parse": "Analizar",
"Path": "Ruta",
"PortNumber": "Número de puerto",
"PosterSize": "Tamaño de póster",
"Posters": "Pósteres",
"PreviewRename": "Previsualizar renombrado",
"PreferredProtocol": "Protocolo preferido",
"ProcessingFolders": "Procesando carpetas",
"Proper": "Proper",
"ProxyFailedToTestHealthCheckMessage": "Fallo al probar el proxy: {url}",
"ProxyBadRequestHealthCheckMessage": "Fallo al probar el proxy. Código de estado: {statusCode}",
"ProxyType": "Tipo de proxy",
"QualityLimitsSeriesRuntimeHelpText": "Los límites son automáticamente ajustados para las series en tiempo de ejecución y el número de episodios en el archivo.",
"Range": "Rango",
"RecycleBinUnableToWriteHealthCheckMessage": "No se pudo escribir en la carpeta configurada de la papelera de reciclaje: {path}. Asegúrate de que la ruta existe y es modificable por el usuario que ejecuta {appName}",
"RecyclingBinHelpText": "Los archivos irán aquí cuando se borren en lugar de ser borrados permanentemente",
"RelativePath": "Ruta relativa",
"RegularExpressionsCanBeTested": "Las expresiones regulares pueden ser probadas [aquí]({url}).",
"ReleaseGroup": "Grupo de lanzamiento",
"ReleaseGroups": "Grupos de lanzamiento",
"ReleaseProfilesLoadError": "No se pudo cargar los perfiles de lanzamiento",
"RemotePathMappingImportEpisodeFailedHealthCheckMessage": "{appName} falló al importar (un) episodio(s). Comprueba tus registros para más detalles.",
"RemotePathMappingRemoteDownloadClientHealthCheckMessage": "El cliente de descarga remoto {downloadClientName} reportó archivos en {path} pero este directorio no parece existir. Posiblemente mapeo de ruta remota perdido.",
"RemoveQueueItem": "Eliminar - {sourceTitle}",
"RemoveFailed": "Fallo al eliminar",
"ResetQualityDefinitions": "Restablecer definiciones de calidad",
"Scene": "Escena",
"RssSyncIntervalHelpText": "Intervalo en minutos. Configurar a cero para deshabilitar (esto detendrá todas las capturas automáticas de lanzamientos)",
"SceneNumberNotVerified": "El número de escena no ha sido verificado aún",
"SearchForAllMissingEpisodes": "Buscar todos los episodios perdidos",
"SeasonInformation": "Información de temporada",
"SeasonNumber": "Número de temporada",
"SeasonCount": "Recuento de temporada",
"SelectDownloadClientModalTitle": "{modalTitle} - Seleccionar cliente de descarga",
"SelectEpisodes": "Seleccionar episodio(s)",
"SeriesDetailsGoTo": "Ir a {title}",
"SeriesTypes": "Tipos de serie",
"SeriesTypesHelpText": "El tipo de serie es usado para renombrar, analizar y buscar",
"SingleEpisodeInvalidFormat": "Episodio individual: Formato inválido",
"SslCertPasswordHelpText": "Contraseña para el archivo pfx",
"SslPort": "Puerto SSL",
"StandardEpisodeFormat": "Formato de episodio estándar",
"StartProcessing": "Iniciar procesamiento",
"SupportedListsMoreInfo": "Para más información en las listas individuales, haz clic en los botones de más información.",
"TagDetails": "Detalles de etiqueta - {label}",
"Total": "Total",
"True": "Verdadero",
"Umask770Description": "{octal} - Usuario y grupo escriben",
"UsenetBlackholeNzbFolder": "Carpeta Nzb",
"UsenetDelay": "Retraso de usenet",
"UsenetBlackhole": "Blackhole de usenet",
"RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "El cliente de descarga {downloadClientName} reportó archivos en {path} pero {appName} no puede ver este directorio. Puede que necesites ajustar los permisos de la carpeta.",
"RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "El cliente de descarga local {downloadClientName} reportó archivos en {path} pero esta no es una ruta {osName} válida. Revisa las opciones de tu cliente de descarga.",
"RemotePathMappingFilesWrongOSPathHealthCheckMessage": "El cliente de descarga remoto {downloadClientName} reportó archivos en {path} pero esta no es una ruta {osName} válida. Revisa tus mapeos de ruta remota y las opciones de tu cliente de descarga.",
"RemoveFilter": "Eliminar filtro",
"RemoveQueueItemConfirmation": "¿Estás seguro que quieres eliminar '{sourceTitle}' de la cola?",
"RemoveRootFolder": "Eliminar la carpeta raíz",
"RemoveSelectedItem": "Eliminar elemento seleccionado",
"RemoveTagsAutomaticallyHelpText": "Eliminar etiquetas automáticamente si las condiciones no se cumplen",
"RemovedFromTaskQueue": "Eliminar de la cola de tareas",
"RemovedSeriesMultipleRemovedHealthCheckMessage": "Las series {series} fueron eliminadas de TheTVDB",
"RenameFiles": "Renombrar archivos",
"ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?",
"ResetDefinitions": "Restablecer definiciones",
"ResetDefinitionTitlesHelpText": "Restablecer títulos de definición también como valores",
"ResetQualityDefinitionsMessageText": "¿Estás seguro que quieres restablecer las definiciones de calidad?",
"RestartNow": "Reiniciar ahora",
"RestartRequiredToApplyChanges": "{appName} requiere reiniciar para aplicar cambios. ¿Quieres reiniciar ahora?",
"RestartSonarr": "Reiniciar {appName}",
"RestoreBackup": "Restaurar copia de seguridad",
"Result": "Resultado",
"RetryingDownloadOn": "Reintentar descarga en {date} a las {time}",
"Rss": "RSS",
"SaveChanges": "Guardar cambios",
"SceneNumbering": "Numeración de escena",
"Script": "Script",
"Search": "Buscar",
"SearchForMonitoredEpisodesSeason": "Buscar episodios monitorizados en esta temporada",
"SearchForQuery": "Buscar {query}",
"SeasonFolder": "Carpeta de temporada",
"SeasonPassEpisodesDownloaded": "{episodeFileCount}/{totalEpisodeCount} episodios descargados",
"SelectDropdown": "Seleccionar...",
"SelectLanguageModalTitle": "{modalTitle} - Seleccionar idioma",
"SelectLanguages": "Seleccionar idiomas",
"SelectReleaseGroup": "Seleccionar grupo de lanzamiento",
"SeriesDetailsNoEpisodeFiles": "Sin archivos de episodio",
"SeriesFolderImportedTooltip": "Episodio importado de la carpeta de serie",
"SeriesIsMonitored": "La serie está monitorizada",
"SeriesLoadError": "No se pudo cargar la serie",
"SeriesIsUnmonitored": "La serie no está monitorizada",
"SetPermissionsLinuxHelpTextWarning": "Si no estás seguro qué configuraciones hacer, no las cambies.",
"SetPermissionsLinuxHelpText": "¿Debería ejecutarse chmod cuando los archivos son importados/renombrados?",
"SetReleaseGroup": "Establecer grupo de lanzamiento",
"ShowEpisodeInformationHelpText": "Muestra el título y número de episodio",
"ShowMonitoredHelpText": "Muestra el estado monitorizado bajo el póster",
"ShowQualityProfile": "Mostrar perfil de calidad",
"ShowQualityProfileHelpText": "Muestra el perfil de calidad bajo el póster",
"ShowRelativeDates": "Mostrar fechas relativas",
"OnImport": "Al importar",
"Other": "Otro",
"ShowRelativeDatesHelpText": "Muestra fechas absolutas o relativas (Hoy/Ayer/etc)",
"Proxy": "Proxy",
"ShowSearch": "Mostrar búsqueda",
"ShowSearchHelpText": "Muestra el botón de búsqueda al pasar por encima",
"ShowSeasonCount": "Muestra el recuento de temporada",
"ShowAdvanced": "Mostrar avanzado",
"Socks4": "Socks4",
"Socks5": "Socks5 (Soporta TOR)",
"ShowTitle": "Mostrar título",
"Unknown": "Desconocido",
"Sort": "Ordenar",
"SourcePath": "Ruta de la fuente",
"SourceRelativePath": "Ruta relativa de la fuente",
"Special": "Especial",
"SourceTitle": "Título de la fuente",
"SpecialEpisode": "Episodio especial",
"Specials": "Especiales",
"SpecialsFolderFormat": "Formato de carpeta de los especiales",
"SslCertPassword": "Contraseña de certificado SSL",
"SupportedCustomConditions": "{appName} soporta condiciones personalizadas para las siguientes propiedades de lanzamiento.",
"SupportedDownloadClients": "{appName} soporta muchos torrent populares y clientes de descarga de usenet.",
"SupportedIndexers": "{appName} soporta cualquier indexador que use el estándar Newznab, así como otros indexadores listados a continuación.",
"OnSeriesDelete": "Al borrar series",
"OnRename": "Al renombrar",
"OutputPath": "Ruta de salida",
"PreferAndUpgrade": "Preferir y actualizar",
"Presets": "Preajustes",
"ProxyPasswordHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.",
"QueueLoadError": "Fallo al cargar la cola",
"ReadTheWikiForMoreInformation": "Lee la Wiki para más información",
"RecyclingBinCleanupHelpText": "Establece a 0 para deshabilitar la limpieza automática",
"RegularExpressionsTutorialLink": "Más detalles de las expresiones regulares pueden ser encontradas [aquí]({url}).",
"RejectionCount": "Recuento de rechazos",
"RemotePathMappingFileRemovedHealthCheckMessage": "El fichero {path} ha sido eliminado durante el proceso.",
"RemotePathMappings": "Mapeos de ruta remota",
"RemovedSeriesSingleRemovedHealthCheckMessage": "La serie {series} fue eliminada de TheTVDB",
"ReplaceWithDash": "Reemplazar con guion",
"ReplaceWithSpaceDash": "Reemplazar por barra espaciadora",
"ReplaceWithSpaceDashSpace": "Reemplazar por espacio en la barra espaciadora",
"ScriptPath": "Ruta del script",
"SeasonDetails": "Detalles de temporada",
"SecretToken": "Token secreto",
"SelectQuality": "Seleccionar calidad",
"SelectLanguage": "Seleccionar idioma",
"SelectSeason": "Seleccionar temporada",
"SeriesIndexFooterMissingUnmonitored": "Episodios perdidos (Serie no monitorizada)",
"ShowEpisodeInformation": "Mostrar información de episodio",
"ShowPath": "Mostrar ruta",
"ShowNetwork": "Mostrar red",
"TvdbIdExcludeHelpText": "La ID de TVDB de la serie a excluir",
"UpdateSonarrDirectlyLoadError": "No se pudo actualizar {appName} directamente,",
"UpgradesAllowedHelpText": "Si se deshabilita las calidades no serán actualizadas",
"WithFiles": "Con archivos",
"SystemTimeHealthCheckMessage": "La hora del sistema está desfasada más de 1 día. Las tareas programadas pueden no ejecutarse correctamente hasta que la hora sea corregida",
"TableColumns": "Columnas",
"TableColumnsHelpText": "Elige qué columnas son visibles en qué orden aparecen",
"TablePageSize": "Tamaño de página",
"TablePageSizeHelpText": "Número de elementos a mostrar en cada página",
"TablePageSizeMinimum": "El tamaño de página debe ser al menos {minimumValue}",
"TablePageSizeMaximum": "El tamaño de página no debe exceder {maximumValue}",
"TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada",
"TagsSettingsSummary": "Vea todas las etiquetas y cómo se usan. Las etiquetas sin usar pueden ser eliminadas",
"TaskUserAgentTooltip": "User-Agent proporcionado por la aplicación que llamó a la API",
"Test": "Prueba",
"TestAllIndexers": "Probar todos los indexadores",
"TestAllLists": "Probar todas las listas",
"TestParsing": "Probar análisis",
"ThemeHelpText": "Cambiar el tema de la interfaz de la aplicación, el tema 'Auto' usará el tema de tu sistema para establecer el modo luminoso u oscuro. Inspirado por Theme.Park",
"TimeLeft": "Tiempo restante",
"ToggleMonitoredSeriesUnmonitored ": "No se puede conmutar el estado monitorizado cuando la serie no está monitorizada",
"Tomorrow": "Mañana",
"TorrentBlackhole": "Blackhole de torrent",
"TorrentBlackholeSaveMagnetFiles": "Guardar archivos magnet",
"TorrentBlackholeSaveMagnetFilesExtension": "Guardar extensión de archivos magnet",
"TorrentBlackholeSaveMagnetFilesReadOnly": "Solo lectura",
"TorrentBlackholeTorrentFolder": "Carpeta de torrent",
"TorrentDelayHelpText": "Retraso en minutos a esperar antes de capturar un torrent",
"TorrentDelayTime": "Retraso torrent: {torrentDelay}",
"Umask755Description": "{octal} - Usuario escribe, Todos los demás leen",
"Umask777Description": "{octal} - Todos escriben",
"UnableToLoadAutoTagging": "No se pudo cargar el etiquetado automático",
"UnableToLoadBackups": "No se pudo cargar las copias de seguridad",
"Ungroup": "Sin agrupar",
"UnknownDownloadState": "Estado de descarga desconocido: {state}",
"Unlimited": "Ilimitado",
"UnmappedFilesOnly": "Solo archivos sin mapear",
"UnmonitorDeletedEpisodes": "Dejar de monitorizar episodios borrados",
"UnmonitoredOnly": "Solo sin monitorizar",
"UnsavedChanges": "Cambios sin guardar",
"UnselectAll": "Desmarcar todo",
"Upcoming": "Próximamente",
"UpcomingSeriesDescription": "Series que han sido anunciadas pero aún no hay fecha de emisión exacta",
"ReleaseSceneIndicatorUnknownSeries": "Episodio o serie desconocido.",
"RemoveDownloadsAlert": "Las opciones de Eliminar fueron movidas a las opciones del cliente de descarga individual en la table anterior.",
"RestartRequiredHelpTextWarning": "Requiere reiniciar para que tenga efecto",
"SelectFolder": "Seleccionar carpeta",
"TestAllClients": "Probar todos los clientes",
"UpdateFiltered": "Actualizar filtrados",
"SeriesEditor": "Editor de serie",
"Updates": "Actualizaciones",
"NotificationsKodiSettingsDisplayTimeHelpText": "Durante cuánto tiempo serán mostradas las notificaciones (en segundos)",
"NotificationsNtfySettingsUsernameHelpText": "Usuario opcional",
"NotificationsSimplepushSettingsEvent": "Evento",
"NotificationsSimplepushSettingsEventHelpText": "Personaliza el comportamiento de las notificaciones push",
"NotificationsTwitterSettingsConsumerSecret": "Secreto de consumidor",
"NotificationsTelegramSettingsSendSilently": "Enviar de forma silenciosa",
"NotificationsValidationInvalidHttpCredentials": "Credenciales de autenticación HTTP inválidas: {exceptionMessage}",
"OnEpisodeFileDeleteForUpgrade": "Al borrar un archivo de episodio para actualización",
"OnHealthIssue": "Al haber un problema de salud",
"Organize": "Organizar",
"OrganizeRenamingDisabled": "El renombrado está deshabilitado, nada que renombrar",
"OrganizeNothingToRename": "¡Éxito! Mi trabajo está hecho, no hay archivos que renombrar.",
"OrganizeRelativePaths": "Todas las rutas son relativas a: `{path}`",
"Pending": "Pendiente",
"QualityDefinitions": "Definiciones de calidad",
"RecyclingBin": "Papelera de reciclaje",
"ReleaseTitle": "Título de lanzamiento",
"RemotePathMappingLocalPathHelpText": "Ruta que {appName} debería usar para acceder a la ruta remota localmente",
"Remove": "Eliminar",
"RetentionHelpText": "Solo usenet: Establece a cero para establecer una retención ilimitada",
"SelectIndexerFlags": "Seleccionar banderas del indexador",
"SelectSeasonModalTitle": "{modalTitle} - Seleccionar temporada",
"SeriesFinale": "Final de serie",
"SeriesAndEpisodeInformationIsProvidedByTheTVDB": "La información de serie y episodio es proporcionada por TheTVDB.com. [Por favor considera apoyarlos]({url}).",
"SetIndexerFlags": "Establecer banderas del indexador",
"SkipRedownload": "Saltar redescarga",
"ShowMonitored": "Mostrar monitorizado",
"Space": "Espacio",
"TimeFormat": "Formato de hora",
"UiSettings": "Opciones de interfaz",
"Umask": "UMask",
"UpdateStartupNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de inicio '{startupFolder}' no es modificable por el usuario '{userName}'.",
"UsenetDelayHelpText": "Retraso en minutos a esperar antes de capturar un lanzamiento desde usenet",
"PartialSeason": "Temporada parcial",
"RemoveSelectedItemQueueMessageText": "¿Estás seguro que quieres eliminar 1 elemento de la cola?",
"SceneInformation": "Información de escena",
"UpgradeUntilThisQualityIsMetOrExceeded": "Actualizar hasta que esta calidad sea alcanzada o excedida",
"Uppercase": "Mayúsculas",
"SeriesDetailsRuntime": "{runtime} minutos",
"ShowBannersHelpText": "Muestra banners en lugar de títulos",
"SslCertPathHelpText": "Ruta al archivo pfx",
"Umask750Description": "{octal} - Usuario escribe, Grupo lee",
"UrlBaseHelpText": "Para soporte de proxy inverso, por defecto está vacío",
"UpdateAll": "Actualizar todo",
"ConnectionSettingsUrlBaseHelpText": "Añade un prefijo a la url {connectionName}, como {url}",
"UsenetDelayTime": "Retraso de usenet: {usenetDelay}",
"UsenetDisabled": "Usenet deshabilitado",
"Username": "Usuario",
"UtcAirDate": "Fecha de emisión UTC",
"Version": "Versión",
"WaitingToImport": "Esperar para importar",
"NotificationsDiscordSettingsOnGrabFieldsHelpText": "Cambia los campos que se pasan para esta notificación 'al capturar'",
"NotificationsNtfyValidationAuthorizationRequired": "Se requiere autorización",
"NotificationsNtfySettingsClickUrl": "URL al hacer clic",
"NotificationsNotifiarrSettingsApiKeyHelpText": "Tu clave API de tu perfil",
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Autenticar con Plex.tv",
"NotificationsPushcutSettingsNotificationNameHelpText": "Nombre de notificación de la pestaña Notificaciones de la aplicación Pushcut",
"NotificationsPlexValidationNoTvLibraryFound": "Al menos se requiere una biblioteca de TV",
"NotificationsPushBulletSettingSenderId": "ID del remitente",
"NotificationsSignalSettingsGroupIdPhoneNumberHelpText": "ID de grupo / Número de teléfono del receptor",
"NotificationsSettingsWebhookMethod": "Método",
"NotificationsSettingsUseSslHelpText": "Conectar a {serviceName} sobre HTTPS en vez de HTTP",
"NotificationsTwitterSettingsConsumerSecretHelpText": "Secreto de consumidor de una aplicación de Twitter",
"NotificationsValidationInvalidUsernamePassword": "Usuario o contraseña inválido",
"NotificationsSlackSettingsWebhookUrlHelpText": "URL de canal webhook de Slack",
"PackageVersion": "Versión del paquete",
"NotificationsValidationUnableToConnectToApi": "No se pudo conectar a la API de {service}. La conexión al servidor falló: ({responseCode}) {exceptionMessage}",
"PosterOptions": "Opciones de póster",
"PreferTorrent": "Preferir torrent",
"PreviewRenameSeason": "Previsualizar renombrado para esta temporada",
"PreviousAiring": "Emisiones anteriores",
"RemoveFromDownloadClient": "Eliminar del cliente de descarga",
"RemovingTag": "Eliminando etiqueta",
"Required": "Solicitado",
"Reorder": "Reordenar",
"SceneInfo": "Información de escena",
"RootFolderMissingHealthCheckMessage": "Carpeta raíz perdida: {rootFolderPath}",
"SearchAll": "Buscar todo",
"SelectAll": "Seleccionar todo",
"SeriesIndexFooterEnded": "FInalizado (Todos los episodios descargados)",
"ShowDateAdded": "Mostrar fecha de adición",
"UnmonitorDeletedEpisodesHelpText": "Los episodios borrados del disco son dejados de monitorizar automáticamente en {appName}",
"UnmonitorSelected": "Dejar de monitorizar seleccionados",
"UpdateSelected": "Actualizar seleccionados",
"UpdateUiNotWritableHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de interfaz '{uiFolder}' no es modificable por el usuario '{userName}'.",
"UpgradeUntil": "Actualizar hasta",
"UpdaterLogFiles": "Actualizador de archivos de registro",
"UseSeasonFolder": "Usar carpeta de temporada",
"UseHardlinksInsteadOfCopy": "Utilizar enlaces directos en lugar de copiar",
"View": "Vista",
"VisitTheWikiForMoreDetails": "Visita la wiki para más detalles: ",
"WaitingToProcess": "Esperar al proceso",
"Week": "Semana",
"WeekColumnHeader": "Cabecera de columna de semana",
"Release": "Lanzamiento",
"RemoveSelectedItems": "Eliminar elementos seleccionados",
"RemoveSelectedItemsQueueMessageText": "¿Estás seguro que quieres eliminar {selectedCount} elementos de la cola?",
"RootFolderSelectFreeSpace": "{freeSpace} libres",
"RootFolderPath": "Ruta de carpeta raíz",
"RssSyncInterval": "Intervalo de sincronización RSS",
"SingleEpisode": "Episodio individual",
"ShowUnknownSeriesItems": "Mostrar elementos de serie desconocidos",
"NotificationsGotifySettingIncludeSeriesPoster": "Incluir poster de serie",
"NotificationsKodiSettingsCleanLibraryHelpText": "Limpia la biblioteca después de actualizar",
"NotificationsKodiSettingsCleanLibrary": "Limpiar biblioteca",
"NotificationsKodiSettingsGuiNotification": "Notificación de interfaz gráfica",
"NotificationsKodiSettingsUpdateLibraryHelpText": "¿Actualiza la biblioteca durante Importar y renombrar?",
"NotificationsMailgunSettingsUseEuEndpointHelpText": "Habilitar el uso del endpoint de UE de MailGun",
"NotificationsMailgunSettingsUseEuEndpoint": "Usar el endpoint de la UE",
"NotificationsNtfySettingsAccessToken": "Token de acceso",
"NotificationsNtfySettingsAccessTokenHelpText": "Autorización opcional basada en token. Tiene prioridad sobre usuario/contraseña",
"NotificationsNtfySettingsTagsEmojisHelpText": "Lista opcional de etiquetas o emojis para usar",
"NotificationsNtfySettingsTopics": "Temas",
"NotificationsPushBulletSettingsDeviceIds": "IDs de dispositivo",
"NotificationsPushBulletSettingsAccessToken": "Token de acceso",
"NotificationsPushBulletSettingsChannelTags": "Etiquetas de canal",
"NotificationsPushcutSettingsTimeSensitive": "Sensible al tiempo",
"NotificationsPushcutSettingsTimeSensitiveHelpText": "Habilitar para marcas la notificación como \"Sensible al tiempo\"",
"NotificationsPushoverSettingsDevices": "Dispositivos",
"NotificationsPushoverSettingsDevicesHelpText": "Lista de nombres de dispositivo (deja en blanco para enviar a todos los dispositivos)",
"NotificationsPushoverSettingsExpireHelpText": "Tiempo máximo para reintentar las alertas de emergencia, máximo 86400 segundos",
"NotificationsPushoverSettingsRetry": "Reintentar",
"NotificationsPushoverSettingsSound": "Sonido",
"NotificationsPushoverSettingsUserKey": "Clave de usuario",
"NotificationsPushoverSettingsSoundHelpText": "Sonido de notificación, deja en blanco para usar el predeterminado",
"NotificationsSettingsWebhookMethodHelpText": "Qué método HTTP utilizar para enviar al servicio web",
"NotificationsSettingsWebhookUrl": "URL del webhook",
"NotificationsSignalSettingsGroupIdPhoneNumber": "ID de grupo / Número de teléfono",
"NotificationsSignalSettingsPasswordHelpText": "Contraseña usada para autenticar solicitudes hacia signal-api",
"NotificationsSignalSettingsSenderNumber": "Número del emisor",
"NotificationsSignalSettingsUsernameHelpText": "Usuario usado para autenticar solicitudes hacia signal-api",
"NotificationsSignalValidationSslRequired": "Se requiere SSL",
"NotificationsSimplepushSettingsKey": "Clave",
"NotificationsSlackSettingsChannel": "Canal",
"NotificationsSlackSettingsIconHelpText": "Cambia el icono usado para mensajes publicados a Slack (emoji o URL)",
"NotificationsSlackSettingsUsernameHelpText": "Usuario para publicar a Slack",
"NotificationsTelegramSettingsSendSilentlyHelpText": "Envía el mensaje de forma silenciosa. Los usuarios recibirán una notificación sin sonido",
"NotificationsTelegramSettingsTopicId": "ID de tema",
"NotificationsTraktSettingsAuthenticateWithTrakt": "Autenticar con Trakt",
"NotificationsTraktSettingsExpires": "Caduca",
"NotificationsValidationUnableToConnectToService": "No se pudo conectar a {serviceName}",
"NotificationsValidationUnableToSendTestMessage": "No se pudo enviar un mensaje de prueba: {exceptionMessage}",
"NzbgetHistoryItemMessage": "Estado de PAR: {parStatus} - Estado de desempaquetado: {unpackStatus} - Estado de movido: {moveStatus} - Estado de script: {scriptStatus} - Estado de borrado: {deleteStatus} - Estado de marcado: {markStatus}",
"OpenSeries": "Abrir serie",
"OrganizeLoadError": "Error cargando vistas previas",
"OrganizeNamingPattern": "Patrón de nombrado: `{episodeFormat}`",
"OverrideGrabNoSeries": "La serie debe ser seleccionada",
"PackageVersionInfo": "{packageVersion} por {packageAuthor}",
"PendingChangesDiscardChanges": "Descartar cambios y salir",
"Period": "Periodo",
"PendingChangesMessage": "Tienes cambios sin guardar. ¿Estás seguro que quieres salir de esta página?",
"PreviouslyInstalled": "Previamente instalado",
"ProtocolHelpText": "Elige qué protocolo(s) usar y cuál se prefiere cuando se elige entre lanzamientos equivalentes",
"ProgressBarProgress": "Barra de progreso al {progress}%",
"ProxyBypassFilterHelpText": "Usa ',' como separador, y '*.' como comodín para subdominios",
"ProxyResolveIpHealthCheckMessage": "Fallo al resolver la dirección IP para el host proxy configurado {proxyHostName}",
"ProxyUsernameHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.",
"QualityProfile": "Perfil de calidad",
"QualityDefinitionsLoadError": "No se pudo cargar las definiciones de calidad",
"QualityProfiles": "Perfiles de calidad",
"QualityProfilesLoadError": "No se pudo cargar los perfiles de calidad",
"QueueFilterHasNoItems": "Seleccionado filtro de cola que no tiene elementos",
"QuickSearch": "Búsqueda rápida",
"Real": "Real",
"Reason": "Razón",
"RegularExpression": "Expresión regular",
"ReleaseHash": "Hash de lanzamiento",
"Rejections": "Rechazos",
"RecyclingBinCleanupHelpTextWarning": "Los archivos en la papelera de reciclaje anteriores al número de días seleccionado serán limpiados automáticamente",
"ReleaseProfiles": "Perfiles de lanzamiento",
"ReleaseRejected": "Lanzamiento rechazado",
"ReleaseSceneIndicatorAssumingScene": "Asumiendo numeración de escena.",
"ReleaseSceneIndicatorAssumingTvdb": "Asumiendo numeración de TVDB.",
"ReleaseSceneIndicatorUnknownMessage": "La numeración varía para este episodio y el lanzamiento no coincide con ningún mapeo conocido.",
"RemotePathMappingDownloadPermissionsEpisodeHealthCheckMessage": "{appName} puede ver pero no acceder al episodio descargado {path}. Probablemente error de permisos.",
"RemotePathMappingRemotePathHelpText": "Ruta raíz al directorio al que accede el cliente de descarga",
"RemoveFailedDownloads": "Eliminar descargas fallidas",
"RemoveSelected": "Eliminar seleccionado",
"RenameEpisodesHelpText": "{appName} usará el nombre de archivo existente si el renombrado está deshabilitado",
"RenameEpisodes": "Renombrar episodios",
"RestrictionsLoadError": "No se pudo cargar Restricciones",
"SearchForMissing": "Buscar perdidos",
"SeasonFinale": "Final de temporada",
"SearchSelected": "Buscar seleccionados",
"SeasonFolderFormat": "Formato de carpeta de temporada",
"SendAnonymousUsageData": "Enviar datos de uso anónimos",
"SeriesDetailsOneEpisodeFile": "1 archivo de episodio",
"SeriesFolderFormatHelpText": "Usado cuando se añade una nueva serie o se mueve la serie a través del editor de serie",
"SeriesID": "ID de serie",
"SetPermissions": "Establecer permisos",
"SetReleaseGroupModalTitle": "{modalTitle} - Establecer grupo de lanzamiento",
"SetTags": "Establecer etiquetas",
"ShowPreviousAiring": "Mostrar emisión anterior",
"ShowSizeOnDisk": "Mostrar tamaño en disco",
"SizeOnDisk": "Tamaño en disco",
"SizeLimit": "Límite de tamaño",
"SkipRedownloadHelpText": "Evita que {appName} intente descargar un lanzamiento alternativo para este elemento",
"Small": "Pequeño",
"SomeResultsAreHiddenByTheAppliedFilter": "Algunos resultados están ocultos por el filtro aplicado",
"SonarrTags": "Etiquetas de {appName}",
"Standard": "Estándar",
"StandardEpisodeTypeFormat": "Temporada y número de episodios ({format})",
"StandardEpisodeTypeDescription": "Episodios lanzados con patrón SxxEyy",
"SubtitleLanguages": "Idiomas de subtítulo",
"SupportedAutoTaggingProperties": "{appName} soporta las siguientes propiedades para reglas de etiquetado automáticas",
"SupportedIndexersMoreInfo": "Para más información en los indexadores individuales, haz clic en los botones de más información.",
"SupportedListsSeries": "{appName} soporta múltiples listas para importar series en la base de datos.",
"TableOptions": "Opciones de tabla",
"TableOptionsButton": "Botón de opciones de tabla",
"Today": "Hoy",
"Titles": "Títulos",
"ToggleUnmonitoredToMonitored": "Sin monitorizar, haz clic para monitorizar",
"TotalFileSize": "Tamaño total de archivo",
"UpdateAvailableHealthCheckMessage": "Hay disponible una nueva actualización",
"UpgradeUntilCustomFormatScore": "Actualizar hasta la puntuación de formato personalizado",
"UrlBase": "URL base",
"UseSsl": "Usar SSL",
"Usenet": "Usenet",
"VersionNumber": "Versión {version}",
"OnManualInteractionRequired": "Cuando se requiera interacción manual",
"OnLatestVersion": "La última versión de {appName} ya está instalada",
"OnUpgrade": "Al actualizar",
"RootFolders": "Carpetas raíz",
"SeasonPremiere": "Estreno de temporada",
"UnableToUpdateSonarrDirectly": "No se pudo actualizar {appName} directamente,",
"UnmappedFolders": "Carpetas sin mapear",
"QualitiesLoadError": "No se pudo cargar las calidades",
"SeasonNumberToken": "Temporada {seasonNumber}",
"PreferredSize": "Tamaño preferido",
"TypeOfList": "Lista {typeOfList}",
"UiSettingsLoadError": "No se pudo cargar las opciones de interfaz",
"UpdateMonitoring": "Actualizar monitorizando",
"ReleaseType": "Tipo de lanzamiento",
"RemotePathMappingLocalWrongOSPathHealthCheckMessage": "El cliente de descarga local {downloadClientName} ubica las descargas en {path} pero esta no es una ruta {osName} válida. Revisa las opciones de tu cliente de descarga.",
"RemotePathMappingWrongOSPathHealthCheckMessage": "El cliente de descarga remoto {downloadClientName} ubica las descargas en {path} pero esta no es una ruta {osName} válida. Revisa tus mapeos de ruta remota y las opciones del cliente de descarga.",
"RemoveFailedDownloadsHelpText": "Eliminar descargas fallidas desde el historial del cliente de descarga",
"RemoveFromQueue": "Eliminar de la cola",
"RemoveMultipleFromDownloadClientHint": "Elimina descargas y archivos del cliente de descarga",
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará las descargas y los archivos del cliente de descarga.",
"RemoveTagsAutomatically": "Eliminar etiquetas automáticamente",
"ReplaceIllegalCharactersHelpText": "Reemplaza los caracteres ilegales. Si no está marcado, {appName} los eliminará en su lugar",
"ResetAPIKey": "Restablecer clave API",
"RootFolder": "Carpeta raíz",
"RootFolderMultipleMissingHealthCheckMessage": "Múltiples carpetas raíz están perdidas: {rootFolderPaths}",
"RestartReloadNote": "Nota: {appName} se reiniciará automáticamente y recargará la interfaz durante el proceso de restauración.",
"RestartRequiredWindowsService": "Dependiendo de qué usuario esté ejecutando el servicio {appName}, puede ser necesario reiniciar {appName} como administrador antes de que el servicio se inicie automáticamente.",
"SeasonPremieresOnly": "Solo estrenos de temporada",
"SeasonPassTruncated": "Solo se muestran las últimas 25 temporadas, ve a detalles para ver todas las temporadas",
"SelectFolderModalTitle": "{modalTitle} - Seleccionar carpeta",
"SeriesDetailsCountEpisodeFiles": "{episodeFileCount} archivos de episodio",
"SeriesIndexFooterContinuing": "Continuando (Todos los episodios descargados)",
"SetIndexerFlagsModalTitle": "{modalTitle} - Establecer banderas del indexador",
"ShortDateFormat": "Formato de fecha breve",
"ShowUnknownSeriesItemsHelpText": "Muestra elementos sin una serie en la cola, esto incluiría series eliminadas, películas o cualquier cosa más en la categoría de {appName}",
"ShownClickToHide": "Mostrado, haz clic para ocultar",
"SkipFreeSpaceCheckWhenImportingHelpText": "Se usa cuando {appName} no puede detectar el espacio libre de tu carpeta raíz durante la importación de archivo",
"SmartReplace": "Reemplazo inteligente",
"SupportedDownloadClientsMoreInfo": "Para más información en los clientes de descarga individuales, haz clic en los botones de más información.",
"SupportedImportListsMoreInfo": "Para más información de los listas de importación individuales, haz clic en los botones de más información.",
"TorrentBlackholeSaveMagnetFilesReadOnlyHelpText": "En lugar de mover archivos esto indicará a {appName} que copie o enlace (dependiendo de los ajustes/configuración del sistema)",
"TorrentDelay": "Retraso de torrent",
"ToggleMonitoredToUnmonitored": "Monitorizado, haz clic para dejar de monitorizar",
"TorrentBlackholeSaveMagnetFilesHelpText": "Guarda el enlace magnet si no hay ningún archivo .torrent disponible (útil solo si el cliente de descarga soporta magnets guardados en un archivo)",
"UiLanguage": "Idioma de interfaz",
"UiLanguageHelpText": "Idioma que {appName} usará en la interfaz",
"UiSettingsSummary": "Opciones de calendario, fecha y color alterado",
"UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones",
"TotalRecords": "Total de registros: {totalRecords}",
"WantMoreControlAddACustomFormat": "¿Quieres más control sobre qué descargas son preferidas? Añade un [formato personalizado](/opciones/formatospersonalizados)",
"OrganizeModalHeader": "Organizar y renombrar",
"RemoveCompleted": "Eliminar completado",
"OpenBrowserOnStartHelpText": " Abre un navegador web y navega a la página de inicio de {appName} al iniciar la aplicación.",
"SslCertPath": "Ruta del certificado SSL",
"StartImport": "Iniciar importación",
"OptionalName": "Nombre opcional",
"RemotePath": "Ruta remota",
"SeriesPremiere": "Estreno de serie",
"SeriesMatchType": "Tipo de emparejamiento de series",
"SeriesMonitoring": "Monitorización de serie",
"Tba": "TBA",
"TorrentsDisabled": "Torrents deshabilitados",
"RemotePathMappingGenericPermissionsHealthCheckMessage": "El cliente de descarga {downloadClientName} ubica las descargas en {path} pero {appName} no puede ver este directorio. Puede que necesites ajustar los permisos de la carpeta.",
"ReplaceIllegalCharacters": "Reemplazar caracteres ilegales",
"ResetTitles": "Restablecer títulos",
"SmartReplaceHint": "Raya o barra espaciadora según el nombre",
"SelectEpisodesModalTitle": "{modalTitle} - Seleccionar episodio(s)",
"DownloadClientDelugeSettingsDirectory": "Directorio de descarga",
"DownloadClientDelugeSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación predeterminada de Deluge",
"UnmonitorSpecialsEpisodesDescription": "Dejar de monitorizar todos los episodios especiales sin cambiar el estado monitorizado de otros episodios",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicación opcional a la que mover las descargas completadas, dejar en blanco para usar la ubicación predeterminada de Deluge",
"DownloadClientDelugeSettingsDirectoryCompleted": "Directorio al que mover cuando se complete",
"NotificationsDiscordSettingsWebhookUrlHelpText": "URL de canal webhook de Discord",
"NotificationsEmailSettingsCcAddress": "Dirección(es) CC",
"NotificationsEmbySettingsSendNotifications": "Enviar notificaciones",
"NotificationsEmbySettingsUpdateLibraryHelpText": "¿Actualiza biblioteca en importar, renombrar o borrar?",
"NotificationsJoinSettingsDeviceIdsHelpText": "En desuso, usar Nombres de dispositivo en su lugar. Lista separada por coma de los IDs de dispositivo a los que te gustaría enviar notificaciones. Si no se establece, todos los dispositivos recibirán notificaciones.",
"NotificationsPushoverSettingsExpire": "Caduca",
"NotificationsMailgunSettingsSenderDomain": "Dominio del remitente",
"NotificationsNtfySettingsServerUrl": "URL del servidor",
"PreferProtocol": "Preferir {preferredProtocol}",
"ProfilesSettingsSummary": "Perfiles de calidad, de retraso de idioma y de lanzamiento",
"QualitiesHelpText": "Calidades superiores en la lista son más preferibles. Calidades dentro del mismo grupo son iguales. Comprobar solo calidades que se busquen",
"RssIsNotSupportedWithThisIndexer": "RSS no está soportado con este indexador",
"Repack": "Reempaquetar",
"NotificationsGotifySettingsPriorityHelpText": "Prioridad de la notificación",
"NotificationsGotifySettingsServer": "Servidor Gotify",
"NotificationsPlexSettingsAuthToken": "Token de autenticación",
"NotificationsSynologySettingsUpdateLibraryHelpText": "Llamada synoindex en localhost para actualizar un archivo de biblioteca",
"Overview": "Vista general",
"UseSeasonFolderHelpText": "Ordenar episodios en carpetas de temporada",
"RemotePathMappingDockerFolderMissingHealthCheckMessage": "Estás usando docker; el cliente de descarga {downloadClientName} ubica las descargas en {path} pero este directorio no parece existir dentro del contenedor. Revisa tus mapeos de ruta remotos y opciones de volumen del contenedor.",
"Retention": "Retención",
"NotificationsDiscordSettingsOnManualInteractionFields": "Campos durante la interacción manual",
"NotificationsDiscordSettingsOnGrabFields": "Campos al capturar",
"NotificationsDiscordSettingsOnImportFields": "Campos al importar",
"NotificationsDiscordSettingsOnImportFieldsHelpText": "Cambia los campos que se pasan para esta notificación 'al importar'",
"NotificationsDiscordSettingsOnManualInteractionFieldsHelpText": "Cambia los campos que se pasan para esta notificación 'durante la interacción manual'",
"NotificationsEmailSettingsCcAddressHelpText": "Lista separada por coma de destinatarios de e-mail cc",
"NotificationsEmailSettingsFromAddress": "De dirección",
"NotificationsKodiSettingAlwaysUpdateHelpText": "¿Actualiza la biblioteca incluso cuando un video se esté reproduciendo?",
"NotificationsKodiSettingsDisplayTime": "Tiempo de visualización",
"NotificationsLoadError": "No se pudo cargar las notificaciones",
"NotificationsMailgunSettingsApiKeyHelpText": "La clave API generada desde MailGun",
"NotificationsSendGridSettingsApiKeyHelpText": "La clave API generada por SendGrid",
"NotificationsTwitterSettingsConsumerKeyHelpText": "Clave de consumidor de una aplicación de Twitter",
"NotificationsTwitterSettingsDirectMessage": "Mensaje directo",
"NotificationsTwitterSettingsDirectMessageHelpText": "Envía un mensaje directo en lugar de un mensaje público",
"OnApplicationUpdate": "Al actualizar la aplicación",
"OnSeriesAdd": "Al añadir series",
"OnlyForBulkSeasonReleases": "Solo para lanzamientos de temporada a granel",
"OrganizeModalHeaderSeason": "Organizar y renombrar - {season}",
"OverrideGrabNoEpisode": "Al menos un episodio debe ser seleccionado",
"OverrideGrabNoQuality": "La calidad debe ser seleccionada",
"NotificationsValidationInvalidAuthenticationToken": "Token de autenticación inválido",
"NotificationsValidationUnableToConnect": "No se pudo conectar: {exceptionMessage}",
"NotificationsValidationUnableToSendTestMessageApiResponse": "No se pudo enviar un mensaje de prueba. Respuesta de la API: {error}",
"OverrideGrabModalTitle": "Sobrescribe y captura - {title}",
"ReleaseProfileTagSeriesHelpText": "Los perfiles de lanzamientos se aplicarán a series con al menos una etiqueta coincidente. Deja en blanco para aplicar a todas las series",
"ReleaseSceneIndicatorMappedNotRequested": "El episodio mapeado no fue solicitado en esta búsqueda.",
"RemotePathMappingBadDockerPathHealthCheckMessage": "Estás usando docker; el cliente de descarga {downloadClientName} ubica las descargas en {path} pero esta no es una ruta {osName} válida. Revisa tus mapeos de ruta remotos y opciones del cliente de descarga.",
"RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} puede ver pero no acceder al directorio de descarga {downloadPath}. Probablemente error de permisos.",
"RemotePathMappingHostHelpText": "El mismo host que especificaste para el cliente de descarga remoto",
"ParseModalUnableToParse": "No se pudo analizar el título proporcionado, por favor inténtalo de nuevo.",
"Preferred": "Preferido",
"Priority": "Prioridad",
"QualityProfileInUseSeriesListCollection": "No se puede borrar un perfil de calidad que está asignado a una serie, lista o colección",
"ReleaseProfile": "Perfil de lanzamiento",
"ReleaseProfileIndexerHelpText": "Especifica a qué indexador se aplica el perfil",
"RequiredHelpText": "Esta condición {implementationName} debe coincidir para el formato personalizado para aplicar. De otro modo una coincidencia sencilla {implementationName} es suficiente.",
"RemotePathMappingsLoadError": "No se pudo cargar los mapeos de ruta remota",
"RestartLater": "Reiniciaré más tarde",
"RootFoldersLoadError": "No se pudo cargar las carpetas raíz",
"RssSync": "Sincronización RSS",
"RssSyncIntervalHelpTextWarning": "Esto se aplicará a todos los indexadores, por favor sigue las reglas establecidas por ellos",
"Score": "Puntuación",
"SearchFailedError": "La búsqueda falló, por favor inténtalo de nuevo más tarde.",
"SearchForMonitoredEpisodes": "Buscar episodios monitorizados",
"SearchIsNotSupportedWithThisIndexer": "La búsqueda no está soportada con este indexador",
"SearchMonitored": "Buscar monitorizados",
"SeasonPack": "Pack de temporada",
"SeriesCannotBeFound": "Lo siento, esta serie no puede ser encontrada.",
"SeriesEditRootFolderHelpText": "Mover series a la misma carpeta raíz se puede usar para renombrar carpetas de series para coincidir el título actualizado o el formato de nombrado",
"SeriesFolderFormat": "Formato de carpeta de serie",
"SeriesIndexFooterDownloading": "Descargando (Uno o más episodios)",
"SeriesIndexFooterMissingMonitored": "Episodios perdidos (Serie monitorizada)",
"SeriesProgressBarText": "{episodeFileCount} / {episodeCount} (Total: {totalEpisodeCount}, Descargando: {downloadingCount})",
"UpgradesAllowed": "Actualizaciones permitidas",
"VideoCodec": "Códec de vídeo",
"SeriesTitleToExcludeHelpText": "El nombre de la serie a excluir",
"Shutdown": "Apagar",
"TestAll": "Probar todo",
"UseProxy": "Usar proxy",
"Repeat": "Repetir",
"Replace": "Reemplazar",
"RemoveCompletedDownloadsHelpText": "Elimina las descargas importadas desde el historial del cliente de descarga",
"RemoveQueueItemRemovalMethod": "Método de eliminación",
"RemotePathMappingFilesBadDockerPathHealthCheckMessage": "Estás usando docker; el cliente de descarga {downloadClientName} reportó archivos en {path} pero esta no es una ruta {osName} válida. Revisa tus mapeos de ruta remotos y opciones del cliente de descarga.",
"RemoveCompletedDownloads": "Eliminar descargas completadas",
"RemoveFromDownloadClientHint": "Elimina la descarga y archivo(s) del cliente de descarga",
"EpisodeRequested": "Episodio requerido",
"NotificationsEmailSettingsServer": "Servidor",
"NotificationsEmailSettingsServerHelpText": "Nombre de host o IP del servidor de e-mail",
"NotificationsGotifySettingsAppTokenHelpText": "El token de aplicación generado por Gotify",
"NotificationsGotifySettingsServerHelpText": "URL de servidor de Gotify, incluyendo http(s):// y puerto si es necesario",
"NotificationsJoinSettingsDeviceIds": "IDs de dispositivo",
"NotificationsJoinValidationInvalidDeviceId": "Los IDs de dispositivo parecen inválidos.",
"NotificationsKodiSettingAlwaysUpdate": "Actualizar siempre",
"NotificationsPushcutSettingsApiKeyHelpText": "Las claves API pueden ser gestionadas en la vista Cuenta de la aplicación Pushcut",
"NotificationsPushcutSettingsNotificationName": "Nombre de notificación",
"NotificationsPushoverSettingsRetryHelpText": "Intervalo para reintentar las alertas de emergencia, mínimo 30 segundos",
"NotificationsSettingsUpdateLibrary": "Actualizar biblioteca",
"NotificationsSettingsUpdateMapPathsTo": "Mapear rutas a",
"NotificationsSignalSettingsSenderNumberHelpText": "Número de teléfono del emisor registrado en signal-api",
"NotificationsSlackSettingsChannelHelpText": "Sobrescribe el canal predeterminado para el webhook entrante (#otro-canal)",
"NotificationsSlackSettingsIcon": "Icono",
"NotificationsSynologyValidationInvalidOs": "Debe ser un Synology",
"NotificationsSynologyValidationTestFailed": "No es Synology o synoindex no está disponible",
"NotificationsTelegramSettingsBotToken": "Token de bot",
"NotificationsTelegramSettingsChatId": "ID de chat",
"NotificationsTelegramSettingsTopicIdHelpText": "Especifica una ID de tema para enviar notificaciones a ese tema. Deja en blanco para usar el tema general (solo supergrupos)",
"NotificationsTraktSettingsAccessToken": "Token de acceso",
"NotificationsTraktSettingsAuthUser": "Autenticar usuario",
"NotificationsTwitterSettingsAccessToken": "Token de acceso",
"NotificationsTwitterSettingsAccessTokenSecret": "Token secreto de acceso",
"NotificationsTwitterSettingsConsumerKey": "Clave de consumidor",
"NotificationsTwitterSettingsMention": "Mención",
"NotificationsTwitterSettingsMentionHelpText": "Menciona este usuario en tweets enviados",
"NotificationsValidationInvalidAccessToken": "Token de acceso inválido",
"NotificationsValidationInvalidApiKey": "Clave API inválida",
"ParseModalErrorParsing": "Error analizando, por favor inténtalo de nuevo.",
"ParseModalHelpText": "Introduce un título de lanzamiento en la entrada anterior",
"SearchByTvdbId": "También puedes buscar usando la ID de TVDB de un show. P. ej. tvdb:71663",
"SearchForAllMissingEpisodesConfirmationCount": "¿Estás seguro que quieres buscar los {totalRecords} episodios perdidos?",
"SeriesType": "Tipo de serie",
"TagCannotBeDeletedWhileInUse": "La etiqueta no puede ser borrada mientras esté en uso",
"UnmonitorSpecialEpisodes": "Dejar de monitorizar especiales",
"UpdateStartupTranslocationHealthCheckMessage": "No se puede instalar la actualización porque la carpeta de inicio '{startupFolder}' está en una carpeta de translocalización de la aplicación.",
"Yesterday": "Ayer",
"RemoveQueueItemRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará la descarga y el archivo(s) del cliente de descarga.",
"RemotePathMappingLocalFolderMissingHealthCheckMessage": "El cliente de descarga remoto {downloadClientName} ubica las descargas en {path} pero este directorio no parece existir. Probablemente mapeo de ruta remota perdido o incorrecto.",
"RemotePathMappingsInfo": "Los mapeos de ruta remota son muy raramente solicitados, si {appName} y tu cliente de descarga están en el mismo sistema es mejor coincidir sus rutas. Para más información mira la [wiki]({wikiLink})",
"UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización",
"NotificationsTelegramSettingsChatIdHelpText": "Debes comenzar una conversación con el bot o añádelo a tu grupo para recibir mensajes",
"NotificationsEmailSettingsRecipientAddressHelpText": "Lista separada por coma de destinatarios de e-mail",
"NotificationsTwitterSettingsConnectToTwitter": "Conectar a Twitter / X",
"NotificationsValidationInvalidApiKeyExceptionMessage": "Clave API inválida: {exceptionMessage}",
"NotificationsJoinSettingsApiKeyHelpText": "La clave API de tus ajustes de Añadir cuenta (haz clic en el botón Añadir API).",
"NotificationsPushBulletSettingsDeviceIdsHelpText": "Lista de IDs de dispositivo (deja en blanco para enviar a todos los dispositivos)",
"NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')",
"ReleaseProfileIndexerHelpTextWarning": "Establecer un indexador específico en un perfil de lanzamiento provocará que este perfil solo se aplique a lanzamientos desde ese indexador."
}

View File

@@ -2,7 +2,7 @@
"RecycleBinUnableToWriteHealthCheckMessage": "Määritettyyn roskakorikansioon ei voida tallentaa: {path}. Varmista että sijainti on olemassa ja että sovelluksen suorittavalla käyttäjällä on siihen kirjoitusoikeus.",
"RemotePathMappingDownloadPermissionsEpisodeHealthCheckMessage": "{appName} näkee ladatun jakson \"{path}\", mutta ei voi avata sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.",
"Added": "Lisäysaika",
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.",
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää",
"DownloadClientSortingHealthCheckMessage": "Lataustyökalun \"{downloadClientName}\" {sortingMode} on kytketty käyttöön {appName}in kategorialle ja tuontiongelmien välttämiseksi se tulisi poistaa käytöstä.",
"IndexerRssNoIndexersEnabledHealthCheckMessage": "RSS-synkronointia varten ei ole määritetty tietolähteitä ja tämän vuoksi {appName} ei kaappaa uusia julkaisuja automaattisesti.",
"IndexerSearchNoInteractiveHealthCheckMessage": "Manuaalihaulle ei ole määritetty tietolähteitä, eikä se sen vuoksi löydä tuloksia.",
@@ -15,7 +15,7 @@
"GrabId": "Kaappauksen tunniste",
"BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.",
"BrowserReloadRequired": "Käyttöönotto vaatii selaimen sivupäivityksen.",
"CustomFormatHelpText": "Julkaisut pisteytetään niitä vastaavien mukautettujen muotojen pisteiden yhteenlaskun summalla. Julkaisu kaapataan, jos se parantaa pisteytystä nykyisellä tai sitä paremmalla laadulla.",
"CustomFormatHelpText": "Julkaisut pisteytetään niitä vastaavien mukautettujen muotojen pisteiden yhteenlaskun summalla. {appName} tallentaa julkaisun, jos se parantaa arvosanaa nykyisellä laadulla tai parempaa.",
"RemotePathMappingHostHelpText": "Sama osoite, joka on määritty etälataustyökalulle.",
"AudioLanguages": "Äänen kielet",
"Grabbed": "Kaapattu",
@@ -25,7 +25,6 @@
"OriginalLanguage": "Alkuperäinen kieli",
"ProxyResolveIpHealthCheckMessage": "Määritetyn välityspalvelimen \"{proxyHostName}\" IP-osoitteen selvitys epäonnistui.",
"SetPermissionsLinuxHelpText": "Tulisiko chmod suorittaa, kun tiedostoja tuodaan/nimetään uudelleen?",
"UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.",
"SetPermissionsLinuxHelpTextWarning": "Jollet ole varma mitä nämä asetukset tekevät, älä muuta niitä.",
"ClickToChangeLanguage": "Vaihda kieli painamalla tästä",
"EnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin.",
@@ -47,7 +46,7 @@
"AutomaticUpdatesDisabledDocker": "Automaattisia päivityksiä ei tueta suoraan käytettäessä Dockerin päivitysmekanismia. Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava komentosarjalla.",
"AddListExclusionSeriesHelpText": "Estä {appName}ia lisäämästä sarjaa listoilta.",
"AppUpdated": "{appName} on päivitetty",
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.",
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana",
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.",
"DeleteTag": "Poista tunniste",
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen. ",
@@ -164,7 +163,7 @@
"OnGrab": "Kun julkaisu kaapataan",
"DownloadClientQbittorrentValidationCategoryAddFailureDetail": "{appName} ei voinut lisätä tunnistetta qBittorrentiin.",
"SeriesFolderFormat": "Sarjakansioiden kaava",
"TagDetails": "Tunnisteen \"{0}\" tiedot",
"TagDetails": "Tunnisteen \"{label}\" tiedot",
"DownloadClientStatusSingleClientHealthCheckMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {downloadClientNames}",
"DownloadClientValidationCategoryMissing": "Kategoriaa ei ole olemassa",
"EditSelectedDownloadClients": "Muokkaa valittuja lataustyökaluja",
@@ -397,7 +396,7 @@
"DelayProfilesLoadError": "Virhe ladattaessa viiveprofiileja",
"DeleteDownloadClient": "Poista lataustyökalu",
"DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?",
"DeleteIndexerMessageText": "Haluatko varmasti poistaa tietolähteen \"{0}\"?",
"DeleteIndexerMessageText": "Haluatko varmasti poistaa tietolähteen '{name}'?",
"DeleteRootFolderMessageText": "Haluatko varmasti poistaa juurikansion \"{path}\"?",
"DeleteReleaseProfileMessageText": "Haluatko varmasti poistaa julkaisuprofiilin \"{name}\"?",
"DeleteSelectedIndexers": "Poista tietoläh(de/teet)",
@@ -504,7 +503,7 @@
"RefreshAndScan": "Päivitä ja tarkista",
"Refresh": "Päivitä",
"ReleaseProfilesLoadError": "Virhe ladattaessa julkaisuprofiileita",
"RemotePathMappingLocalFolderMissingHealthCheckMessage": "Etälataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.",
"RemotePathMappingLocalFolderMissingHealthCheckMessage": "Etälataustyökalu \"{downloadClientName}\" tallentaa lataukset kohteeseen \"{path}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.",
"DownloadClientDelugeValidationLabelPluginFailureDetail": "{appName} ei voinut lisätä Label-tunnistetta {clientName}en.",
"DownloadClientDelugeValidationLabelPluginInactive": "Label-tunnistelisäosa ei ole käytössä.",
"AddConditionImplementation": "Lisätään ehtoa - {implementationName}",
@@ -526,7 +525,7 @@
"ResetTitles": "Palauta nimet",
"RestartLater": "Käynnistän uudelleen myöhemmin",
"RestartReloadNote": "Huomioi: {appName} käynnistyy palautusprosessin aikana automaattisesti uudelleen.",
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.",
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii in uudelleenkäynnistyksen.",
"Runtime": "Kesto",
"Season": "Kausi",
"SeasonFolder": "Kausikohtaiset kansiot",
@@ -612,7 +611,7 @@
"EditSeriesModalHeader": "Muokataan - {title}",
"EnableInteractiveSearch": "Käytä manuaalihakuun",
"EnableRssHelpText": "Käytetään {appName}in etsiessä julkaisuja ajoitetusti RSS-synkronoinnilla.",
"EnableSslHelpText": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.",
"EnableSslHelpText": "Käyttöönotto vaatii in uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.",
"EpisodeFileRenamedTooltip": "Jaksotiedosto nimettiin uudelleen",
"EpisodeInfo": "Jakson tiedot",
"EpisodeFilesLoadError": "Virhe ladattaessa jaksotiedostoja",
@@ -706,7 +705,7 @@
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.",
"PreferProtocol": "Suosi {preferredProtocol}-protokollaa",
"RemotePathMappings": "Etäsijaintien kohdistukset",
"RemotePathMappingRemoteDownloadClientHealthCheckMessage": "Etälataustyökalu \"{0}\" ilmoitti tiedostosijainniksi \"{1}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.",
"RemotePathMappingRemoteDownloadClientHealthCheckMessage": "Etälataustyökalu \"{downloadClientName}\" ilmoitti tiedostosijainniksi \"{path}\", mutta sitä ei näytä olevan olemassa. Todennäköinen syy on puuttuva tai virheellinen etäsijainnin kohdistus.",
"Scheduled": "Ajoitukset",
"RootFolders": "Juurikansiot",
"RssSyncInterval": "RSS-synkronoinnin ajoitus",
@@ -817,7 +816,7 @@
"AnimeEpisodeTypeFormat": "Absoluuttinen jaksonumerointi ({format})",
"AnimeEpisodeTypeDescription": "Jaksot julkaistaan absoluuttisella numeroinnilla.",
"CalendarLegendEpisodeDownloadedTooltip": "Jakso on ladattu ja lajiteltu",
"BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.",
"BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara",
"CollapseMultipleEpisodesHelpText": "Tiivistä useat samana päivänä esitettävät jaksot.",
"CalendarLegendSeriesFinaleTooltip": "Sarjan tai kauden päätösjakso",
"CalendarLegendSeriesPremiereTooltip": "Sarjan tai kauden pilottijakso",
@@ -841,7 +840,7 @@
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?",
"DeleteSelectedDownloadClients": "Poista lataustyökalu(t)",
"DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?",
"DeleteCustomFormatMessageText": "Haluatko varmasti poistaa mukautetun muodon \"{customFormatName}\"?",
"DeleteCustomFormatMessageText": "Haluatko varmasti poistaa mukautetun muodon \"{name}\"?",
"DeleteRemotePathMapping": "Poista etäsijainnin kohdistus",
"DeleteSelectedImportLists": "Poista tuontilista(t)",
"DetailedProgressBar": "Yksityiskohtainen tilapalkki",
@@ -900,7 +899,7 @@
"FormatDateTimeRelative": "{relativeDay}, {formattedDate} {formattedTime}",
"HardlinkCopyFiles": "Hardlink/tiedostojen kopiointi",
"ExternalUpdater": "{appName} on määritetty käyttämään ulkoista päivitysratkaisua.",
"GrabReleaseUnknownSeriesOrEpisodeMessageText": "{appName} ei tunnista mihin sarjalle ja jaksolle julkaisu kuuluu, eikä sen automaattinen tuonti onnistu. Haluatko kaapata julkaisun \"{0}\"?",
"GrabReleaseUnknownSeriesOrEpisodeMessageText": "{appName} ei tunnista mihin sarjalle ja jaksolle julkaisu kuuluu, eikä sen automaattinen tuonti onnistu. Haluatko kaapata julkaisun \"{title}\"?",
"FailedToUpdateSettings": "Asetusten päivitys epäonnistui",
"Forums": "Keskustelualue",
"ErrorLoadingPage": "Virhe ladattaessa sivua",
@@ -946,7 +945,7 @@
"QualityCutoffNotMet": "Laadun katkaisutasoa ei ole saavutettu",
"ProtocolHelpText": "Valitse käytettävä(t) protokolla(t) ja mitä käytetään ensisijaisesti valittaessa muutoin tasaveroisista julkaisuista.",
"QualityDefinitionsLoadError": "Virhe ladattaessa laatumäärityksiä",
"RemotePathMappingLocalWrongOSPathHealthCheckMessage": "Paikallinen lataustyökalu \"{0}\" tallentaa lataukset kohteeseen \"{1}\", mutta se ei ole kelvollinen {2}-sijainti. Tarkista lataustyökalun asetukset.",
"RemotePathMappingLocalWrongOSPathHealthCheckMessage": "Paikallinen lataustyökalu \"{downloadClientName}\" tallentaa lataukset kohteeseen \"{path}\", mutta se ei ole kelvollinen {osName}-sijainti. Tarkista lataustyökalun asetukset.",
"RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "Paikallinen lataustyökalu \"{downloadClientName}\" ilmoitti tiedostosijainniksi \"{path}\", mutta se ei ole kelvollinen {osName}-sijainti. Tarkista lataustyökalun asetukset.",
"RemoveDownloadsAlert": "Poistoasetukset on siirretty yllä olevan taulukon lataustyökalukohtaisiin asetuksiin.",
"QualityProfile": "Laatuprofiili",
@@ -1084,7 +1083,7 @@
"UtcAirDate": "UTC-esitysaika",
"FileManagement": "Tiedostojen hallinta",
"InteractiveImportNoEpisode": "Jokaiselle valitulle tiedostolle on valittava ainakin yksi jakso.",
"ApiKeyValidationHealthCheckMessage": "Muuta rajapinnan (API) avain ainakin {length} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa.",
"ApiKeyValidationHealthCheckMessage": "Muuta rajapinnan (API) avain ainakin {length} merkin pituiseksi. Voit tehdä tämän asetuksista tai muokkaamalla asetustiedostoa",
"Conditions": "Ehdot",
"MinimumCustomFormatScore": "Mukautetun muodon vähimmäispisteytys",
"Period": "Piste",
@@ -1122,7 +1121,7 @@
"RecyclingBinCleanup": "Roskakorin tyhjennys",
"RecyclingBinCleanupHelpText": "Arvo \"0\" (nolla) poistaa automaattisen tyhjennyksen käytöstä.",
"ReleaseSceneIndicatorAssumingScene": "Oletetuksena kohtausnumerointi.",
"ConditionUsingRegularExpressions": "Ehto vastaa säännöllisiä lausekkeita. Huomioi, että merkeillä \"\\^$.|?*+()[{\" on erityismerkityksiä ja ne on erotettava \"\\\"-merkillä.",
"ConditionUsingRegularExpressions": "Ehto vastaa säännöllisiä lausekkeita. Huomioi, että merkeillä `\\^$.|?*+()[{`on erityismerkityksiä ja ne on erotettava `\\`-merkillä",
"CreateGroup": "Luo ryhmä",
"Custom": "Mukautettu",
"CustomFormatJson": "Mukautetun muodon JSON-koodi",
@@ -1202,7 +1201,7 @@
"CountSelectedFile": "{selectedCount} tiedosto on valittu",
"SingleEpisodeInvalidFormat": "Yksittäinen jakso: virheellinen kaava",
"Underscore": "Alaviiva",
"AllSeriesInRootFolderHaveBeenImported": "Kaikki sijainnin {path} sisältämät sarjat on tuotu.",
"AllSeriesInRootFolderHaveBeenImported": "Kaikki sijainnin {path} sisältämät sarjat on tuotu",
"AlreadyInYourLibrary": "Kohde on jo krijastossasi",
"Analytics": "Analytiikka",
"AuthenticationRequired": "Vaadi tunnistautuminen",
@@ -1226,7 +1225,7 @@
"DestinationRelativePath": "Kohde suhteessa polkuun",
"Disabled": "Ei käytössä",
"Dates": "Päiväykset",
"DeleteAutoTagHelpText": "Haluatko varmasti poistaa automaattitunnisteen '\"0}\"?",
"DeleteAutoTagHelpText": "Haluatko varmasti poistaa automaattitunnisteen '{name}'?",
"DeleteAutoTag": "Poista automaattitunniste",
"DotNetVersion": ".NET",
"DownloadClientPneumaticSettingsStrmFolder": "Strm-kansio",
@@ -1396,7 +1395,6 @@
"NotificationsValidationInvalidUsernamePassword": "Virheellinen käyttäjätunnus tai salasana",
"QueueFilterHasNoItems": "Mikään kohde ei vastaa valittua jonon suodatinta",
"RegularExpression": "Säännöllinen lauseke",
"ReleaseProfileIndexerHelpTextWarning": "Tietyn tietolähteen käyttö julkaisuprofiileilla saattaa aiheuttaa julkaisujen kaksoiskappaleiden kaappauksia.",
"ReleaseSceneIndicatorUnknownMessage": "Jakson numerointi vaihtelee, eikä julkaisu vastaa mitään tunnettua numerointia.",
"DownloadClientSabnzbdValidationEnableJobFolders": "Käytä työkansioita",
"EpisodeFileDeleted": "Jaksotiedosto poistettiin",
@@ -1619,7 +1617,7 @@
"NotificationsPushBulletSettingsDeviceIds": "Laite-ID:t",
"NotificationsKodiSettingsDisplayTime": "Näytä aika",
"NotificationsSettingsWebhookUrl": "Webhook-URL-osoite",
"NotificationsSettingsUseSslHelpText": "Muodosta yhteys SSL-protokollan välityksellä.",
"NotificationsSettingsUseSslHelpText": "Muodosta yhteys sovellukseen {serviceName} SSL-protokollan välityksellä.",
"NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).",
"NotificationsSettingsUpdateMapPathsTo": "Kohdista sijainnit kohteeseen",
"NotificationsTelegramSettingsChatIdHelpText": "Vastaanottaaksesi viestejä, sinun on aloitettava keskustelu botin kanssa tai lisättävä se ryhmääsi.",

View File

@@ -109,13 +109,13 @@
"AutoRedownloadFailedHelpText": "Recherche automatique et tentative de téléchargement d'une version différente",
"AutoTaggingLoadError": "Impossible de charger le balisage automatique",
"AuthenticationRequiredWarning": "Pour empêcher l'accès à distance sans authentification, {appName} exige désormais que l'authentification soit activée. Vous pouvez éventuellement désactiver l'authentification pour les adresses locales.",
"BackupFolderHelpText": "Les chemins d'accès relatifs se trouvent dans le répertoire AppData de Sonarr",
"BackupFolderHelpText": "Les chemins d'accès relatifs se trouvent dans le répertoire AppData de {appName}",
"AirDate": "Date de diffusion",
"AllTitles": "Tous les titres",
"AutoAdd": "Ajout automatique",
"AutoTagging": "Balisage automatique",
"AutoTaggingNegateHelpText": "Si cette case est cochée, la règle de marquage automatique ne s'appliquera pas si la condition {implementationName} est remplie.",
"AutoTaggingRequiredHelpText": "Cette condition {implementationName} doit être remplie pour que la règle de marquage automatique s'applique. Dans le cas contraire, une seule correspondance {implementationName} suffit.",
"AutoTaggingNegateHelpText": "Si cette case est cochée, la règle de marquage automatique ne s'appliquera pas si cette condition {implementationName} correspond.",
"AutoTaggingRequiredHelpText": "Cette condition {implementationName} doit correspondre pour que la règle de marquage automatique s'applique. Sinon, une seule correspondance {implementationName} suffit.",
"AllResultsAreHiddenByTheAppliedFilter": "Tous les résultats sont masqués par le filtre appliqué",
"ApplyTagsHelpTextReplace": "Remplacer : remplace les étiquettes par les étiquettes renseignées (ne pas renseigner d'étiquette pour toutes les effacer)",
"Agenda": "Agenda",
@@ -150,30 +150,30 @@
"AnimeEpisodeTypeDescription": "Episodes diffusés en utilisant un numéro d'épisode absolu",
"Any": "Tous",
"AppUpdated": "{appName} mis à jour",
"AddListExclusionSeriesHelpText": "Empêcher les séries d'être ajoutées à Sonarr par des listes",
"AddListExclusionSeriesHelpText": "Empêcher les séries d'être ajoutées à {appName} par des listes",
"AllSeriesAreHiddenByTheAppliedFilter": "Tous les résultats sont masqués par le filtre appliqué",
"AnalyseVideoFilesHelpText": "Extraire des fichiers des informations vidéo telles que la résolution, la durée d'exécution et le codec. Pour ce faire, Sonarr doit lire des parties du fichier, ce qui peut entraîner une activité élevée du disque ou du réseau pendant les analyses.",
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs aux serveurs de Sonarr. Cela inclut des informations sur votre navigateur, les pages de l'interface Web de Sonarr que vous utilisez, les rapports d'erreurs ainsi que le système d'exploitation et la version d'exécution. Nous utiliserons ces informations pour prioriser les fonctionnalités et les corrections de bugs.",
"AnalyseVideoFilesHelpText": "Extraire des fichiers des informations vidéo telles que la résolution, la durée d'exécution et le codec. Pour ce faire, {appName} doit lire des parties du fichier, ce qui peut entraîner une activité élevée du disque ou du réseau pendant les analyses.",
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs aux serveurs de {appName}. Cela inclut des informations sur votre navigateur, les pages de l'interface Web de {appName} que vous utilisez, les rapports d'erreurs ainsi que le système d'exploitation et la version d'exécution. Nous utiliserons ces informations pour prioriser les fonctionnalités et les corrections de bugs.",
"AuthenticationMethodHelpTextWarning": "Veuillez choisir une méthode d'authentification valide",
"AuthenticationRequiredHelpText": "Modifier les demandes pour lesquelles l'authentification est requise. Ne rien modifier si vous n'en comprenez pas les risques.",
"AutomaticUpdatesDisabledDocker": "Les mises à jour automatiques ne sont pas directement prises en charge lors de l'utilisation du mécanisme de mise à jour de Docker. Vous devrez mettre à jour l'image du conteneur en dehors de {appName} ou utiliser un script",
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de rétention seront nettoyées automatiquement",
"QualityProfile": "Profil de qualité",
"RemotePathMappingDownloadPermissionsEpisodeHealthCheckMessage": "Sonarr peut voir mais ne peut pas accéder à l'épisode téléchargé {path}. Probablement une erreur de permissions.",
"RemotePathMappingDownloadPermissionsEpisodeHealthCheckMessage": "{appName} peut voir mais ne peut pas accéder à l'épisode téléchargé {path}. Probablement une erreur de permissions.",
"RemotePathMappingDockerFolderMissingHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement {downloadClientName} place les téléchargements dans {path}, mais ce répertoire ne semble pas exister dans le conteneur. Vérifiez vos mappages de chemins d'accès distants et les paramètres de volume du conteneur.",
"BlocklistReleases": "Publications de la liste de blocage",
"BindAddress": "Adresse de liaison",
"BackupsLoadError": "Impossible de charger les sauvegardes",
"BuiltIn": "Intégré",
"BrowserReloadRequired": "Rechargement du navigateur requis",
"BypassDelayIfAboveCustomFormatScore": "Ignorer si le score est supérieur au format personnalisé",
"BypassDelayIfAboveCustomFormatScore": "Ignorer si le score du format personnalisé est supérieur",
"CheckDownloadClientForDetails": "Pour plus de détails, consultez le client de téléchargement",
"ChooseAnotherFolder": "Sélectionnez un autre dossier",
"BlocklistLoadError": "Impossible de charger la liste de blocage",
"BranchUpdate": "Branche à utiliser pour mettre à jour Sonarr",
"BranchUpdate": "Branche à utiliser pour mettre à jour {appName}",
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Score minimum pour le format personnalisé",
"CalendarLoadError": "Impossible de charger le calendrier",
"BypassDelayIfAboveCustomFormatScoreHelpText": "Ignorer lorsque la version a un score supérieur au score minimum configuré pour le format personnalisé",
"BypassDelayIfAboveCustomFormatScoreHelpText": "Activer le contournement lorsque la libération a un score supérieur au score minimum configuré pour le format personnalisé",
"CertificateValidationHelpText": "Modifier le niveau de rigueur de la validation de la certification HTTPS. Ne pas modifier si vous ne maîtrisez pas les risques.",
"Certification": "Certification",
"ChangeFileDateHelpText": "Modifier la date du fichier lors de l'importation/la réanalyse",
@@ -208,7 +208,7 @@
"RemotePathMappingBadDockerPathHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement {downloadClientName} place les téléchargements dans {path} mais ce n'est pas un chemin {osName} valide. Revoyez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.",
"RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "Le client de téléchargement local {downloadClientName} a signalé des fichiers dans {path}, mais il ne s'agit pas d'un chemin {osName} valide. Vérifiez les paramètres de votre client de téléchargement.",
"RemotePathMappingFilesWrongOSPathHealthCheckMessage": "Le client de téléchargement distant {downloadClientName} a signalé des fichiers dans {path}, mais il ne s'agit pas d'un chemin {osName} valide. Revoyez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.",
"RemotePathMappingFolderPermissionsHealthCheckMessage": "Sonarr peut voir mais ne peut pas accéder au répertoire de téléchargement {downloadPath}. Il s'agit probablement d'une erreur de permissions.",
"RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} peut voir mais ne peut pas accéder au répertoire de téléchargement {downloadPath}. Il s'agit probablement d'une erreur de permissions.",
"Path": "Chemin",
"QueueIsEmpty": "La file d'attente est vide",
"Warn": "Avertissement",
@@ -243,9 +243,9 @@
"Edit": "Modifier",
"RemoveSelectedItem": "Supprimer l'élément sélectionné",
"SubtitleLanguages": "Langues des sous-titres",
"Clone": "Cloner",
"Clone": "Dupliquer",
"ColonReplacementFormatHelpText": "Changer la manière dont {appName} remplace les « deux-points »",
"DefaultCase": "Casse par défaut",
"DefaultCase": "Case par défaut",
"Delete": "Supprimer",
"DelayProfiles": "Profils de retard",
"DelayProfilesLoadError": "Impossible de charger les profils de retard",
@@ -304,7 +304,7 @@
"NoIndexersFound": "Aucun indexeur n'a été trouvé",
"Profiles": "Profils",
"Dash": "Tiret",
"DelayProfileProtocol": "Protocole : {preferredProtocol}",
"DelayProfileProtocol": "Protocole: {preferredProtocol}",
"DeleteBackupMessageText": "Voulez-vous supprimer la sauvegarde « {name} » ?",
"DeleteConditionMessageText": "Voulez-vous vraiment supprimer la condition « {name} » ?",
"DeleteCondition": "Supprimer la condition",
@@ -322,7 +322,7 @@
"Host": "Hôte",
"ICalIncludeUnmonitoredEpisodesHelpText": "Inclure les épisodes non surveillés dans le flux iCal",
"RenameEpisodesHelpText": "{appName} utilisera le nom de fichier existant si le changement de nom est désactivé",
"RestartRequiredToApplyChanges": "{appName} nécessite un redémarrage pour appliquer les modifications. Voulez-vous redémarrer maintenant ?",
"RestartRequiredToApplyChanges": "{appName} nécessite un redémarrage pour appliquer les changements, voulez-vous redémarrer maintenant ?",
"OrganizeRenamingDisabled": "Le renommage est désactivé, rien à renommer",
"PendingChangesStayReview": "Rester et vérifier les modifications",
"PendingChangesMessage": "Vous avez des modifications non sauvegardées, voulez-vous vraiment quitter cette page ?",
@@ -378,7 +378,7 @@
"OneSeason": "1 saison",
"Ok": "OK",
"PendingChangesDiscardChanges": "Abandonner les modifications et quitter",
"PreferProtocol": "Préféré {preferredProtocol}",
"PreferProtocol": "Préférer {preferredProtocol}",
"Refresh": "Rafraîchir",
"PrefixedRange": "Plage préfixée",
"PreferredProtocol": "Protocole préféré",
@@ -451,7 +451,7 @@
"PrioritySettings": "Priorité: {priority}",
"ImportExistingSeries": "Importer une série existante",
"RootFolderSelectFreeSpace": "{freeSpace} Libre",
"WantMoreControlAddACustomFormat": "Vous voulez plus de contrôle sur les téléchargements préférés ? Ajouter un [Format Personnalisé](/settings/customformats)",
"WantMoreControlAddACustomFormat": "Vous souhaitez avoir plus de contrôle sur les téléchargements préférés ? Ajoutez un [Format personnalisé](/settings/customformats)",
"RemoveSelectedItemsQueueMessageText": "Voulez-vous vraiment supprimer {selectedCount} éléments de la file d'attente ?",
"UpdateAll": "Tout actualiser",
"EnableSslHelpText": "Nécessite un redémarrage en tant qu'administrateur pour être effectif",
@@ -576,7 +576,7 @@
"MaximumSize": "Taille maximum",
"Mechanism": "Mécanisme",
"MediaInfo": "Informations médias",
"MediaInfoFootNote": "MediaInfo Full/AudioLanguages/SubtitleLanguages supporte un suffixe `:EN+DE` vous permettant de filtrer les langues incluses dans le nom de fichier. Utilisez `-DE` pour exclure des langues spécifiques. L'ajout de `+` (par exemple `:EN+`) affichera `[EN]`/`[EN+--]`/`[--]` en fonction des langues exclues. Par exemple `{MediaInfo Full:EN+DE}`.",
"MediaInfoFootNote": "MediaInfo Full/AudioLanguages/SubtitleLanguages supporte un suffixe `:EN+DE` vous permettant de filtrer les langues incluses dans le nom de fichier. Utilisez `-DE` pour exclure des langues spécifiques. En ajoutant `+` (par exemple `:EN+`), vous obtiendrez `[EN]`/`[EN+--]`/`[--]` en fonction des langues exclues. Par exemple `{MediaInfo Full:EN+DE}`.",
"MetadataProvidedBy": "Les métadonnées sont fournies par {provider}",
"MetadataSettings": "Paramètres des métadonnées",
"MetadataSettingsSeriesSummary": "Créez des fichiers de métadonnées lorsque les épisodes sont importés ou que les séries sont actualisées",
@@ -601,14 +601,14 @@
"MustNotContainHelpText": "La version sera rejetée si elle contient un ou plusieurs termes (insensible à la casse)",
"NamingSettings": "Paramètres de dénomination",
"Negate": "Nier",
"NegateHelpText": "Si cette case est cochée, le format personnalisé ne s'appliquera pas si cette condition {implementationName} correspond.",
"NegateHelpText": "Si coché, le format personnalisé ne s'appliquera pas si cette condition {implementationName} correspond.",
"Negated": "Nier",
"Network": "Réseau",
"Never": "Jamais",
"New": "Nouveau",
"NextExecution": "Prochaine exécution",
"NoChange": "Pas de changement",
"NoDelay": "Sans délais",
"NoDelay": "Pas de délai",
"NoEpisodeHistory": "Pas d'historique des épisodes",
"NoEpisodesInThisSeason": "Aucun épisode dans cette saison",
"NoEventsFound": "Aucun événement trouvé",
@@ -621,7 +621,7 @@
"Organize": "Organiser",
"OrganizeLoadError": "Erreur lors du chargement des aperçus",
"OrganizeModalHeader": "Organiser et renommer",
"OrganizeModalHeaderSeason": "Organiser et renommer {saison}",
"OrganizeModalHeaderSeason": "Organiser et renommer {season}",
"OrganizeSelectedSeriesModalAlert": "Astuce : Pour prévisualiser un changement de nom, sélectionnez \"Annuler\", puis sélectionnez n'importe quel titre de série et utilisez cette icône :",
"OrganizeSelectedSeriesModalConfirmation": "Voulez-vous vraiment organiser tous les fichiers des {count} séries sélectionnées ?",
"OrganizeSelectedSeriesModalHeader": "Organiser les séries sélectionnées",
@@ -651,10 +651,9 @@
"RelativePath": "Chemin relatif",
"Release": "Version",
"ReleaseGroup": "Groupe de versions",
"ReleaseGroups": "Groupes de versions",
"ReleaseGroups": "Groupes de version",
"ReleaseHash": "Somme de contrôle de la version",
"ReleaseProfile": "Profil de version",
"ReleaseProfileIndexerHelpTextWarning": "L'utilisation d'un indexeur spécifique avec des profils de version peut conduire à la saisie de versions en double",
"ReleaseProfiles": "Profils de version",
"ReleaseProfilesLoadError": "Impossible de charger les profils de version",
"RemotePathMappingGenericPermissionsHealthCheckMessage": "Le client de téléchargement {downloadClientName} place les téléchargements dans {path} mais {appName} ne peut pas voir ce répertoire. Vous devrez peut-être ajuster les autorisations du dossier.",
@@ -934,7 +933,7 @@
"OnGrab": "À saisir",
"OnlyForBulkSeasonReleases": "Uniquement pour les versions de saison en masse",
"RegularExpressionsCanBeTested": "Les expressions régulières peuvent être testées [ici]({url}).",
"ReleaseProfileIndexerHelpText": "Spécifiez à quel indexeur le profil s'applique",
"ReleaseProfileIndexerHelpText": "Spécifier l'indexeur auquel le profil s'applique",
"RemotePathMappings": "Mappages de chemins distants",
"RescanAfterRefreshHelpTextWarning": "{appName} ne détectera pas automatiquement les modifications apportées aux fichiers lorsqu'il n'est pas défini sur 'Toujours'",
"SingleEpisode": "Épisode unique",
@@ -988,13 +987,13 @@
"Min": "Min",
"MinimumAge": "Âge minimum",
"MinimumAgeHelpText": "Usenet uniquement : âge minimum en minutes des NZB avant leur saisie. Utilisez-le pour donner aux nouvelles versions le temps de se propager à votre fournisseur Usenet.",
"MinutesSixty": "60 Minutes: {sixty}",
"MinutesSixty": "60 Minutes : {sixty}",
"MonitoredOnly": "Surveillé uniquement",
"MoveSeriesFoldersDontMoveFiles": "Non, je déplacerai les fichiers moi-même",
"MoveSeriesFoldersMoveFiles": "Oui, déplacez les fichiers",
"MoveSeriesFoldersToNewPath": "Souhaitez-vous déplacer les fichiers de la série de « {originalPath} » vers « {destinationPath} » ?",
"MoveSeriesFoldersToRootFolder": "Souhaitez-vous déplacer les dossiers de la série vers « {DestinationRootFolder} » ?",
"MustContainHelpText": "Le communiqué doit contenir au moins un de ces termes (insensible à la casse)",
"MoveSeriesFoldersToRootFolder": "Souhaitez-vous déplacer les dossiers de la série vers « {destinationRootFolder} » ?",
"MustContainHelpText": "La version doit contenir au moins l'un des termes suivants (insensible à la casse)",
"MustNotContain": "Ne doit pas contenir",
"NamingSettingsLoadError": "Impossible de charger les paramètres de dénomination",
"NoEpisodeInformation": "Aucune information sur l'épisode n'est disponible.",
@@ -1054,7 +1053,7 @@
"Level": "Niveau",
"LibraryImport": "Importer biblio.",
"ListExclusionsLoadError": "Impossible de charger les exclusions de liste",
"ListQualityProfileHelpText": "Les éléments de la liste des profils de qualité seront ajoutés avec",
"ListQualityProfileHelpText": "Les éléments de la liste du profil de qualité seront ajoutés avec",
"ListTagsHelpText": "Balises qui seront ajoutées lors de l'importation à partir de cette liste",
"LocalAirDate": "Date de diffusion locale",
"Location": "Emplacement",
@@ -1067,7 +1066,7 @@
"MultiEpisode": "Multi-épisode",
"MultiEpisodeInvalidFormat": "Épisode multiple : format invalide",
"NoEpisodeOverview": "Aucun aperçu des épisodes",
"OneMinute": "1 Minute",
"OneMinute": "1 minute",
"OriginalLanguage": "Langue originale",
"Port": "Port",
"PreferTorrent": "Préféré Torrent",
@@ -1108,7 +1107,7 @@
"LibraryImportTipsSeriesUseRootFolder": "Pointez {appName} vers le dossier contenant toutes vos émissions de télévision, pas une en particulier. par exemple. \"`{goodFolderExample}`\" et non \"`{badFolderExample}`\". De plus, chaque série doit se trouver dans son propre dossier dans le dossier racine/bibliothèque.",
"Links": "Liens",
"ListOptionsLoadError": "Impossible de charger les options de la liste",
"ListRootFolderHelpText": "Les éléments de la liste du dossier racine seront ajoutés à",
"ListRootFolderHelpText": "Les éléments de la liste du dossier racine seront ajoutés à la liste des dossiers racine",
"MinutesThirty": "30 Minutes: {thirty}",
"Missing": "Manquant",
"MissingEpisodes": "Épisodes manquants",
@@ -1152,11 +1151,11 @@
"RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches",
"RemovedSeriesSingleRemovedHealthCheckMessage": "La série {series} a été supprimée de TheTVDB",
"Reorder": "Réorganiser",
"Repack": "Remballer",
"Repack": "Repack",
"RequiredHelpText": "Cette condition {implementationName} doit correspondre pour que le format personnalisé s'applique. Sinon, une seule correspondance {implementationName} suffit.",
"RescanSeriesFolderAfterRefresh": "Réanalyser le dossier de la série après l'actualisation",
"ResetAPIKey": "Réinitialiser la clé API",
"RestartRequiredWindowsService": "Selon l'utilisateur qui exécute le service {appName}, vous devrez peut-être redémarrer {appName} en tant qu'administrateur une fois avant que le service ne démarre automatiquement.",
"RestartRequiredWindowsService": "En fonction de l'utilisateur qui exécute le service {appName}, vous devrez peut-être redémarrer {appName} en tant qu'administrateur une fois avant que le service ne démarre automatiquement.",
"Restore": "Restaurer",
"RestoreBackup": "Restaurer la sauvegarde",
"RestrictionsLoadError": "Impossible de charger les restrictions",
@@ -1174,7 +1173,7 @@
"StartImport": "Démarrer l'importation",
"Started": "Démarré",
"StartupDirectory": "Répertoire de démarrage",
"SupportedAutoTaggingProperties": "{appName} prend en charge les propriétés suivantes pour les règles de marquage automatique",
"SupportedAutoTaggingProperties": "{appName} prend en charge les propriétés suivantes pour les règles d'étiquetage automatique",
"ToggleUnmonitoredToMonitored": "Non surveillé, cliquez pour surveiller",
"Torrents": "Torrents",
"Total": "Total",
@@ -1195,7 +1194,7 @@
"InstanceName": "Nom de l'instance",
"InteractiveImportLoadError": "Impossible de charger les éléments d'importation manuelle",
"InteractiveImportNoEpisode": "Un ou plusieurs épisodes doivent être choisis pour chaque fichier sélectionné",
"MappedNetworkDrivesWindowsService": "Les lecteurs réseau mappés ne sont pas disponibles lors de l'exécution en tant que service Windows, consultez la [FAQ](https://wiki.servarr.com/sonarr/faq#why-cant-sonarr-see-my-files-on-a-remote -serveur) pour plus d'informations.",
"MappedNetworkDrivesWindowsService": "Les lecteurs réseau mappés ne sont pas disponibles lors de l'exécution en tant que service Windows, consultez la [FAQ]({url}) pour plus d'informations.",
"SelectReleaseGroup": "Sélectionnez un groupe de versions",
"Tomorrow": "Demain",
"OverrideGrabNoSeries": "La série doit être sélectionnée",
@@ -1206,7 +1205,7 @@
"ReleaseSceneIndicatorAssumingScene": "En supposant la numérotation des scènes.",
"ReleaseSceneIndicatorAssumingTvdb": "En supposant la numérotation TVDB.",
"ReleaseSceneIndicatorMappedNotRequested": "L'épisode mappé n'a pas été demandé dans cette recherche.",
"SearchForQuery": "Rechercher {requête}",
"SearchForQuery": "Rechercher {query}",
"View": "Vues",
"HardlinkCopyFiles": "Lien physique/Copie de fichiers",
"Health": "Santé",
@@ -1251,7 +1250,7 @@
"DelayProfileSeriesTagsHelpText": "S'applique aux séries avec au moins une balise correspondante",
"DelayingDownloadUntil": "Retarder le téléchargement jusqu'au {date} à {time}",
"DeletedReasonManual": "Le fichier a été supprimé via l'interface utilisateur",
"DeleteRemotePathMapping": "Supprimer le mappage de chemin distant",
"DeleteRemotePathMapping": "Supprimer la correspondance de chemin distant",
"DestinationPath": "Chemin de destination",
"DestinationRelativePath": "Chemin relatif de destination",
"DownloadClientRootFolderHealthCheckMessage": "Le client de téléchargement {downloadClientName} place les téléchargements dans le dossier racine {rootFolderPath}. Vous ne devez pas télécharger vers un dossier racine.",
@@ -1263,7 +1262,7 @@
"EditCustomFormat": "Modifier le format personnalisé",
"Downloading": "Téléchargement",
"EditListExclusion": "Modifier l'exclusion de liste",
"EditMetadata": "Modifier les métadonnées {metadataType}",
"EditMetadata": "Modifier {metadataType} Métadonnée",
"EnableAutomaticAdd": "Activer l'ajout automatique",
"EpisodeFileDeleted": "Fichier de l'épisode supprimé",
"EpisodeFileDeletedTooltip": "Fichier de l'épisode supprimé",
@@ -1277,13 +1276,13 @@
"Component": "Composant",
"Condition": "Condition",
"Connections": "Connexions",
"ConnectSettingsSummary": "Notifications, connexions aux serveurs/lecteurs multimédias et scripts personnalisés",
"ConnectSettingsSummary": "Notifications, connexions aux serveurs/lecteurs de médias et scripts personnalisés",
"CopyToClipboard": "Copier dans le presse-papier",
"CreateEmptySeriesFolders": "Créer des dossiers de séries vides",
"Custom": "Customisé",
"CopyUsingHardlinksSeriesHelpText": "Les liens physiques permettent à {appName} d'importer des torrents dans le dossier de la série sans prendre d'espace disque supplémentaire ni copier l'intégralité du contenu du fichier. Les liens physiques ne fonctionneront que si la source et la destination sont sur le même volume",
"CustomFormatsSettingsSummary": "Paramètres de formats personnalisés",
"CustomFormatsSettings": "Paramètres de formats personnalisés",
"CustomFormatsSettingsSummary": "Formats et paramètres personnalisés",
"CustomFormatsSettings": "Paramètre des formats personnalisés",
"DefaultDelayProfileSeries": "Il s'agit du profil par défaut. Cela s'applique à toutes les séries qui n'ont pas de profil explicite.",
"DeleteDownloadClient": "Supprimer le client de téléchargement",
"DeleteEmptyFolders": "Supprimer les dossiers vides",
@@ -1292,7 +1291,7 @@
"DeleteImportListExclusionMessageText": "Êtes-vous sûr de vouloir supprimer cette exclusion de la liste d'importation ?",
"DeleteQualityProfile": "Supprimer le profil de qualité",
"DeleteReleaseProfile": "Supprimer le profil de version",
"DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir supprimer ce mappage de chemin distant ?",
"DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir supprimer cette correspondance de chemin distant ?",
"DoNotPrefer": "Ne préfère pas",
"DoNotUpgradeAutomatically": "Ne pas mettre à niveau automatiquement",
"DownloadClient": "Client de téléchargement",
@@ -1340,23 +1339,23 @@
"Database": "Base de données",
"Dates": "Dates",
"CustomFormatJson": "Format personnalisé JSON",
"DelayMinutes": "{delay} Minutes",
"DelayMinutes": "{delay} minutes",
"DelayProfile": "Profil de retard",
"DeleteDelayProfile": "Supprimer le profil de retard",
"DeleteDelayProfileMessageText": "Êtes-vous sûr de vouloir supprimer ce profil de retard ?",
"DeleteEpisodeFile": "Supprimer le fichier de l'épisode",
"DeleteEpisodeFileMessage": "Supprimer le fichier de l'épisode ?",
"DeleteEpisodeFileMessage": "Supprimer le fichier de l'épisode '{path}'?",
"DeleteEpisodeFromDisk": "Supprimer l'épisode du disque",
"DeleteImportListMessageText": "Êtes-vous sûr de vouloir supprimer cette exclusion de la liste d'importation ?",
"DeleteImportListMessageText": "Êtes-vous sûr de vouloir supprimer la liste « {name} » ?",
"DeleteSelectedEpisodeFiles": "Supprimer les fichiers d'épisode sélectionnés",
"DeleteSelectedEpisodeFilesHelpText": "Êtes-vous sûr de vouloir supprimer les fichiers d'épisode sélectionnés ?",
"DeleteSpecificationHelpText": "Êtes-vous sûr de vouloir supprimer la spécification « {name} » ?",
"DeleteSpecificationHelpText": "Êtes-vous sûr de vouloir supprimer la spécification '{name}' ?",
"DeleteTag": "Supprimer l'étiquette",
"DownloadClientStatusSingleClientHealthCheckMessage": "Clients de téléchargement indisponibles en raison d'échecs : {downloadClientNames}",
"DownloadClientStatusAllClientHealthCheckMessage": "Tous les clients de téléchargement sont indisponibles en raison d'échecs",
"DownloadClientsLoadError": "Impossible de charger les clients de téléchargement",
"DownloadPropersAndRepacks": "Propriétés et reconditionnements",
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins distants",
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins d'accès à distance",
"DownloadPropersAndRepacksHelpText": "S'il faut ou non mettre à niveau automatiquement vers Propers/Repacks",
"DownloadPropersAndRepacksHelpTextWarning": "Utilisez des formats personnalisés pour les mises à niveau automatiques vers Propers/Repacks",
"DownloadPropersAndRepacksHelpTextCustomFormat": "Utilisez « Ne pas préférer » pour trier par score de format personnalisé sur Propers/Repacks",
@@ -1390,7 +1389,7 @@
"CustomFilters": "Filtres personnalisés",
"CustomFormat": "Format personnalisé",
"CustomFormatHelpText": "{appName} attribue un score pour chaque release en additionnant les scores des formats personnalisés correspondants. Si une nouvelle release permet d'améliorer le score, pour une qualité identique ou supérieure, alors {appName} la téléchargera.",
"CustomFormatUnknownCondition": "Condition de format personnalisé inconnue '{implémentation}'",
"CustomFormatUnknownCondition": "Condition de format personnalisé inconnue '{implementation}'",
"CustomFormatUnknownConditionOption": "Option inconnue '{key}' pour la condition '{implementation}'",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Le client de téléchargement {downloadClientName} est configuré pour supprimer les téléchargements terminés. Cela peut entraîner la suppression des téléchargements de votre client avant que {appName} puisse les importer.",
"DownloadFailed": "Échec du téléchargement",
@@ -1401,7 +1400,7 @@
"EnableHelpText": "Activer la création de fichiers de métadonnées pour ce type de métadonnées",
"EnableInteractiveSearchHelpText": "Sera utilisé lorsque la recherche interactive est utilisée",
"EnableInteractiveSearchHelpTextWarning": "La recherche n'est pas prise en charge avec cet indexeur",
"EnableProfileHelpText": "Cochez pour activer le profil de version",
"EnableProfileHelpText": "Vérifier pour activer le profil de version",
"EnableRss": "Activer RSS",
"Ended": "Terminé",
"EndedOnly": "Terminé seulement",
@@ -1416,7 +1415,7 @@
"EpisodesLoadError": "Impossible de charger les épisodes",
"Files": "Fichiers",
"Continuing": "Continuer",
"Donate": "Faire un don",
"Donate": "Donation",
"EditConditionImplementation": "Modifier la condition {implementationName}",
"EditConnectionImplementation": "Modifier la connexion - {implementationName}",
"EditImportListImplementation": "Modifier la liste d'importation - {implementationName}",
@@ -1444,15 +1443,15 @@
"DeleteEmptySeriesFoldersHelpText": "Supprimez les dossiers de séries et de saisons vides lors de l'analyse du disque et lorsque les fichiers d'épisode sont supprimés",
"DeleteEpisodesFiles": "Supprimer {episodeFileCount} fichiers d'épisode",
"DeleteEpisodesFilesHelpText": "Supprimer les fichiers d'épisode et le dossier de série",
"DeleteQualityProfileMessageText": "Êtes-vous sûr de vouloir supprimer le profil de qualité « {name} » ?",
"DeleteReleaseProfileMessageText": "Êtes-vous sûr de vouloir supprimer ce profil de version « {name} » ?",
"DeleteQualityProfileMessageText": "Êtes-vous sûr de vouloir supprimer le profil de qualité \"{name}\" ?",
"DeleteReleaseProfileMessageText": "Êtes-vous sûr de vouloir supprimer ce profil de version '{name}' ?",
"DeleteSelectedSeries": "Supprimer la série sélectionnée",
"DeleteSeriesFolder": "Supprimer le dossier de série",
"DeleteSeriesFolderCountConfirmation": "Voulez-vous vraiment supprimer {count} séries sélectionnées ?",
"DeleteSeriesFolderCountWithFilesConfirmation": "Voulez-vous vraiment supprimer {count} séries sélectionnées et tous les contenus ?",
"DeleteSeriesFolderEpisodeCount": "{episodeFileCount} fichiers d'épisode totalisant {taille}",
"DeleteSeriesFolderEpisodeCount": "{episodeFileCount} fichiers d'épisode totalisant {size}",
"DeleteSeriesFoldersHelpText": "Supprimez les dossiers de séries et tout leur contenu",
"DeleteSeriesModalHeader": "Supprimer - {titre}",
"DeleteSeriesModalHeader": "Supprimer - {title}",
"DeletedReasonUpgrade": "Le fichier a été supprimé pour importer une mise à niveau",
"DeletedSeriesDescription": "La série a été supprimée de TheTVDB",
"DetailedProgressBar": "Barre de progression détaillée",
@@ -1464,7 +1463,7 @@
"DownloadClientSettings": "Télécharger les paramètres client",
"EditRestriction": "Modifier la restriction",
"EditSelectedSeries": "Modifier la série sélectionnée",
"EditSeriesModalHeader": "Modifier - {titre}",
"EditSeriesModalHeader": "Modifier - {title}",
"Enable": "Activer",
"Error": "Erreur",
"ErrorLoadingContents": "Erreur lors du chargement du contenu",
@@ -1486,13 +1485,13 @@
"IndexerValidationCloudFlareCaptchaRequired": "Site protégé par le CAPTCHA CloudFlare. Un jeton CAPTCHA valide est nécessaire.",
"IndexerValidationTestAbortedDueToError": "Le test a été abandonné à cause d'un erreur : {exceptionMessage}",
"TorrentBlackholeSaveMagnetFilesReadOnly": "Lecture seule",
"DownloadClientFloodSettingsPostImportTagsHelpText": "Ajouter les étiquettes après qu'un téléchargement est importé.",
"DownloadClientFloodSettingsPostImportTagsHelpText": "Ajoute des balises après l'importation d'un téléchargement.",
"DownloadClientFreeboxSettingsAppId": "ID de l'application",
"DownloadClientFreeboxSettingsAppIdHelpText": "L'ID de l'application donné lors de la création de l'accès à l'API Freebox (c'est-à-dire « app_id »)",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Cette option exige au moins la version 16.0 de NzbGet",
"DownloadStationStatusExtracting": "Extraction : {progress} %",
"IndexerHDBitsSettingsCodecsHelpText": "Si non renseigné, toutes les options sont utilisées.",
"IndexerHDBitsSettingsMediumsHelpText": "Si non renseigné, toutes les options sont utilisées.",
"DownloadClientFreeboxSettingsAppIdHelpText": "L'ID de l'application donné lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_id')",
"DownloadClientNzbgetSettingsAddPausedHelpText": "Cette option nécessite au moins la version 16.0 de NzbGet",
"DownloadStationStatusExtracting": "Extraction : {progress}%",
"IndexerHDBitsSettingsCodecsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.",
"IndexerHDBitsSettingsMediumsHelpText": "Si elle n'est pas spécifiée, toutes les options sont utilisées.",
"IndexerSettingsAdditionalParametersNyaa": "Paramètres supplémentaires",
"IndexerSettingsAnimeCategories": "Catégories Anime",
"IndexerSettingsApiUrl": "URL de l'API",
@@ -1506,25 +1505,25 @@
"IndexerValidationInvalidApiKey": "Clé API invalide",
"IndexerValidationUnableToConnect": "Impossible de se connecter à l'indexeur : {exceptionMessage}. Vérifiez le journal pour plus de détails sur cette erreur",
"IndexerValidationRequestLimitReached": "Limite de requêtes atteinte : {exceptionMessage}",
"IndexerValidationUnableToConnectHttpError": "Impossible de se connecter à l'indexeur, vérifiez vos paramètres DNS est assurez-vous que l'IPv6 fonctionne ou est désactivé.",
"TorrentBlackholeSaveMagnetFiles": "Sauvegarder les fichiers Magnet",
"IndexerValidationUnableToConnectHttpError": "Impossible de se connecter à l'indexeur, vérifiez vos paramètres DNS est assurez-vous que l'IPv6 fonctionne ou est désactivé. {exceptionMessage}.",
"TorrentBlackholeSaveMagnetFiles": "Enregistrer les fichiers magnétiques",
"Category": "Catégorie",
"Destination": "Destination",
"Directory": "Répertoire",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Ajoute un préfixe à l'URL du JSON de Deluge, voir {url}",
"DownloadClientDelugeValidationLabelPluginFailureDetail": "{appName} n'a pas pu ajouter les étiquettes à {clientName}.",
"Destination": "Cible",
"Directory": "Dossier",
"DownloadClientDelugeSettingsUrlBaseHelpText": "Ajoute un préfixe à l'URL json du déluge, voir {url}",
"DownloadClientDelugeValidationLabelPluginFailureDetail": "{appName} n'a pas pu ajouter le libellé à {clientName}.",
"DownloadClientDelugeTorrentStateError": "Deluge signale une erreur",
"DownloadClientDelugeValidationLabelPluginFailure": "La configuration des étiquettes a échoué",
"DownloadClientDelugeValidationLabelPluginFailure": "La configuration de l'étiquette a échoué",
"DownloadClientDownloadStationValidationFolderMissing": "Le dossier n'existe pas",
"DownloadClientDownloadStationValidationNoDefaultDestination": "Aucune destination par défaut",
"DownloadClientDownloadStationValidationNoDefaultDestination": "Pas de destination par défaut",
"DownloadClientDownloadStationValidationSharedFolderMissing": "Le dossier partagé n'existe pas",
"DownloadClientFloodSettingsAdditionalTags": "Étiquettes supplémentaires",
"DownloadClientDownloadStationValidationSharedFolderMissingDetail": "Diskstation n'a pas de dossier partagé avec le nom « {sharedFolder} », êtes-vous sûr de l'avoir correctement indiqué ?",
"DownloadClientFreeboxApiError": "L'API Freebox a retourné l'erreur : {errorDescription}",
"DownloadClientFloodSettingsAdditionalTags": "Étiquette supplémentaire",
"DownloadClientDownloadStationValidationSharedFolderMissingDetail": "Le poste de travail n'a pas de dossier partagé portant le nom '{sharedFolder}', êtes-vous sûr de l'avoir spécifié correctement ?",
"DownloadClientFreeboxApiError": "L'API Freebox a renvoyé une erreur : {errorDescription}",
"DownloadClientFreeboxNotLoggedIn": "Non connecté",
"DownloadClientFreeboxSettingsHostHelpText": "Nom de l'hôte ou adresse IP de l'hôte de la Freebox, par défaut à « {url} » (ne fonctionne que si sur le même réseau)",
"DownloadClientFreeboxUnableToReachFreeboxApi": "Impossible de contacter l'API Freebox. Vérifiez le paramètre « URL de l'API » pour l'URL de base et la version.",
"DownloadClientVuzeValidationErrorVersion": "Version du protocole non pris en charge, utilisez Vuze 5.0.0.0 ou version ultérieure avec le plugin Vuze Web Remote.",
"DownloadClientFreeboxSettingsHostHelpText": "Nom d'hôte ou adresse IP de la Freebox, par défaut '{url}' (ne fonctionnera que si elle est sur le même réseau)",
"DownloadClientFreeboxUnableToReachFreeboxApi": "Impossible d'accéder à l'API Freebox. Vérifiez le paramètre 'API URL' pour l'URL de base et la version.",
"DownloadClientVuzeValidationErrorVersion": "Version du protocole non prise en charge, utilisez Vuze 5.0.0.0 ou une version plus récente avec le plugin Vuze Web Remote.",
"IndexerHDBitsSettingsCodecs": "Codecs",
"IndexerHDBitsSettingsCategories": "Catégories",
"IndexerSettingsAdditionalParameters": "Paramètres supplémentaires",
@@ -1532,15 +1531,15 @@
"IndexerValidationFeedNotSupported": "Le flux de l'indexeur n'est pas pris en charge : {exceptionMessage}",
"IndexerValidationUnableToConnectInvalidCredentials": "Impossible de se connecter à l'indexeur, identifiants invalides. {exceptionMessage}.",
"IndexerHDBitsSettingsCategoriesHelpText": "Si non renseigné, toutes les options sont utilisées.",
"IndexerSettingsSeedTimeHelpText": "Le temps qu'un torrent doit être seedé avant d'arrêter, laissez vide pour utiliser la valeur du client de téléchargement par défaut",
"DownloadClientFloodSettingsUrlBaseHelpText": "Ajoute un préfixe à l'API Flood, tel que {url}",
"IndexerSettingsSeedTimeHelpText": "Durée pendant laquelle un torrent doit être envoyé avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement",
"DownloadClientFloodSettingsUrlBaseHelpText": "Ajoute d'un préfixe à l'API Flood, tel que {url}",
"DownloadClientFreeboxAuthenticationError": "L'authentification à l'API Freebox a échoué. Raison : {errorDescription}",
"DownloadClientFreeboxSettingsApiUrl": "URL de l'API",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Définissez l'URL de base de l'API Freebox avec la version de l'API, par ex. « {url} » est par défaut à « {defaultApiUrl} »",
"DownloadClientFreeboxSettingsAppToken": "Jeton de l'application",
"DownloadClientFreeboxSettingsAppTokenHelpText": "Le jeton de l'application récupéré lors de la création de l'accès à l'API Freebox (c'est-à-dire « app_token »)",
"DownloadClientFreeboxSettingsPortHelpText": "Port utilisé pour accéder à l'interface de la Freebox, par défaut à « {port} »",
"DownloadClientFreeboxUnableToReachFreebox": "Impossible de contacter l'API Freebox. Vérifiez les paramètres « Hôte », « Port » ou « Utiliser SSL ». (Erreur : {exceptionMessage})",
"DownloadClientFreeboxSettingsApiUrl": "URL DE L'API",
"DownloadClientFreeboxSettingsApiUrlHelpText": "Définir l'URL de base de l'API Freebox avec la version de l'API, par exemple '{url}', par défaut '{defaultApiUrl}'",
"DownloadClientFreeboxSettingsAppToken": "Jeton d'application",
"DownloadClientFreeboxSettingsAppTokenHelpText": "Le jeton de l'application récupéré lors de la création de l'accès à l'API Freebox (c'est-à-dire 'app_token')",
"DownloadClientFreeboxSettingsPortHelpText": "Port utilisé pour accéder à l'interface de la Freebox, la valeur par défaut est '{port}'",
"DownloadClientFreeboxUnableToReachFreebox": "Impossible d'accéder à l'API Freebox. Vérifiez les paramètres 'Host', 'Port' ou 'Use SSL'. (Erreur : {exceptionMessage})",
"MonitorAllSeasons": "Toutes les saisons",
"MonitorAllSeasonsDescription": "Surveiller automatiquement toutes les nouvelles saisons",
"MonitorLastSeason": "Dernière saison",
@@ -1555,81 +1554,81 @@
"PasswordConfirmation": "Confirmation du mot de passe",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",
"MonitorNoNewSeasons": "Aucune nouvelle saison",
"DownloadClientFloodSettingsTagsHelpText": "Étiquettes initiales d'un téléchargement. Pour être reconnu, un téléchargement doit avoir toutes les étiquettes initiales. Cela évite les conflits avec des téléchargements non liés.",
"DownloadClientFloodSettingsTagsHelpText": "Étiquettes initiales d'un téléchargement. Pour être reconnu, un téléchargement doit avoir toutes les étiquettes initiales. Cela permet d'éviter les conflits avec des téléchargements non apparentés.",
"DownloadClientQbittorrentValidationCategoryAddFailure": "La configuration de la catégorie a échoué",
"DownloadClientQbittorrentValidationCategoryUnsupportedDetail": "Les catégories ne sont pas prises en charge avant la version 3.3.0 de qBittorrent. Veuillez effectuer une mise à niveau ou réessayez avec une catégorie vide.",
"DownloadClientRTorrentProviderMessage": "rTorrent ne mettra pas en pause les torrents lorsqu'ils atteindront les critères de partage. {appName} se chargera de la suppression automatique des torrents en fonction des critères de partage actuels dans Paramètres -> Indexeurs uniquement lorsque la suppression des téléchargements terminés est activée. Après l'importation, il définira également {importedView} en tant que vue rTorrent, qui peut être utilisée dans les scripts rTorrent pour personnaliser le comportement.",
"DownloadClientSettingsCategorySubFolderHelpText": "L'ajout d'une catégorie spécifique à {appName} évite les conflits avec des téléchargements non liés à {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée. Cela crée un sous-répertoire [catégorie] dans le répertoire de sortie.",
"DownloadClientQbittorrentValidationCategoryUnsupportedDetail": "Les catégories ne sont pas prises en charge avant la version 3.3.0 de qBittorrent. Veuillez effectuer une mise à niveau ou réessayer avec une catégorie vide.",
"DownloadClientRTorrentProviderMessage": "rTorrent ne mettra pas les torrents en pause lorsqu'ils répondent aux critères d'ensemencement. {appName} traitera la suppression automatique des torrents en fonction des critères d'ensemencement actuels dans Paramètres->Indexeurs uniquement lorsque l'option Supprimer terminé est activée. Après l'importation, il définira également {importedView} comme une vue rTorrent, qui peut être utilisée dans les scripts rTorrent pour personnaliser le comportement.",
"DownloadClientSettingsCategorySubFolderHelpText": "L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée. Crée un sous-répertoire [catégorie] dans le répertoire de sortie.",
"IndexerValidationQuerySeasonEpisodesNotSupported": "L'indexeur ne prend pas en charge la requête actuelle. Vérifiez si les catégories et/ou la recherche de saisons/épisodes sont prises en charge. Consultez le journal pour plus de détails.",
"MonitorNewItems": "Surveiller les nouveaux éléments",
"UsenetBlackholeNzbFolder": "Dossier Nzb",
"IndexerSettingsApiPath": "Chemin de l'API",
"IndexerSettingsSeedTime": "Temps de partage",
"IndexerSettingsSeedRatio": "Ratio de partage",
"IndexerSettingsSeedRatioHelpText": "Le ratio que doit atteindre un torrent avant de s'arrêter, laisser vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles de l'indexeur",
"IndexerSettingsApiPath": "Chemin d'accès à l'API",
"IndexerSettingsSeedTime": "Temps d'envoie",
"IndexerSettingsSeedRatio": "Ratio d'envoie",
"IndexerSettingsSeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles des indexeurs",
"IndexerValidationNoRssFeedQueryAvailable": "Aucune requête de flux RSS disponible. Cela peut être un problème avec l'indexeur ou vos paramètres de catégorie de l'indexeur.",
"IndexerValidationSearchParametersNotSupported": "L'indexeur ne prend pas en charge les paramètres de recherche requis",
"IndexerValidationUnableToConnectResolutionFailure": "Impossible de se connecter à l'indexeur : échec de la connexion. Vérifiez votre connexion au serveur de l'indexeur et le DNS. {exceptionMessage}.",
"TorrentBlackhole": "Torrent Blackhole",
"TorrentBlackhole": "Trou noir des torrents",
"UseSsl": "Utiliser SSL",
"UsenetBlackhole": "Usenet Blackhole",
"DownloadClientDownloadStationValidationNoDefaultDestinationDetail": "Vous devez vous connecter à votre Diskstation en tant que {username} et le configurer manuellement dans les paramètres de DownloadStation sous BT/HTTP/FTP/NZB -> Emplacement.",
"DownloadClientFloodSettingsPostImportTags": "Étiquettes après importation",
"DownloadClientFloodSettingsRemovalInfo": "{appName} se chargera de la suppression automatique des torrents en fonction des critères de partage actuels dans Paramètres -> Indexeurs",
"DownloadClientFloodSettingsStartOnAdd": "Commencer lors de l'ajout",
"DownloadClientNzbVortexMultipleFilesMessage": "Le téléchargement contient plusieurs fichiers et n'est pas dans un dossier de tâche : {outputPath}",
"DownloadClientNzbgetValidationKeepHistoryOverMax": "Le paramètre 'KeepHistory' de NzbGet devrait être inférieur à 25000",
"DownloadClientNzbgetValidationKeepHistoryOverMaxDetail": "Le paramètre 'KeepHistory' de NzbGet est défini trop élevé.",
"DownloadClientDownloadStationValidationNoDefaultDestinationDetail": "Vous devez vous connecter à votre poste de travail en tant que {username} et le configurer manuellement dans les paramètres de la DownloadStation sous BT/HTTP/FTP/NZB -> Location.",
"DownloadClientFloodSettingsPostImportTags": "Balises post-importation",
"DownloadClientFloodSettingsRemovalInfo": "{appName} gérera la suppression automatique des torrents sur la base des critères de semences actuels dans Paramètres -> Indexeurs",
"DownloadClientFloodSettingsStartOnAdd": "Démarrer l'ajout",
"DownloadClientNzbVortexMultipleFilesMessage": "Le téléchargement contient plusieurs fichiers et ne se trouve pas dans un dossier de travail : {outputPath}",
"DownloadClientNzbgetValidationKeepHistoryOverMax": "Le paramètre KeepHistory de NzbGet doit être inférieur à 25000",
"DownloadClientNzbgetValidationKeepHistoryOverMaxDetail": "Le paramètre KeepHistory de NzbGet est trop élevé.",
"DownloadClientPneumaticSettingsNzbFolder": "Dossier Nzb",
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Ce dossier devra être accessible depuis XBMC",
"DownloadClientPneumaticSettingsStrmFolder": "Dossier Strm",
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Les fichiers .strm dans ce dossier seront importés par Drone",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Télécharger d'abord les premières et les dernières pièces (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "État initial pour les torrents ajoutés à qBittorrent. Notez que les torrents forcés ne tiennent pas compte des restrictions de partage",
"DownloadClientQbittorrentTorrentStateDhtDisabled": "qBittorrent ne peut pas résoudre le lien magnétique avec la DHT désactivée",
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Les fichiers .strm contenus dans ce dossier seront importés par drone",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Télécharger d'abord le premier et le dernier morceau (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsInitialStateHelpText": "État initial des torrents ajoutés à qBittorrent. Notez que les torrents forcés ne respectent pas les restrictions relatives aux seeds",
"DownloadClientQbittorrentTorrentStateDhtDisabled": "qBittorrent ne peut pas résoudre le lien magnet lorsque le DHT est désactivé",
"DownloadClientQbittorrentTorrentStateError": "qBittorrent signale une erreur",
"DownloadClientQbittorrentValidationCategoryAddFailureDetail": "{appName} n'a pas réussi à ajouter l'étiquette à qBittorrent.",
"DownloadClientQbittorrentValidationCategoryAddFailureDetail": "{appName} n'a pas pu ajouter l'étiquette à qBittorrent.",
"DownloadClientQbittorrentValidationCategoryRecommended": "La catégorie est recommandée",
"DownloadClientQbittorrentValidationCategoryRecommendedDetail": "{appName} ne tentera pas d'importer les téléchargements terminés sans catégorie.",
"DownloadClientQbittorrentValidationCategoryRecommendedDetail": "{appName} n'essaiera pas d'importer des téléchargements terminés sans catégorie.",
"DownloadClientQbittorrentValidationCategoryUnsupported": "La catégorie n'est pas prise en charge",
"DownloadClientQbittorrentValidationQueueingNotEnabled": "La mise en file d'attente n'est pas activée",
"DownloadClientQbittorrentValidationQueueingNotEnabledDetail": "La mise en file d'attente des torrents n'est pas activée dans vos paramètres de qBittorrent. Activez-la dans qBittorrent ou sélectionnez 'Dernier' comme priorité.",
"DownloadClientQbittorrentValidationRemovesAtRatioLimit": "qBittorrent est configuré pour supprimer les torrents lorsqu'ils atteignent leur limite de partage (Share Ratio Limit)",
"DownloadClientQbittorrentValidationRemovesAtRatioLimitDetail": "{appName} ne pourra pas effectuer le traitement des téléchargements terminés tel que configuré. Vous pouvez résoudre ce problème dans qBittorrent ('Outils -> Options...' dans le menu) en modifiant 'Options -> BitTorrent -> Limitation du ratio de partage' de 'Les supprimer' à 'Les mettre en pause'",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "L'activation ajoutera les torrents et les liens magnétiques à rTorrent dans un état arrêté. Cela peut endommager les fichiers magnétiques.",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Emplacement optionnel pour placer les téléchargements, laissez vide pour utiliser l'emplacement par défaut de rTorrent",
"DownloadClientRTorrentSettingsUrlPath": "Chemin d'URL",
"DownloadClientRTorrentSettingsUrlPathHelpText": "Chemin vers le point de terminaison XMLRPC, voir {url}. Il s'agit généralement de RPC2 ou [chemin vers ruTorrent]{url2} lors de l'utilisation de ruTorrent.",
"DownloadClientSabnzbdValidationCheckBeforeDownload": "Désactivez l'option 'Vérifier avant le téléchargement' dans Sabnzbd",
"DownloadClientSabnzbdValidationCheckBeforeDownloadDetail": "L'utilisation de 'Vérifier avant le téléchargement' affecte la capacité de {appName} à suivre les nouveaux téléchargements. Sabnzbd recommande également 'Abandonner les tâches qui ne peuvent pas être terminées', car c'est plus efficace.",
"DownloadClientSabnzbdValidationDevelopVersion": "Version de développement de Sabnzbd, en supposant la version 3.0.0 ou supérieure.",
"DownloadClientSabnzbdValidationDevelopVersionDetail": "{appName} pourrait ne pas être en mesure de prendre en charge les nouvelles fonctionnalités ajoutées à SABnzbd lors de l'exécution de versions de développement.",
"DownloadClientQbittorrentValidationQueueingNotEnabled": "Mise en file d'attente non activée",
"DownloadClientQbittorrentValidationQueueingNotEnabledDetail": "La mise en file d'attente des torrents n'est pas activée dans les paramètres de qBittorrent. Activez-la dans qBittorrent ou sélectionnez 'Dernier' comme priorité.",
"DownloadClientQbittorrentValidationRemovesAtRatioLimit": "qBittorrent est configuré pour supprimer les torrents lorsqu'ils atteignent leur limite de ratio de partage",
"DownloadClientQbittorrentValidationRemovesAtRatioLimitDetail": "{appName} ne pourra pas effectuer le traitement des téléchargements terminés tel que configuré. Vous pouvez résoudre ce problème dans qBittorrent ('Outils -> Options...' dans le menu) en remplaçant 'Options -> BitTorrent -> Limitation du ratio de partageg' de 'Les supprimer' par 'Les mettre en pause'",
"DownloadClientRTorrentSettingsAddStoppedHelpText": "L'activation ajoutera des torrents et des magnets à rTorrent dans un état d'arrêt. Cela peut endommager les fichiers magnétiques.",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Emplacement facultatif dans lequel placer les téléchargements. Laisser vide pour utiliser l'emplacement par défaut de rTorrent",
"DownloadClientRTorrentSettingsUrlPath": "Chemin d'url",
"DownloadClientRTorrentSettingsUrlPathHelpText": "Chemin d'accès au point de terminaison XMLRPC, voir {url}. Il s'agit généralement de RPC2 ou de [chemin vers ruTorrent]{url2} lors de l'utilisation de ruTorrent.",
"DownloadClientSabnzbdValidationCheckBeforeDownload": "Désactiver l'option 'Vérifier avant de télécharger' dans Sabnbzd",
"DownloadClientSabnzbdValidationCheckBeforeDownloadDetail": "L'utilisation de 'Vérifier avant de télécharger' affecte la capacité de {appName} à suivre les nouveaux téléchargements. Sabnzbd recommande également 'Abandonner les tâches qui ne peuvent pas être achevées', car c'est plus efficace.",
"DownloadClientSabnzbdValidationDevelopVersion": "Version de développement de Sabnzbd, en supposant une version 3.0.0 ou supérieure.",
"DownloadClientSabnzbdValidationDevelopVersionDetail": "{appName} peut ne pas être en mesure de prendre en charge les nouvelles fonctionnalités ajoutées à SABnzbd lors de l'exécution de versions développées.",
"DownloadClientSabnzbdValidationEnableDisableDateSorting": "Désactiver le tri par date",
"DownloadClientSabnzbdValidationEnableDisableDateSortingDetail": "Vous devez désactiver le tri par date pour la catégorie que {appName} utilise afin d'éviter des problèmes lors de l'importation. Rendez-vous dans Sabnzbd pour le résoudre.",
"DownloadClientSabnzbdValidationEnableDisableDateSortingDetail": "Vous devez désactiver le tri par date pour la catégorie {appName} afin d'éviter les problèmes d'importation. Rendez-vous sur le site de Sabnzbd pour résoudre ce problème.",
"DownloadClientSabnzbdValidationEnableDisableMovieSorting": "Désactiver le tri des films",
"DownloadClientSabnzbdValidationEnableDisableMovieSortingDetail": "Vous devez désactiver le tri des films pour la catégorie que {appName} utilise afin d'éviter des problèmes lors de l'importation. Rendez-vous dans Sabnzbd pour le résoudre.",
"DownloadClientSabnzbdValidationEnableDisableTvSorting": "Désactiver le tri des émissions de télévision",
"DownloadClientSabnzbdValidationEnableDisableTvSortingDetail": "Vous devez désactiver le tri des émissions de télévision pour la catégorie que {appName} utilise afin d'éviter des problèmes lors de l'importation. Rendez-vous dans Sabnzbd pour le résoudre.",
"DownloadClientSabnzbdValidationEnableJobFolders": "Activer les dossiers de tâches",
"DownloadClientSabnzbdValidationEnableJobFoldersDetail": "{appName} préfère que chaque téléchargement ait son propre dossier. En ajoutant un astérisque (*) au dossier/chemin, Sabnzbd ne créera pas ces dossiers de tâches. Rendez-vous dans Sabnzbd pour le résoudre.",
"DownloadClientSabnzbdValidationEnableDisableMovieSortingDetail": "Vous devez désactiver le tri des films pour la catégorie utilisée par {appName} afin d'éviter les problèmes d'importation. Rendez-vous sur le site de Sabnzbd pour y remédier.",
"DownloadClientSabnzbdValidationEnableDisableTvSorting": "Désactiver le tri des téléviseurs",
"DownloadClientSabnzbdValidationEnableDisableTvSortingDetail": "Vous devez désactiver le tri TV pour la catégorie {appName} afin d'éviter les problèmes d'importation. Rendez-vous sur le site de Sabnzbd pour y remédier.",
"DownloadClientSabnzbdValidationEnableJobFolders": "Activer les dossiers de travail",
"DownloadClientSabnzbdValidationEnableJobFoldersDetail": "{appName} préfère que chaque téléchargement ait un dossier séparé. Avec * ajouté au dossier/chemin, Sabnzbd ne créera pas ces dossiers de travail. Allez sur Sabnzbd pour résoudre ce problème.",
"DownloadClientSabnzbdValidationUnknownVersion": "Version inconnue : {rawVersion}",
"DownloadClientSettingsCategoryHelpText": "Ajouter une catégorie spécifique à {appName} évite les conflits avec des téléchargements non liés à {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée.",
"DownloadClientSettingsPostImportCategoryHelpText": "Catégorie à définir pour {appName} après avoir importé le téléchargement. {appName} ne supprimera pas les torrents de cette catégorie même si le partage est terminé. Laissez vide pour conserver la même catégorie.",
"DownloadClientSettingsDestinationHelpText": "Spécifie manuellement la destination du téléchargement, laissez vide pour utiliser la destination par défaut",
"DownloadClientValidationCategoryMissingDetail": "La catégorie que vous avez entrée n'existe pas dans {clientName}. Créez-la d'abord dans {clientName}.",
"DownloadClientSettingsCategoryHelpText": "L'ajout d'une catégorie spécifique à {appName} permet d'éviter les conflits avec des téléchargements sans rapport avec {appName}. L'utilisation d'une catégorie est facultative, mais fortement recommandée.",
"DownloadClientSettingsPostImportCategoryHelpText": "Catégorie que {appName} doit définir après avoir importé le téléchargement. {appName} ne supprimera pas les torrents de cette catégorie même si l'ensemencement est terminé. Laisser vide pour conserver la même catégorie.",
"DownloadClientSettingsDestinationHelpText": "Spécifie manuellement la destination du téléchargement, laisser vide pour utiliser la destination par défaut",
"DownloadClientValidationCategoryMissingDetail": "La catégorie que vous avez saisie n'existe pas dans {clientName}. Créez-la d'abord dans {clientName}.",
"DownloadClientValidationErrorVersion": "La version de {clientName} doit être au moins {requiredVersion}. La version rapportée est {reportedVersion}",
"DownloadClientValidationGroupMissingDetail": "Le groupe que vous avez entré n'existe pas dans {clientName}. Créez-le d'abord dans {clientName}.",
"DownloadClientValidationGroupMissingDetail": "Le groupe que vous avez saisi n'existe pas dans {clientName}. Créez-le d'abord dans {clientName}.",
"DownloadClientValidationSslConnectFailure": "Impossible de se connecter via SSL",
"DownloadClientValidationUnableToConnect": "Impossible de se connecter à {clientName}",
"IndexerIPTorrentsSettingsFeedUrlHelpText": "URL complète du flux RSS généré par IPTorrents, en utilisant uniquement les catégories que vous avez sélectionnées (HD, SD, x264, etc...)",
"IndexerHDBitsSettingsMediums": "Type de médias",
"IndexerHDBitsSettingsMediums": "Supports",
"IndexerSettingsAdditionalNewznabParametersHelpText": "Veuillez noter que si vous modifiez la catégorie, vous devrez ajouter des règles requises/restrictives concernant les sous-groupes pour éviter les sorties en langues étrangères.",
"IndexerSettingsAllowZeroSize": "Autoriser la taille zéro",
"IndexerSettingsAllowZeroSizeHelpText": "L'activation de cette option vous permettra d'utiliser des flux qui ne spécifient pas la taille de la version, mais soyez prudent, les vérifications liées à la taille ne seront pas effectuées.",
"IndexerSettingsAnimeCategoriesHelpText": "Liste déroulante, laissez vide pour désactiver les animes",
"IndexerSettingsAnimeStandardFormatSearch": "Recherche au format standard pour les animes",
"IndexerSettingsAnimeStandardFormatSearchHelpText": "Rechercher également les animes en utilisant la numérotation standard",
"IndexerSettingsApiPathHelpText": "Chemin vers l'API, généralement {url}",
"IndexerSettingsApiPathHelpText": "Chemin d'accès à l'api, généralement {url}",
"IndexerSettingsApiUrlHelpText": "Ne le modifiez pas à moins de savoir ce que vous faites, car votre clé API sera envoyée à cet hôte.",
"IndexerSettingsCategoriesHelpText": "Liste déroulante, laissez vide pour désactiver les émissions standard/quotidiennes",
"IndexerSettingsCookieHelpText": "Si votre site nécessite un cookie de connexion pour accéder au flux RSS, vous devrez le récupérer via un navigateur.",
@@ -1641,63 +1640,63 @@
"IndexerValidationJackettAllNotSupportedHelpText": "L'endpoint 'all' de Jackett n'est pas pris en charge, veuillez ajouter les indexeurs individuellement",
"IndexerValidationUnableToConnectServerUnavailable": "Impossible de se connecter à l'indexeur, le serveur de l'indexeur est indisponible. Réessayez plus tard. {exceptionMessage}.",
"IndexerValidationUnableToConnectTimeout": "Impossible de se connecter à l'indexeur, peut-être en raison d'un délai d'attente. Réessayez ou vérifiez vos paramètres réseau. {exceptionMessage}.",
"NzbgetHistoryItemMessage": "État PAR : {parStatus} - État de décompression : {unpackStatus} - État de déplacement : {moveStatus} - État du script : {scriptStatus} - État de suppression : {deleteStatus} - État de marquage : {markStatus}",
"TorrentBlackholeSaveMagnetFilesHelpText": "Enregistrer le lien magnétique s'il n'y a pas de fichier .torrent disponible (utile uniquement si le client de téléchargement prend en charge les liens magnétiques enregistrés dans un fichier)",
"PostImportCategory": "Catégorie après importation",
"NzbgetHistoryItemMessage": "Statut PAR : {parStatus} - Unpack Status : {unpackStatus} - Move Status : {moveStatus} - Statut du script : {scriptStatus} - Supprimer l'état : {deleteStatus} - Mark Status : {markStatus}",
"TorrentBlackholeSaveMagnetFilesHelpText": "Enregistrer le lien magnétique si aucun fichier .torrent n'est disponible (utile uniquement si le client de téléchargement prend en charge les liens magnétiques enregistrés dans un fichier)",
"PostImportCategory": "Catégorie après l'importation",
"BlackholeFolderHelpText": "Dossier dans lequel {appName} stockera le fichier {extension}",
"BlackholeWatchFolder": "Dossier de surveillance",
"BlackholeWatchFolderHelpText": "Dossier à partir duquel {appName} devrait importer les téléchargements terminés",
"DownloadClientDelugeValidationLabelPluginInactive": "Plugin d'étiquetage non activé",
"DownloadClientDelugeValidationLabelPluginInactiveDetail": "Vous devez avoir le plugin d'étiquetage activé dans {clientName} pour utiliser les catégories.",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Dossier partagé facultatif dans lequel placer les téléchargements, laissez vide pour utiliser l'emplacement par défaut de Download Station",
"DownloadClientDownloadStationValidationApiVersion": "Version de l'API de Download Station non prise en charge, elle devrait être au moins {requiredVersion}. Elle prend en charge de {minVersion} à {maxVersion}",
"DownloadClientDownloadStationValidationFolderMissingDetail": "Le dossier '{downloadDir}' n'existe pas, il doit être créé manuellement à l'intérieur du Dossier Partagé '{sharedFolder}'.",
"DownloadClientDownloadStationProviderMessage": "{appName} ne peut pas se connecter à Download Station si l'authentification à deux facteurs est activée sur votre compte DSM",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Ajoute des propriétés des médias en tant qu'étiquettes. Les indices sont des exemples.",
"DownloadClientNzbgetValidationKeepHistoryZeroDetail": "Le paramètre 'KeepHistory' de NzbGet est réglé sur 0, ce qui empêche {appName} de voir les téléchargements terminés.",
"DownloadClientNzbgetValidationKeepHistoryZero": "Le paramètre 'KeepHistory' de NzbGet devrait être supérieur à 0",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Premier et dernier prénom",
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Télécharger dans l'ordre séquentiel (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Utiliser une connexion sécurisée. Consultez Options -> Interface Web -> 'Utiliser HTTPS au lieu de HTTP' dans qBittorrent.",
"BlackholeWatchFolder": "Dossier surveillé",
"BlackholeWatchFolderHelpText": "Dossier à partir duquel {appName} doit importer les téléchargements terminés",
"DownloadClientDelugeValidationLabelPluginInactive": "Plugin d'étiquette non activé",
"DownloadClientDelugeValidationLabelPluginInactiveDetail": "Vous devez avoir activé le plug-in Label dans {clientName} pour utiliser les catégories.",
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Dossier partagé dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement par défaut de Download Station",
"DownloadClientDownloadStationValidationApiVersion": "La version de l'API de la station de téléchargement n'est pas prise en charge, elle doit être au moins {requiredVersion}. Elle est prise en charge de {minVersion} à {maxVersion}",
"DownloadClientDownloadStationValidationFolderMissingDetail": "Le dossier '{downloadDir}' n'existe pas, il doit être créé manuellement dans le dossier partagé '{sharedFolder}'.",
"DownloadClientDownloadStationProviderMessage": "{appName} ne parvient pas à se connecter à Download Station si l'authentification à 2 facteurs est activée sur votre compte DSM",
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Ajoute les propriétés des médias sous forme d'étiquette. Les conseils sont des exemples.",
"DownloadClientNzbgetValidationKeepHistoryZeroDetail": "Le paramètre KeepHistory de NzbGet est fixé à 0, ce qui empêche {appName} de voir les téléchargements terminés.",
"DownloadClientNzbgetValidationKeepHistoryZero": "Le paramètre KeepHistory de NzbGet doit être supérieur à 0",
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Premier et dernier premiers",
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Téléchargement dans l'ordre séquentiel (qBittorrent 4.1.0+)",
"DownloadClientQbittorrentSettingsUseSslHelpText": "Utilisez une connexion sécurisée. Voir Options -> UI Web -> 'Utiliser HTTPS au lieu de HTTP' dans qBittorrent.",
"DownloadClientQbittorrentSettingsSequentialOrder": "Ordre séquentiel",
"DownloadClientQbittorrentTorrentStateMetadata": "qBittorrent est en train de télécharger les métadonnées",
"DownloadClientQbittorrentTorrentStatePathError": "Impossible d'importer. Le chemin correspond au répertoire de téléchargement de base du client, il est possible que 'Conserver le dossier de niveau supérieur' soit désactivé pour ce torrent ou que 'Disposition du contenu du torrent' ne soit pas définie sur 'Original' ou 'Créer un sous-dossier' ?",
"DownloadClientQbittorrentTorrentStateMetadata": "qBittorrent télécharge des métadonnées",
"DownloadClientQbittorrentTorrentStatePathError": "Impossible d'importer. Le chemin d'accès correspond au répertoire de téléchargement de la base du client, il est possible que l'option 'Conserver le dossier de premier niveau' soit désactivée pour ce torrent ou que l'option 'Disposition du contenu du torrent' ne soit PAS réglée sur 'Original' ou 'Créer un sous-dossier' ?",
"DownloadClientQbittorrentTorrentStateStalled": "Le téléchargement est bloqué sans aucune connexion",
"DownloadClientQbittorrentTorrentStateUnknown": "État de téléchargement inconnu : {state}",
"DownloadClientRTorrentSettingsAddStopped": "Ajouter Arrêté",
"DownloadClientSettingsAddPaused": "Ajouter en pause",
"DownloadClientSettingsOlderPriority": "Priorité inférieure",
"DownloadClientRTorrentSettingsAddStopped": "Ajout arrêté",
"DownloadClientSettingsAddPaused": "Ajout en pause",
"DownloadClientSettingsOlderPriority": "Priorité plus ancienne",
"DownloadClientSettingsRecentPriority": "Priorité récente",
"DownloadClientSettingsInitialState": "État initial",
"DownloadClientSettingsInitialStateHelpText": "État initial pour les torrents ajoutés à {clientName}",
"DownloadClientSettingsUrlBaseHelpText": "Ajoute un préfixe à l'URL de {clientName}, comme {url}",
"DownloadClientSettingsUrlBaseHelpText": "Ajoute un préfixe à l'url {clientName}, tel que {url}",
"DownloadClientSettingsUseSslHelpText": "Utiliser une connexion sécurisée lors de la connexion à {clientName}",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Emplacement facultatif pour placer les téléchargements, laissez vide pour utiliser l'emplacement par défaut de Transmission",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Ajoute un préfixe à l'URL RPC de {clientName}, par exemple {url}, par défaut '{defaultUrl}'",
"DownloadClientTransmissionSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement de transmission par défaut",
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Ajoute un préfixe à l'url rpc de {clientName}, par exemple {url}, la valeur par défaut étant '{defaultUrl}'",
"DownloadClientUTorrentTorrentStateError": "uTorrent signale une erreur",
"DownloadClientValidationApiKeyIncorrect": "Clé API incorrecte",
"DownloadClientValidationApiKeyRequired": "Clé API requise",
"DownloadClientValidationAuthenticationFailure": "Échec de l'authentification",
"DownloadClientValidationAuthenticationFailureDetail": "Veuillez vérifier votre nom d'utilisateur et votre mot de passe. Assurez-vous également que l'hôte sur lequel {appName} s'exécute n'est pas bloqué pour l'accès à {clientName} en raison de limitations de liste blanche (WhiteList) dans la configuration de {clientName}.",
"DownloadClientValidationAuthenticationFailureDetail": "Veuillez vérifier votre nom d'utilisateur et votre mot de passe. Vérifiez également que l'hôte qui exécute {appName} n'est pas empêché d'accéder à {clientName} par des limitations de la liste blanche dans la configuration de {clientName}.",
"DownloadClientValidationCategoryMissing": "La catégorie n'existe pas",
"DownloadClientValidationGroupMissing": "Le groupe n'existe pas",
"DownloadClientValidationTestNzbs": "Échec de l'obtention de la liste des NZB : {exceptionMessage}",
"DownloadClientValidationSslConnectFailureDetail": "{appName} ne peut pas se connecter à {clientName} en utilisant SSL. Ce problème pourrait être lié à l'ordinateur. Veuillez essayer de configurer à la fois {appName} et {clientName} pour ne pas utiliser SSL.",
"DownloadClientValidationSslConnectFailureDetail": "{appName} ne parvient pas à se connecter à {clientName} en utilisant SSL. Ce problème peut être lié à l'ordinateur. Veuillez essayer de configurer {appName} et {clientName} pour qu'ils n'utilisent pas SSL.",
"DownloadClientValidationTestTorrents": "Échec de l'obtention de la liste des torrents : {exceptionMessage}",
"DownloadClientValidationUnknownException": "Exception inconnue : {exception}",
"DownloadClientValidationVerifySsl": "Vérifiez les paramètres SSL",
"DownloadClientValidationVerifySsl": "Vérifier les paramètres SSL",
"DownloadClientValidationUnableToConnectDetail": "Veuillez vérifier le nom d'hôte et le port.",
"DownloadClientValidationVerifySslDetail": "Veuillez vérifier votre configuration SSL à la fois sur {clientName} et {appName}",
"DownloadClientValidationVerifySslDetail": "Veuillez vérifier votre configuration SSL sur {clientName} et {appName}",
"UnknownDownloadState": "État de téléchargement inconnu : {state}",
"DownloadClientSettingsOlderPriorityEpisodeHelpText": "Priorité à utiliser lors de la récupération des épisodes diffusés il y a plus de 14 jours",
"DownloadClientSettingsRecentPriorityEpisodeHelpText": "Priorité à utiliser lors de la récupération des épisodes diffusés au cours des 14 derniers jours",
"MonitorNewSeasonsHelpText": "Quelles nouvelles saisons doivent être surveillées automatiquement",
"MonitorNoNewSeasonsDescription": "Ne pas surveiller automatiquement de nouvelles saisons",
"TorrentBlackholeSaveMagnetFilesExtension": "Enregistrer les extensions de fichiers magnet",
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extension à utiliser pour les liens magnétiques, par défaut '.magnet'",
"TorrentBlackholeSaveMagnetFilesReadOnlyHelpText": "Au lieu de déplacer les fichiers, cela indiquera à {appName} de copier ou de créer un lien (en fonction des paramètres/configuration système)",
"TorrentBlackholeSaveMagnetFilesExtension": "Sauvegarde des fichiers magnétiques Extension",
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extension à utiliser pour les liens magnétiques, la valeur par défaut est '.magnet'",
"TorrentBlackholeSaveMagnetFilesReadOnlyHelpText": "Au lieu de déplacer les fichiers, cela demandera à {appName} de les copier ou de les relier (en fonction des paramètres/de la configuration du système)",
"TorrentBlackholeTorrentFolder": "Dossier Torrent",
"XmlRpcPath": "Chemin XML RPC",
"XmlRpcPath": "Chemin d'accès XML RPC",
"AddRootFolderError": "Impossible d'ajouter le dossier racine",
"NotificationsAppriseSettingsConfigurationKey": "Clé de configuration Apprise",
"NotificationsCustomScriptSettingsProviderMessage": "Tester va exécuter le script avec le type d'événement définit sur {eventTypeTest}, assurez-vous que votre script le gère correctement",
@@ -1792,7 +1791,7 @@
"NotificationsSettingsUpdateMapPathsFrom": "Mapper les chemins depuis",
"NotificationsSettingsUpdateLibrary": "Mettre à jour la bibliothèque",
"NotificationsSendGridSettingsApiKeyHelpText": "La clé API générée par SendGrid",
"NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite « Mise à jour bibliothèque »)",
"NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite 'Mise à jour bibliothèque')",
"NotificationsSettingsUpdateMapPathsTo": "Mapper les chemins vers",
"NotificationsSignalSettingsUsernameHelpText": "Nom d'utilisateur utilisé pour authentifier les requêtes vers signal-api",
"NotificationsSlackSettingsIcon": "Icône",
@@ -1872,7 +1871,7 @@
"AutoTaggingSpecificationMaximumYear": "Année maximum",
"AutoTaggingSpecificationMinimumYear": "Année minimum",
"AutoTaggingSpecificationOriginalLanguage": "Langue",
"AutoTaggingSpecificationQualityProfile": "Profil de Qualité",
"AutoTaggingSpecificationQualityProfile": "Profil de qualité",
"AutoTaggingSpecificationRootFolder": "Dossier Racine",
"AutoTaggingSpecificationSeriesType": "Type de série",
"AutoTaggingSpecificationStatus": "État",
@@ -1883,19 +1882,19 @@
"CustomFormatsSpecificationReleaseGroup": "Groupe de versions",
"CustomFormatsSpecificationResolution": "Résolution",
"CustomFormatsSpecificationSource": "Source",
"ImportListsAniListSettingsAuthenticateWithAniList": "Connection avec AniList",
"ImportListsAniListSettingsImportCancelled": "Importation annulé",
"ImportListsAniListSettingsImportCancelledHelpText": "Media : La série est annulé",
"ImportListsAniListSettingsImportCompleted": "Importation terminé",
"ImportListsAniListSettingsAuthenticateWithAniList": "S'authentifier avec AniList",
"ImportListsAniListSettingsImportCancelled": "Importation annulée",
"ImportListsAniListSettingsImportCancelledHelpText": "Médias : La série est annulée",
"ImportListsAniListSettingsImportCompleted": "Importation terminée",
"ImportListsAniListSettingsImportFinished": "Importation terminée",
"ImportListsAniListSettingsUsernameHelpText": "Nom d'utilisateur de la liste à importer",
"ImportListsCustomListSettingsName": "Liste personnalisé",
"ImportListsAniListSettingsUsernameHelpText": "Nom d'utilisateur pour la liste à importer",
"ImportListsCustomListSettingsName": "Liste personnalisée",
"ImportListsCustomListValidationAuthenticationFailure": "Échec de l'authentification",
"ImportListsPlexSettingsAuthenticateWithPlex": "Se connecter avec Plex.tv",
"ImportListsPlexSettingsWatchlistName": "Plex Watchlist",
"ImportListsPlexSettingsAuthenticateWithPlex": "S'authentifier avec Plex.tv",
"ImportListsPlexSettingsWatchlistName": "Liste de surveillance Plex",
"ImportListsSettingsAccessToken": "Jeton d'accès",
"ImportListsSettingsRefreshToken": "Jeton d'actualisation",
"ImportListsSimklSettingsAuthenticatewithSimkl": "Se connecter avec Simkl",
"ImportListsSimklSettingsAuthenticatewithSimkl": "S'authentifier avec Simkl",
"ImportListsSonarrSettingsFullUrl": "URL complète",
"DownloadClientPriorityHelpText": "Priorité du client de téléchargement de 1 (la plus haute) à 50 (la plus faible). Par défaut : 1. Le Round-Robin est utilisé pour les clients ayant la même priorité.",
"CustomFormatsSpecificationRegularExpressionHelpText": "Format personnalisé RegEx est insensible à la casse",
@@ -1923,5 +1922,140 @@
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.",
"DownloadClientAriaSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement par défaut Aria2",
"AddDelayProfileError": "Impossible d'ajouter un nouveau profil de délai, veuillez réessayer.",
"BlocklistReleaseHelpText": "Bloque le téléchargement de cette version par {appName} via RSS ou Recherche automatique"
"BlocklistReleaseHelpText": "Empêche cette version d'être téléchargée par {appName} via RSS ou la recherche automatique",
"NotificationsEmailSettingsUseEncryptionHelpText": "Préférer utiliser le cryptage s'il est configuré sur le serveur, toujours utiliser le cryptage via SSL (port 465 uniquement) ou StartTLS (tout autre port) ou ne jamais utiliser le cryptage",
"LabelIsRequired": "L'étiquette est requise",
"NotificationsEmailSettingsUseEncryption": "Utiliser le cryptage",
"ConnectionSettingsUrlBaseHelpText": "Ajoute un préfixe l'url de {connectionName}, comme {url}",
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Destination pour les téléchargements terminés (facultative), laissez ce champ vide pour utiliser le répertoire par défaut de Deluge",
"DownloadClientDelugeSettingsDirectoryHelpText": "Emplacement dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement Deluge par défaut",
"DownloadClientDelugeSettingsDirectory": "Dossier de téléchargement",
"DownloadClientDelugeSettingsDirectoryCompleted": "Dossier de déplacement une fois terminé",
"ClickToChangeIndexerFlags": "Cliquez pour changer les drapeaux de l'indexeur",
"CustomFormatsSpecificationFlag": "Drapeau",
"CustomFilter": "Filtre personnalisé",
"ImportListsTraktSettingsAuthenticateWithTrakt": "S'authentifier avec Trakt",
"SelectIndexerFlags": "Sélectionner les drapeaux de l'indexeur",
"SetIndexerFlags": "Définir les drapeaux de l'indexeur",
"SetIndexerFlagsModalTitle": "{modalTitle} - Définir les drapeaux de l'indexeur",
"KeepAndTagSeries": "Conserver et étiqueter les séries",
"KeepAndUnmonitorSeries": "Série Garder et ne pas surveiller",
"CustomFormatsSpecificationMaximumSizeHelpText": "La version doit être inférieur ou égal à cette taille",
"ImportListsAniListSettingsImportDroppedHelpText": "Liste : Abandonné",
"ImportListsAniListSettingsImportPlanningHelpText": "Liste : Planification à suivre",
"ImportListsAniListSettingsImportPlanning": "Planification des importations",
"ImportListsAniListSettingsImportReleasing": "Importation de la diffusion",
"ImportListsAniListSettingsImportWatching": "Importation de surveillance",
"ImportListsAniListSettingsImportWatchingHelpText": "Liste : En cours de visionnage",
"ImportListsCustomListSettingsUrlHelpText": "L'URL de la liste des séries",
"ImportListsCustomListValidationConnectionError": "Impossible d'envoyer une requête à cette URL. StatusCode : {exceptionStatusCode}",
"ImportListsPlexSettingsWatchlistRSSName": "Liste de surveillance de Plex RSS",
"ImportListsSettingsAuthUser": "Utilisateur Auth",
"ImportListsSettingsExpires": "Expiration",
"ImportListsSimklSettingsListType": "Type de liste",
"ImportListsSimklSettingsName": "Liste de surveillance des utilisateurs de Simkl",
"ImportListsSimklSettingsListTypeHelpText": "Type de liste à partir de laquelle vous cherchez à importer",
"ImportListsSimklSettingsUserListTypeHold": "Tenir",
"ImportListsSimklSettingsUserListTypeDropped": "Abandonné",
"ImportListsSonarrSettingsApiKeyHelpText": "Clé API de l'instance {appName} à importer depuis",
"ImportListsSonarrSettingsRootFoldersHelpText": "Dossiers racine de l'instance source à partir de laquelle l'importation doit être effectuée",
"ImportListsSonarrSettingsTagsHelpText": "Tags de l'instance source à importer",
"ImportListsTraktSettingsAdditionalParameters": "Paramètres supplémentaires",
"ImportListsTraktSettingsAdditionalParametersHelpText": "Paramètres supplémentaires de l'API Trakt",
"ImportListsTraktSettingsLimitHelpText": "Limiter le nombre de séries à obtenir",
"ImportListsTraktSettingsListType": "Type de liste",
"ImportListsTraktSettingsListTypeHelpText": "Type de liste à partir de laquelle vous cherchez à importer",
"ImportListsTraktSettingsPopularListTypeRecommendedMonthShows": "Spectacles recommandés par mois",
"ImportListsTraktSettingsPopularListTypeRecommendedYearShows": "Spectacles recommandés par année",
"ImportListsTraktSettingsPopularListTypeTopWeekShows": "Spectacles les plus regardés par semaine",
"ImportListsTraktSettingsPopularListTypeTopMonthShows": "Spectacles les plus regardés par mois",
"ImportListsTraktSettingsUserListTypeCollection": "Liste des collections d'utilisateurs",
"ImportListsTraktSettingsUserListName": "Utilisateur de Trakt",
"ImportListsTraktSettingsUserListTypeWatch": "Liste de surveillance des utilisateurs",
"ImportListsTraktSettingsUserListUsernameHelpText": "Nom d'utilisateur pour la liste à importer (laisser vide pour utiliser Auth User)",
"ImportListsTraktSettingsUsernameHelpText": "Nom d'utilisateur pour la liste à importer",
"ImportListsTraktSettingsWatchedListFilter": "Filtre de liste surveillée",
"ImportListsTraktSettingsWatchedListTypeAll": "Tous",
"ImportListsTraktSettingsWatchedListTypeCompleted": "100% regardé",
"MetadataSettingsSeasonImages": "Images de la saison",
"MetadataSettingsEpisodeMetadataImageThumbs": "Métadonnées des épisodes Vignettes des images",
"MetadataXmbcSettingsEpisodeMetadataImageThumbsHelpText": "Inclure des balises d'image dans <filename>.nfo (nécessite 'Episode Metadata')",
"MetadataXmbcSettingsSeriesMetadataHelpText": "tvshow.nfo avec les métadonnées complètes de la série",
"MetadataXmbcSettingsSeriesMetadataUrlHelpText": "Inclure l'URL de la série TheTVDB dans tvshow.nfo (peut être combiné avec 'Métadonnées de la série')",
"MetadataXmbcSettingsSeriesMetadataEpisodeGuideHelpText": "Inclure l'élément JSON du guide d'épisode dans tvshow.nfo (nécessite 'Métadonnées de la série')",
"MetadataSettingsEpisodeImages": "Images de l'épisode",
"MetadataSettingsEpisodeMetadata": "Métadonnées d'épisode",
"NotificationsSettingsUpdateMapPathsFromHelpText": "Chemin d'accès {appName}, utilisé pour modifier les chemins d'accès aux séries lorsque {serviceName} voit l'emplacement du chemin d'accès à la bibliothèque différemment de {appName} (Nécessite 'Mettre à jour la bibliothèque')",
"ReleaseType": "Type de version",
"ImportListsSimklSettingsUserListTypeWatching": "Regarder",
"ImportListsTraktSettingsLimit": "Limite",
"ImportListsSimklSettingsUserListTypeCompleted": "Terminé",
"ImportListsAniListSettingsImportReleasingHelpText": "Médias : Diffusion actuelle de nouveaux épisodes",
"ImportListsAniListSettingsImportRepeating": "Importation répétée",
"ImportListsAniListSettingsImportRepeatingHelpText": "Liste : En cours de relecture",
"ImportListsSimklSettingsUserListTypePlanToWatch": "Plan de surveillance",
"ImportListsSonarrSettingsFullUrlHelpText": "URL, y compris le port, de l'instance {appName} à importer depuis",
"ImportListsTraktSettingsUserListTypeWatched": "Liste des utilisateurs surveillés",
"Label": "Étiquette",
"MetadataSettingsSeriesMetadataEpisodeGuide": "Guide des épisodes de métadonnées de séries",
"MetadataSettingsSeriesMetadata": "Métadonnées de la série",
"MetadataSettingsSeriesImages": "Série Images",
"CleanLibraryLevel": "Nettoyer le niveau de la bibliothèque",
"EpisodeRequested": "Épisode demandé",
"CustomFormatsSpecificationMinimumSizeHelpText": "La version doit être supérieure à cette taille",
"ImportListsAniListSettingsImportNotYetReleasedHelpText": "Médias : La diffusion n'a pas encore commencé",
"ImportListsAniListSettingsImportPaused": "Importation en pause",
"ImportListsAniListSettingsImportPausedHelpText": "Liste : En attente",
"ImportListsCustomListSettingsUrl": "URL de la liste",
"ImportListStatusAllPossiblePartialFetchHealthCheckMessage": "Toutes les listes requièrent une interaction manuelle en raison de la possibilité de recherches partielles",
"ImportListsAniListSettingsImportCompletedHelpText": "Liste : Surveillance achevée",
"ImportListsAniListSettingsImportDropped": "Importation abandonnée",
"ImportListsAniListSettingsImportFinishedHelpText": "Médias : Tous les épisodes ont été diffusés",
"ImportListsAniListSettingsImportHiatus": "Hiatus d'importation",
"ImportListsAniListSettingsImportHiatusHelpText": "Médias : Série en hiatus",
"ImportListsAniListSettingsImportNotYetReleased": "Importation non encore diffusée",
"ImportListsSimklSettingsShowType": "Type de spectacle",
"ImportListsSimklSettingsShowTypeHelpText": "Type de spectacle que vous souhaitez importer",
"ImportListsSonarrSettingsQualityProfilesHelpText": "Profils de qualité de l'instance source à importer",
"ImportListsSonarrValidationInvalidUrl": "L'URL de {appName} n'est pas valide, vous manque-t-il une base d'URL ?",
"ImportListsSettingsRssUrl": "URL RSS",
"ImportListsImdbSettingsListId": "ID de la liste",
"ImportListsImdbSettingsListIdHelpText": "ID de la liste IMDb (par exemple ls12345678)",
"ImportListsTraktSettingsGenres": "Genres",
"ImportListsTraktSettingsGenresHelpText": "Filtrer les séries par Trakt Genre Slug (séparées par des virgules) Uniquement pour les listes populaires",
"ImportListsTraktSettingsPopularListTypeRecommendedWeekShows": "Spectacles recommandés par semaine",
"ImportListsTraktSettingsPopularListTypeTopAllTimeShows": "Les émissions les plus regardées de tous les temps",
"ImportListsTraktSettingsPopularListTypeTopYearShows": "Spectacles les plus regardés par année",
"ImportListsTraktSettingsPopularListTypeTrendingShows": "Spectacles en vogue",
"ImportListsTraktSettingsPopularName": "Liste populaire de Trakt",
"ImportListsTraktSettingsRating": "Evaluation",
"ImportListsTraktSettingsRatingHelpText": "Série de filtres par plage de valeurs nominales (0-100)",
"ImportListsTraktSettingsWatchedListFilterHelpText": "Si le type de liste est surveillé, sélectionnez le type de série que vous souhaitez importer",
"ImportListsTraktSettingsWatchedListSorting": "Tri de la liste de surveillance",
"ImportListsTraktSettingsWatchedListSortingHelpText": "Si le type de liste est surveillé, sélectionnez l'ordre de tri de la liste",
"ImportListsTraktSettingsListName": "Nom de la liste",
"ImportListsTraktSettingsListNameHelpText": "Nom de la liste à importer, la liste doit être publique ou vous devez avoir accès à la liste",
"ImportListsTraktSettingsPopularListTypeAnticipatedShows": "Spectacles attendus",
"ImportListsTraktSettingsPopularListTypePopularShows": "Spectacles populaires",
"ImportListsTraktSettingsPopularListTypeRecommendedAllTimeShows": "Spectacles recommandés de tous les temps",
"ImportListsTraktSettingsWatchedListTypeInProgress": "En cours",
"ImportListsTraktSettingsYears": "Années",
"ImportListsTraktSettingsYearsHelpText": "Filtrer les séries par année ou par plage d'années",
"ImportListsValidationUnableToConnectException": "Impossible de se connecter à la liste des importations : {exceptionMessage}. Consultez les logs entourant cette erreur pour plus de détails.",
"ImportListsValidationInvalidApiKey": "La clé API n'est pas valide",
"ImportListsValidationTestFailed": "Le test a été interrompu en raison d'une erreur : {exceptionMessage}",
"IndexerFlags": "Drapeaux de l'indexeur",
"ImportListsSonarrSettingsSyncSeasonMonitoring": "Suivi de la saison de synchronisation",
"ImportListsSonarrSettingsSyncSeasonMonitoringHelpText": "La surveillance de la saison de synchronisation à partir de linstance {appName} si l'option 'Monitor' est activée, elle sera ignorée",
"ListSyncTag": "Balise de synchronisation de liste",
"ListSyncTagHelpText": "Cette étiquette sera ajoutée lorsqu'une série tombera ou ne figurera plus sur votre (vos) liste(s)",
"LogOnly": "Log seulement",
"ListSyncLevelHelpText": "Les séries de la bibliothèque seront traitées en fonction de votre sélection si elles tombent ou ne figurent pas sur votre (vos) liste(s)",
"MetadataPlexSettingsSeriesPlexMatchFile": "Fichier de correspondance Plex série",
"MetadataPlexSettingsSeriesPlexMatchFileHelpText": "Crée un fichier .plexmatch dans le dossier de la série",
"MetadataSettingsSeriesMetadataUrl": "URL des métadonnées de la série",
"NotificationsPlexValidationNoTvLibraryFound": "Au moins une bibliothèque de télévision est requise",
"DatabaseMigration": "Migration des bases de données",
"Filters": "Filtres",
"ReleaseProfileIndexerHelpTextWarning": "L'utilisation d'un indexeur spécifique avec des profils de version peut entraîner la saisie de publications en double."
}

View File

@@ -17,14 +17,14 @@
"RemoveSelectedItemsQueueMessageText": "Biztosan el akar távolítani {selectedCount} elemet a várólistáról?",
"Required": "Kötelező",
"Added": "Hozzáadva",
"ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {hossz} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban",
"ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {length} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban",
"ApplyChanges": "Változások alkalmazása",
"AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges az alkalmazás adatok törlése nélkül",
"AutomaticAdd": "Automatikus hozzáadás",
"CountSeasons": "{count} Évad",
"DownloadClientCheckNoneAvailableHealthCheckMessage": "Nincs elérhető letöltési kliens",
"DownloadClientRootFolderHealthCheckMessage": "A letöltési kliens {downloadClientName} a letöltéseket a gyökérmappába helyezi. Ne tölts le közvetlenül a gyökérmappába.",
"DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Nem lehet kommunikálni a {downloadClientName} -val",
"DownloadClientRootFolderHealthCheckMessage": "A letöltési kliens {downloadClientName} a letöltéseket a gyökérmappába helyezi {rootFolderPath}. Ne tölts le közvetlenül a gyökérmappába.",
"DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Nem lehet kommunikálni a {downloadClientName}. {errorMessage}",
"DownloadClientStatusAllClientHealthCheckMessage": "Az összes letöltési kliens elérhetetlen meghibásodások miatt",
"EditSelectedDownloadClients": "Kijelölt letöltési kliensek szerkesztése",
"EditSelectedImportLists": "Kijelölt importálási listák szerkesztése",
@@ -36,7 +36,7 @@
"Ended": "Vége",
"HideAdvanced": "Haladó elrejtése",
"ImportListRootFolderMissingRootHealthCheckMessage": "Hiányzó gyökérmappa a/az {rootFolderInfo} importálási listához",
"ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Több gyökérmappa hiányzik a/az {rootFoldersInfo} importálási listához",
"ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Több gyökérmappa hiányzik a/az {rootFolderInfo} importálási listához",
"Enabled": "Engedélyezés",
"HiddenClickToShow": "Rejtett, kattints a felfedéshez",
"ImportListStatusAllUnavailableHealthCheckMessage": "Minden lista elérhetetlen meghibásodások miatt",
@@ -94,7 +94,7 @@
"SystemTimeHealthCheckMessage": "A rendszer idő több, mint 1 napot eltér az aktuális időtől. Előfordulhat, hogy az ütemezett feladatok nem futnak megfelelően, amíg az időt nem korrigálják",
"Unmonitored": "Nem felügyelt",
"UpdateStartupNotWritableHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a kezdő mappa '{startupFolder}' nem írható a(z) '{userName}' felhasználó által.",
"UpdateStartupTranslocationHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a kezdő mappa '{indítási mappa}' az App Translocation mappában található.",
"UpdateStartupTranslocationHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a kezdő mappa '{startupFolder}' az App Translocation mappában található.",
"UpdateAvailableHealthCheckMessage": "Új frissítés elérhető",
"UpdateUiNotWritableHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a felhasználó '{userName}' nem rendelkezik írási jogosultsággal a(z) '{uiFolder}' felhasználói felület mappában.",
"DownloadClientSortingHealthCheckMessage": "A(z) {downloadClientName} letöltési kliensben engedélyezve van a {sortingMode} rendezés a {appName} kategóriájához. Az import problémák elkerülése érdekében ki kell kapcsolnia a rendezést a letöltési kliensben.",
@@ -891,10 +891,9 @@
"DeleteSelectedIndexersMessageText": "Biztosan törölni szeretne {count} kiválasztott indexelőt?",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Függetlenül attól, hogy a qBittorrent konfigurált tartalomelrendezését használja, az eredeti elrendezést a torrentből, vagy mindig hozzon létre egy almappát (qBittorrent 4.3.2)",
"FormatAgeDay": "nap",
"FormatRuntimeMinutes": "{perc} p",
"FormatRuntimeMinutes": "{minutes} p",
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "A(z) {downloadClientName} letöltési kliens úgy van beállítva, hogy eltávolítsa a befejezett letöltéseket. Ez azt eredményezheti, hogy a letöltések eltávolításra kerülnek az ügyfélprogramból, mielőtt a {appName} importálhatná őket.",
"RecyclingBinCleanupHelpTextWarning": "A kiválasztott napoknál régebbi fájlok a lomtárban automatikusan törlődnek",
"ReleaseProfileIndexerHelpTextWarning": "Egy adott indexelő kiadási profilokkal történő használata duplikált kiadások megragadásához vezethet",
"RemotePath": "Távoli útvonal",
"RelativePath": "Relatív út",
"ReleaseProfile": "Release profil",
@@ -975,7 +974,6 @@
"DeleteSelectedDownloadClientsMessageText": "Biztosan törölni szeretné a kiválasztott {count} letöltési klienst?",
"Tba": "TBA",
"SpecialsFolderFormat": "Különleges mappa formátum",
"TablePageSizeMinimum": "A relatív elérési utak a(z) {appName} AppData könyvtárában találhatók",
"TorrentDelay": "Torrent Késleltetés",
"TorrentBlackhole": "Torrent Blackhole",
"TorrentDelayHelpText": "Percek késése, hogy várjon, mielőtt megragad egy torrentet",
@@ -1107,7 +1105,7 @@
"DownloadClientFloodSettingsStartOnAdd": "Kezdje a Hozzáadás lehetőséggel",
"ImportExtraFiles": "Extra fájlok importálása",
"ImportListExclusions": "Listakizárások importálása",
"BlocklistReleaseHelpText": "Letiltja ennek a kiadásnak a letöltését a(z) {app Name} által RSS-en vagy automatikus keresésen keresztül",
"BlocklistReleaseHelpText": "Letiltja ennek a kiadásnak a letöltését a(z) {appName} által RSS-en vagy automatikus keresésen keresztül",
"CustomFormatUnknownCondition": "Ismeretlen egyéni formátum feltétele „{implementation}”",
"AutoTaggingNegateHelpText": "Ha be van jelölve, az automatikus címkézési szabály nem érvényesül, ha ez a {implementationName} feltétel megfelel.",
"CountSeriesSelected": "{count} sorozat kiválasztva",
@@ -1380,7 +1378,7 @@
"ProcessingFolders": "Mappák feldolgozása",
"ProgressBarProgress": "Haladásjelző sáv: {progress}%",
"ProxyType": "Proxy típus",
"RegularExpressionsTutorialLink": "További részletek a reguláris kifejezésekről [itt](https://www.regular-expressions.info/tutorial.html).",
"RegularExpressionsTutorialLink": "További részletek a reguláris kifejezésekről [itt]({url}).",
"ReplaceIllegalCharacters": "Cserélje ki az illegális karaktereket",
"ResetDefinitionTitlesHelpText": "A definíciócímek és értékek visszaállítása",
"ResetDefinitions": "Definíciók visszaállítása",

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