mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-27 17:54:43 -04:00
Compare commits
93 Commits
v0.3.6.223
...
v0.3.14.23
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf415e61de | ||
|
|
9865e92cea | ||
|
|
1cf956a9d9 | ||
|
|
8989c55c8c | ||
|
|
dc83e0127e | ||
|
|
34eb312426 | ||
|
|
9d5cdebdb2 | ||
|
|
a0ab224acd | ||
|
|
05aa35a54d | ||
|
|
ca7f8775f5 | ||
|
|
2a01e9b445 | ||
|
|
7d30c7d1ea | ||
|
|
50be87e5a4 | ||
|
|
0572d1ac80 | ||
|
|
d2240514d7 | ||
|
|
ad47dc032d | ||
|
|
6c6df7d7d9 | ||
|
|
2121204064 | ||
|
|
61004ea33f | ||
|
|
54c1c7862e | ||
|
|
43dfdc8bf5 | ||
|
|
0d1ae0ca4e | ||
|
|
9902889a30 | ||
|
|
04d7061030 | ||
|
|
fd201912a9 | ||
|
|
c412701a3d | ||
|
|
7451a66365 | ||
|
|
a6431fdb0b | ||
|
|
060b133f6d | ||
|
|
5ed13b942b | ||
|
|
89f3d8167b | ||
|
|
77b027374f | ||
|
|
650490abb2 | ||
|
|
7d2e215d61 | ||
|
|
65ff890c74 | ||
|
|
50c0b0dbaa | ||
|
|
d5f36d0144 | ||
|
|
fab7558bd4 | ||
|
|
3dc86b3a01 | ||
|
|
24ad6134e3 | ||
|
|
033f8c40af | ||
|
|
4c73a619eb | ||
|
|
3ca798e983 | ||
|
|
d9827fd6a6 | ||
|
|
f4f03a853f | ||
|
|
4f4e4bf2ca | ||
|
|
413a70a312 | ||
|
|
a8f2b91010 | ||
|
|
68a4ee6000 | ||
|
|
5196ce311b | ||
|
|
ae92b22727 | ||
|
|
0bccffef01 | ||
|
|
bca899b9c0 | ||
|
|
2bb576a94b | ||
|
|
bb49949853 | ||
|
|
a093061b29 | ||
|
|
df876707c4 | ||
|
|
2af33143ba | ||
|
|
c3c5a47776 | ||
|
|
a21abe0838 | ||
|
|
a32f5f6639 | ||
|
|
4cd45ecc21 | ||
|
|
2c8e0b1ca4 | ||
|
|
bd25c9e3e0 | ||
|
|
ee64b8788b | ||
|
|
7aeada2089 | ||
|
|
e188c9aac0 | ||
|
|
a3ae2359f5 | ||
|
|
5b92905dd4 | ||
|
|
fc402743aa | ||
|
|
b9d53ed732 | ||
|
|
d248747635 | ||
|
|
d70224c811 | ||
|
|
acdf8c8aa8 | ||
|
|
3ed41554ce | ||
|
|
ce808c6d7b | ||
|
|
63b1b56a4f | ||
|
|
a5647bedc8 | ||
|
|
fe659bb79d | ||
|
|
9918535509 | ||
|
|
f9a6db40b8 | ||
|
|
6273d69ed6 | ||
|
|
7012380e95 | ||
|
|
b001ecd698 | ||
|
|
e28becdda4 | ||
|
|
eae06695e8 | ||
|
|
54a9af2ced | ||
|
|
c9b55266fc | ||
|
|
05b64406a4 | ||
|
|
1f37c5387b | ||
|
|
4a6c7042fe | ||
|
|
d7305b9753 | ||
|
|
bd56643eaa |
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,5 +1,5 @@
|
||||
name: Bug Report
|
||||
description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Reddit or Discord first'
|
||||
description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Discord first'
|
||||
labels: ['Type: Bug', 'Status: Needs Triage']
|
||||
body:
|
||||
- type: checkboxes
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/config.yml
vendored
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -3,6 +3,3 @@ contact_links:
|
||||
- name: Support via Discord
|
||||
url: https://readarr.com/discord
|
||||
about: Chat with users and devs on support and setup related topics.
|
||||
- name: Support via Reddit
|
||||
url: https://reddit.com/r/Readarr
|
||||
about: Discuss and search thru support topics.
|
||||
|
||||
3
.github/workflows/support.yml
vendored
3
.github/workflows/support.yml
vendored
@@ -15,8 +15,7 @@ jobs:
|
||||
issue-comment: >
|
||||
:wave: @{issue-author}, we use the issue tracker exclusively
|
||||
for bug reports and feature requests. However, this issue appears
|
||||
to be a support request. Please hop over onto our [Discord](https://readarr.com/discord)
|
||||
or [Subreddit](https://reddit.com/r/readarr)
|
||||
to be a support request. Please hop over onto our [Discord](https://readarr.com/discord).
|
||||
close-issue: true
|
||||
lock-issue: false
|
||||
- uses: dessant/support-requests@v3
|
||||
|
||||
@@ -9,13 +9,13 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '0.3.6'
|
||||
majorVersion: '0.3.14'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
readarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
||||
sentryOrg: 'servarr'
|
||||
sentryUrl: 'https://sentry.servarr.com'
|
||||
dotnetVersion: '6.0.413'
|
||||
dotnetVersion: '6.0.417'
|
||||
nodeVersion: '16.X'
|
||||
innoVersion: '6.2.0'
|
||||
windowsImage: 'windows-2022'
|
||||
|
||||
@@ -338,4 +338,8 @@ Queue.propTypes = {
|
||||
onRemoveSelectedPress: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
Queue.defaultProps = {
|
||||
count: 0
|
||||
};
|
||||
|
||||
export default Queue;
|
||||
|
||||
@@ -7,13 +7,10 @@ function findImage(images, coverType) {
|
||||
}
|
||||
|
||||
function getUrl(image, coverType, size) {
|
||||
if (image) {
|
||||
// Remove protocol
|
||||
let url = image.url;
|
||||
const imageUrl = image?.url;
|
||||
|
||||
url = url.replace(`${coverType}.jpg`, `${coverType}-${size}.jpg`);
|
||||
|
||||
return url;
|
||||
if (imageUrl) {
|
||||
return imageUrl.replace(`${coverType}.jpg`, `${coverType}-${size}.jpg`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,10 @@
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.filterIcon {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.authorNavigationButtons {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
|
||||
@@ -6,6 +6,7 @@ interface CssExports {
|
||||
'authorUpButton': string;
|
||||
'contentContainer': string;
|
||||
'errorMessage': string;
|
||||
'filterIcon': string;
|
||||
'innerContentBody': string;
|
||||
'metadataMessage': string;
|
||||
'selectedTab': string;
|
||||
|
||||
@@ -239,9 +239,14 @@ class AuthorDetails extends Component {
|
||||
saveError,
|
||||
isDeleting,
|
||||
deleteError,
|
||||
statistics
|
||||
statistics = {}
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
bookFileCount = 0,
|
||||
totalBookCount = 0
|
||||
} = statistics;
|
||||
|
||||
const {
|
||||
isOrganizeModalOpen,
|
||||
isRetagModalOpen,
|
||||
@@ -435,7 +440,7 @@ class AuthorDetails extends Component {
|
||||
className={styles.tab}
|
||||
selectedClassName={styles.selectedTab}
|
||||
>
|
||||
{translate('BooksTotal', [statistics.totalBookCount])}
|
||||
{translate('BooksTotal', [totalBookCount])}
|
||||
</Tab>
|
||||
|
||||
<Tab
|
||||
@@ -463,7 +468,7 @@ class AuthorDetails extends Component {
|
||||
className={styles.tab}
|
||||
selectedClassName={styles.selectedTab}
|
||||
>
|
||||
{translate('FilesTotal', [statistics.bookFileCount])}
|
||||
{translate('FilesTotal', [bookFileCount])}
|
||||
</Tab>
|
||||
|
||||
{
|
||||
|
||||
@@ -136,8 +136,9 @@
|
||||
}
|
||||
|
||||
.title {
|
||||
font-weight: 300;
|
||||
font-size: 30px;
|
||||
line-height: 50px;
|
||||
line-height: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,12 +25,7 @@ const defaultFontSize = parseInt(fonts.defaultFontSize);
|
||||
const lineHeight = parseFloat(fonts.lineHeight);
|
||||
|
||||
function getFanartUrl(images) {
|
||||
const fanartImage = images.find((x) => x.coverType === 'fanart');
|
||||
|
||||
if (fanartImage) {
|
||||
// Remove protocol
|
||||
return fanartImage.url.replace(/^https?:/, '');
|
||||
}
|
||||
return images.find((x) => x.coverType === 'fanart')?.url;
|
||||
}
|
||||
|
||||
class AuthorDetailsHeader extends Component {
|
||||
|
||||
9
frontend/src/Author/History/AuthorHistoryTable.css
Normal file
9
frontend/src/Author/History/AuthorHistoryTable.css
Normal file
@@ -0,0 +1,9 @@
|
||||
.container {
|
||||
border: 1px solid var(--borderColor);
|
||||
border-radius: 4px;
|
||||
background-color: var(--inputBackgroundColor);
|
||||
|
||||
&:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
7
frontend/src/Author/History/AuthorHistoryTable.css.d.ts
vendored
Normal file
7
frontend/src/Author/History/AuthorHistoryTable.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'container': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
@@ -1,6 +1,7 @@
|
||||
import React from 'react';
|
||||
import AuthorHistoryContentConnector from 'Author/History/AuthorHistoryContentConnector';
|
||||
import AuthorHistoryTableContent from 'Author/History/AuthorHistoryTableContent';
|
||||
import styles from './AuthorHistoryTable.css';
|
||||
|
||||
function AuthorHistoryTable(props) {
|
||||
const {
|
||||
@@ -8,10 +9,12 @@ function AuthorHistoryTable(props) {
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<AuthorHistoryContentConnector
|
||||
component={AuthorHistoryTableContent}
|
||||
{...otherProps}
|
||||
/>
|
||||
<div className={styles.container}>
|
||||
<AuthorHistoryContentConnector
|
||||
component={AuthorHistoryTableContent}
|
||||
{...otherProps}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
.blankpad {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
padding-left: 2em;
|
||||
}
|
||||
7
frontend/src/Author/History/AuthorHistoryTableContent.css.d.ts
vendored
Normal file
7
frontend/src/Author/History/AuthorHistoryTableContent.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'blankpad': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
@@ -7,6 +7,7 @@ import TableBody from 'Components/Table/TableBody';
|
||||
import { kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import AuthorHistoryRowConnector from './AuthorHistoryRowConnector';
|
||||
import styles from './AuthorHistoryTableContent.css';
|
||||
|
||||
const columns = [
|
||||
{
|
||||
@@ -64,7 +65,7 @@ class AuthorHistoryTableContent extends Component {
|
||||
const hasItems = !!items.length;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
{
|
||||
isFetching &&
|
||||
<LoadingIndicator />
|
||||
@@ -79,7 +80,7 @@ class AuthorHistoryTableContent extends Component {
|
||||
|
||||
{
|
||||
isPopulated && !hasItems && !error &&
|
||||
<div>
|
||||
<div className={styles.blankpad}>
|
||||
{translate('NoHistory')}
|
||||
</div>
|
||||
}
|
||||
@@ -103,7 +104,7 @@ class AuthorHistoryTableContent extends Component {
|
||||
</TableBody>
|
||||
</Table>
|
||||
}
|
||||
</>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,9 +99,14 @@ class BookDetails extends Component {
|
||||
nextBook,
|
||||
isSearching,
|
||||
onRefreshPress,
|
||||
onSearchPress
|
||||
onSearchPress,
|
||||
statistics = {}
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
bookFileCount = 0
|
||||
} = statistics;
|
||||
|
||||
const {
|
||||
isOrganizeModalOpen,
|
||||
isRetagModalOpen,
|
||||
@@ -238,21 +243,21 @@ class BookDetails extends Component {
|
||||
className={styles.tab}
|
||||
selectedClassName={styles.selectedTab}
|
||||
>
|
||||
History
|
||||
{translate('History')}
|
||||
</Tab>
|
||||
|
||||
<Tab
|
||||
className={styles.tab}
|
||||
selectedClassName={styles.selectedTab}
|
||||
>
|
||||
Search
|
||||
{translate('Search')}
|
||||
</Tab>
|
||||
|
||||
<Tab
|
||||
className={styles.tab}
|
||||
selectedClassName={styles.selectedTab}
|
||||
>
|
||||
Files
|
||||
{translate('FilesTotal', [bookFileCount])}
|
||||
</Tab>
|
||||
|
||||
{
|
||||
@@ -335,6 +340,7 @@ BookDetails.propTypes = {
|
||||
ratings: PropTypes.object.isRequired,
|
||||
images: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
links: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
statistics: PropTypes.object.isRequired,
|
||||
monitored: PropTypes.bool.isRequired,
|
||||
shortDateFormat: PropTypes.string.isRequired,
|
||||
isSaving: PropTypes.bool.isRequired,
|
||||
|
||||
@@ -117,8 +117,9 @@
|
||||
}
|
||||
|
||||
.title {
|
||||
font-weight: 300;
|
||||
font-size: 30px;
|
||||
line-height: 50px;
|
||||
line-height: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,12 +21,7 @@ const defaultFontSize = parseInt(fonts.defaultFontSize);
|
||||
const lineHeight = parseFloat(fonts.lineHeight);
|
||||
|
||||
function getFanartUrl(images) {
|
||||
const fanartImage = images.find((x) => x.coverType === 'fanart');
|
||||
|
||||
if (fanartImage) {
|
||||
// Remove protocol
|
||||
return fanartImage.url.replace(/^https?:/, '');
|
||||
}
|
||||
return images.find((x) => x.coverType === 'fanart')?.url;
|
||||
}
|
||||
|
||||
class BookDetailsHeader extends Component {
|
||||
|
||||
@@ -229,7 +229,6 @@ class BookIndexRow extends Component {
|
||||
className={styles[name]}
|
||||
>
|
||||
{bookFileCount}
|
||||
|
||||
</VirtualTableRowCell>
|
||||
);
|
||||
}
|
||||
|
||||
9
frontend/src/BookFile/Editor/BookFileEditorTable.css
Normal file
9
frontend/src/BookFile/Editor/BookFileEditorTable.css
Normal file
@@ -0,0 +1,9 @@
|
||||
.container {
|
||||
border: 1px solid var(--borderColor);
|
||||
border-radius: 4px;
|
||||
background-color: var(--inputBackgroundColor);
|
||||
|
||||
&:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
7
frontend/src/BookFile/Editor/BookFileEditorTable.css.d.ts
vendored
Normal file
7
frontend/src/BookFile/Editor/BookFileEditorTable.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'container': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
@@ -1,5 +1,6 @@
|
||||
import React from 'react';
|
||||
import BookFileEditorTableContentConnector from './BookFileEditorTableContentConnector';
|
||||
import styles from './BookFileEditorTable.css';
|
||||
|
||||
function BookFileEditorTable(props) {
|
||||
const {
|
||||
@@ -7,9 +8,11 @@ function BookFileEditorTable(props) {
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<BookFileEditorTableContentConnector
|
||||
{...otherProps}
|
||||
/>
|
||||
<div className={styles.container}>
|
||||
<BookFileEditorTableContentConnector
|
||||
{...otherProps}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.filesTable {
|
||||
margin-bottom: 20px;
|
||||
padding-top: 15px;
|
||||
margin: 10px;
|
||||
padding-top: 5px;
|
||||
border: 1px solid var(--borderColor);
|
||||
border-top: 1px solid var(--borderColor);
|
||||
border-radius: 4px;
|
||||
@@ -13,9 +13,15 @@
|
||||
|
||||
.actions {
|
||||
display: flex;
|
||||
margin-right: auto;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.selectInput {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.blankpad {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'actions': string;
|
||||
'blankpad': string;
|
||||
'filesTable': string;
|
||||
'selectInput': string;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import _ from 'lodash';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import SelectInput from 'Components/Form/SelectInput';
|
||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
@@ -120,7 +121,7 @@ class BookFileEditorTableContent extends Component {
|
||||
const hasSelectedFiles = this.getSelectedIds().length > 0;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
{
|
||||
isFetching && !isPopulated ?
|
||||
<LoadingIndicator /> :
|
||||
@@ -129,13 +130,13 @@ class BookFileEditorTableContent extends Component {
|
||||
|
||||
{
|
||||
!isFetching && error ?
|
||||
<div>{error}</div> :
|
||||
<Alert kind={kinds.DANGER}>{error}</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
isPopulated && !items.length ?
|
||||
<div>
|
||||
<div className={styles.blankpad}>
|
||||
No book files to manage.
|
||||
</div> :
|
||||
null
|
||||
@@ -173,26 +174,30 @@ class BookFileEditorTableContent extends Component {
|
||||
null
|
||||
}
|
||||
|
||||
<div className={styles.actions}>
|
||||
<SpinnerButton
|
||||
kind={kinds.DANGER}
|
||||
isSpinning={isDeleting}
|
||||
isDisabled={!hasSelectedFiles}
|
||||
onPress={this.onDeletePress}
|
||||
>
|
||||
Delete
|
||||
</SpinnerButton>
|
||||
{
|
||||
isPopulated && items.length ? (
|
||||
<div className={styles.actions}>
|
||||
<SpinnerButton
|
||||
kind={kinds.DANGER}
|
||||
isSpinning={isDeleting}
|
||||
isDisabled={!hasSelectedFiles}
|
||||
onPress={this.onDeletePress}
|
||||
>
|
||||
{translate('Delete')}
|
||||
</SpinnerButton>
|
||||
|
||||
<div className={styles.selectInput}>
|
||||
<SelectInput
|
||||
name="quality"
|
||||
value="selectQuality"
|
||||
values={qualityOptions}
|
||||
isDisabled={!hasSelectedFiles}
|
||||
onChange={this.onQualityChange}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className={styles.selectInput}>
|
||||
<SelectInput
|
||||
name="quality"
|
||||
value="selectQuality"
|
||||
values={qualityOptions}
|
||||
isDisabled={!hasSelectedFiles}
|
||||
onChange={this.onQualityChange}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
) : null
|
||||
}
|
||||
|
||||
<ConfirmModal
|
||||
isOpen={isConfirmDeleteModalOpen}
|
||||
@@ -203,7 +208,7 @@ class BookFileEditorTableContent extends Component {
|
||||
onConfirm={this.onConfirmDelete}
|
||||
onCancel={this.onConfirmDeleteModalClose}
|
||||
/>
|
||||
</>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ class CalendarConnector extends Component {
|
||||
gotoCalendarToday
|
||||
} = this.props;
|
||||
|
||||
registerPagePopulator(this.repopulate);
|
||||
registerPagePopulator(this.repopulate, ['bookFileUpdated', 'bookFileDeleted']);
|
||||
|
||||
if (useCurrentPage) {
|
||||
fetchCalendar();
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
.description {
|
||||
line-height: $lineHeight;
|
||||
}
|
||||
|
||||
.description {
|
||||
margin-left: 0;
|
||||
line-height: $lineHeight;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
|
||||
@@ -202,6 +202,8 @@ class SignalRConnector extends Component {
|
||||
this.props.dispatchUpdateItem({ section, ...body.resource });
|
||||
} else if (body.action === 'deleted') {
|
||||
this.props.dispatchRemoveItem({ section, id: body.resource.id });
|
||||
|
||||
repopulatePage('bookFileDeleted');
|
||||
}
|
||||
|
||||
// Repopulate the page to handle recently imported file
|
||||
|
||||
@@ -15,5 +15,5 @@
|
||||
"start_url": "../../../../",
|
||||
"theme_color": "#3a3f51",
|
||||
"background_color": "#3a3f51",
|
||||
"display": "standalone"
|
||||
"display": "minimal-ui"
|
||||
}
|
||||
|
||||
120
frontend/src/Diag/ConsoleApi.js
Normal file
120
frontend/src/Diag/ConsoleApi.js
Normal file
@@ -0,0 +1,120 @@
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
|
||||
// This file contains some helpers for power users in a browser console
|
||||
|
||||
let hasWarned = false;
|
||||
|
||||
function checkActivationWarning() {
|
||||
if (!hasWarned) {
|
||||
console.log('Activated ReadarrApi console helpers.');
|
||||
console.warn('Be warned: There will be no further confirmation checks.');
|
||||
hasWarned = true;
|
||||
}
|
||||
}
|
||||
|
||||
function attachAsyncActions(promise) {
|
||||
promise.filter = function() {
|
||||
const args = arguments;
|
||||
const res = this.then((d) => d.filter(...args));
|
||||
attachAsyncActions(res);
|
||||
return res;
|
||||
};
|
||||
|
||||
promise.map = function() {
|
||||
const args = arguments;
|
||||
const res = this.then((d) => d.map(...args));
|
||||
attachAsyncActions(res);
|
||||
return res;
|
||||
};
|
||||
|
||||
promise.all = function() {
|
||||
const res = this.then((d) => Promise.all(d));
|
||||
attachAsyncActions(res);
|
||||
return res;
|
||||
};
|
||||
|
||||
promise.forEach = function(action) {
|
||||
const res = this.then((d) => Promise.all(d.map(action)));
|
||||
attachAsyncActions(res);
|
||||
return res;
|
||||
};
|
||||
}
|
||||
|
||||
class ResourceApi {
|
||||
constructor(api, url) {
|
||||
this.api = api;
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
single(id) {
|
||||
return this.api.fetch(`${this.url}/${id}`);
|
||||
}
|
||||
|
||||
all() {
|
||||
return this.api.fetch(this.url);
|
||||
}
|
||||
|
||||
filter(pred) {
|
||||
return this.all().filter(pred);
|
||||
}
|
||||
|
||||
update(resource) {
|
||||
return this.api.fetch(`${this.url}/${resource.id}`, { method: 'PUT', data: resource });
|
||||
}
|
||||
|
||||
delete(resource) {
|
||||
if (typeof resource === 'object' && resource !== null && resource.id) {
|
||||
resource = resource.id;
|
||||
}
|
||||
|
||||
if (!resource || !Number.isInteger(resource)) {
|
||||
throw Error('Invalid resource', resource);
|
||||
}
|
||||
|
||||
return this.api.fetch(`${this.url}/${resource}`, { method: 'DELETE' });
|
||||
}
|
||||
|
||||
fetch(url, options) {
|
||||
return this.api.fetch(`${this.url}${url}`, options);
|
||||
}
|
||||
}
|
||||
|
||||
class ConsoleApi {
|
||||
constructor() {
|
||||
this.author = new ResourceApi(this, '/author');
|
||||
}
|
||||
|
||||
resource(url) {
|
||||
return new ResourceApi(this, url);
|
||||
}
|
||||
|
||||
fetch(url, options) {
|
||||
checkActivationWarning();
|
||||
|
||||
options = options || {};
|
||||
|
||||
const req = {
|
||||
url,
|
||||
method: options.method || 'GET'
|
||||
};
|
||||
|
||||
if (options.data) {
|
||||
req.dataType = 'json';
|
||||
req.data = JSON.stringify(options.data);
|
||||
}
|
||||
|
||||
const promise = createAjaxRequest(req).request;
|
||||
|
||||
promise.fail((xhr) => {
|
||||
console.error(`Failed to fetch ${url}`, xhr);
|
||||
});
|
||||
|
||||
attachAsyncActions(promise);
|
||||
|
||||
return promise;
|
||||
}
|
||||
}
|
||||
|
||||
window.ReadarrApi = new ConsoleApi();
|
||||
|
||||
export default ConsoleApi;
|
||||
@@ -8,11 +8,13 @@
|
||||
}
|
||||
|
||||
.name {
|
||||
flex: 1 0 300px;
|
||||
@add-mixin truncate;
|
||||
|
||||
flex: 0 1 600px;
|
||||
}
|
||||
|
||||
.foreignId {
|
||||
flex: 0 0 200px;
|
||||
flex: 0 0 100px;
|
||||
}
|
||||
|
||||
.actions {
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.foreignId {
|
||||
flex: 0 0 200px;
|
||||
.name {
|
||||
flex: 0 1 600px;
|
||||
}
|
||||
|
||||
.name {
|
||||
flex: 1 0 300px;
|
||||
.foreignId {
|
||||
flex: 0 0 100px;
|
||||
}
|
||||
|
||||
.addImportListExclusion {
|
||||
|
||||
@@ -212,26 +212,24 @@ class MediaManagement extends Component {
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
settings.importExtraFiles.value &&
|
||||
settings.importExtraFiles.value ?
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>
|
||||
{translate('ImportExtraFiles')}
|
||||
</FormLabel>
|
||||
<FormLabel>{translate('ImportExtraFiles')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
name="extraFileExtensions"
|
||||
helpTexts={[
|
||||
translate('ExtraFileExtensionsHelpTexts1'),
|
||||
translate('ExtraFileExtensionsHelpTexts2')
|
||||
translate('ExtraFileExtensionsHelpText'),
|
||||
translate('ExtraFileExtensionsHelpTextsExamples')
|
||||
]}
|
||||
onChange={onInputChange}
|
||||
{...settings.extraFileExtensions}
|
||||
/>
|
||||
</FormGroup>
|
||||
</FormGroup> : null
|
||||
}
|
||||
</FieldSet>
|
||||
}
|
||||
|
||||
@@ -60,6 +60,7 @@ class Notification extends Component {
|
||||
onReleaseImport,
|
||||
onUpgrade,
|
||||
onRename,
|
||||
onAuthorAdded,
|
||||
onAuthorDelete,
|
||||
onBookDelete,
|
||||
onBookFileDelete,
|
||||
@@ -73,6 +74,7 @@ class Notification extends Component {
|
||||
supportsOnReleaseImport,
|
||||
supportsOnUpgrade,
|
||||
supportsOnRename,
|
||||
supportsOnAuthorAdded,
|
||||
supportsOnAuthorDelete,
|
||||
supportsOnBookDelete,
|
||||
supportsOnBookFileDelete,
|
||||
@@ -136,6 +138,14 @@ class Notification extends Component {
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
supportsOnAuthorAdded && onAuthorAdded ?
|
||||
<Label kind={kinds.SUCCESS}>
|
||||
{translate('OnAuthorAdded')}
|
||||
</Label> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
supportsOnAuthorDelete && onAuthorDelete ?
|
||||
<Label kind={kinds.SUCCESS}>
|
||||
@@ -244,6 +254,7 @@ Notification.propTypes = {
|
||||
onReleaseImport: PropTypes.bool.isRequired,
|
||||
onUpgrade: PropTypes.bool.isRequired,
|
||||
onRename: PropTypes.bool.isRequired,
|
||||
onAuthorAdded: PropTypes.bool.isRequired,
|
||||
onAuthorDelete: PropTypes.bool.isRequired,
|
||||
onBookDelete: PropTypes.bool.isRequired,
|
||||
onBookFileDelete: PropTypes.bool.isRequired,
|
||||
@@ -257,6 +268,7 @@ Notification.propTypes = {
|
||||
supportsOnReleaseImport: PropTypes.bool.isRequired,
|
||||
supportsOnUpgrade: PropTypes.bool.isRequired,
|
||||
supportsOnRename: PropTypes.bool.isRequired,
|
||||
supportsOnAuthorAdded: PropTypes.bool.isRequired,
|
||||
supportsOnAuthorDelete: PropTypes.bool.isRequired,
|
||||
supportsOnBookDelete: PropTypes.bool.isRequired,
|
||||
supportsOnBookFileDelete: PropTypes.bool.isRequired,
|
||||
|
||||
@@ -19,6 +19,7 @@ function NotificationEventItems(props) {
|
||||
onReleaseImport,
|
||||
onUpgrade,
|
||||
onRename,
|
||||
onAuthorAdded,
|
||||
onAuthorDelete,
|
||||
onBookDelete,
|
||||
onBookFileDelete,
|
||||
@@ -32,6 +33,7 @@ function NotificationEventItems(props) {
|
||||
supportsOnReleaseImport,
|
||||
supportsOnUpgrade,
|
||||
supportsOnRename,
|
||||
supportsOnAuthorAdded,
|
||||
supportsOnAuthorDelete,
|
||||
supportsOnBookDelete,
|
||||
supportsOnBookFileDelete,
|
||||
@@ -123,6 +125,17 @@ function NotificationEventItems(props) {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onAuthorAdded"
|
||||
helpText={translate('OnAuthorAddedHelpText')}
|
||||
isDisabled={!supportsOnAuthorAdded.value}
|
||||
{...onAuthorAdded}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
|
||||
@@ -106,6 +106,7 @@ export default {
|
||||
selectedSchema.onReleaseImport = selectedSchema.supportsOnReleaseImport;
|
||||
selectedSchema.onUpgrade = selectedSchema.supportsOnUpgrade;
|
||||
selectedSchema.onRename = selectedSchema.supportsOnRename;
|
||||
selectedSchema.onAuthorAdded = selectedSchema.supportsOnAuthorAdded;
|
||||
selectedSchema.onAuthorDelete = selectedSchema.supportsOnAuthorDelete;
|
||||
selectedSchema.onBookDelete = selectedSchema.supportsOnBookDelete;
|
||||
selectedSchema.onBookFileDelete = selectedSchema.supportsOnBookFileDelete;
|
||||
|
||||
@@ -41,6 +41,14 @@ export const defaultState = {
|
||||
},
|
||||
|
||||
columns: [
|
||||
{
|
||||
name: 'select',
|
||||
columnLabel: 'Select',
|
||||
isSortable: false,
|
||||
isVisible: true,
|
||||
isModifiable: false,
|
||||
isHidden: true
|
||||
},
|
||||
{
|
||||
name: 'path',
|
||||
label: 'Path',
|
||||
|
||||
@@ -158,7 +158,7 @@ export const defaultState = {
|
||||
bookFileCount: function(item) {
|
||||
const { statistics = {} } = item;
|
||||
|
||||
return statistics.bookCount || 0;
|
||||
return statistics.bookFileCount || 0;
|
||||
},
|
||||
|
||||
ratings: function(item) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import { sortDirections } from 'Helpers/Props';
|
||||
import { createThunk, handleThunks } from 'Store/thunks';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
import updateSectionState from 'Utilities/State/updateSectionState';
|
||||
import naturalExpansion from 'Utilities/String/naturalExpansion';
|
||||
import { set, update, updateItem } from './baseActions';
|
||||
import createFetchHandler from './Creators/createFetchHandler';
|
||||
import createHandleActions from './Creators/createHandleActions';
|
||||
@@ -17,6 +18,7 @@ export const section = 'interactiveImport';
|
||||
|
||||
const booksSection = `${section}.books`;
|
||||
const bookFilesSection = `${section}.bookFiles`;
|
||||
let abortCurrentFetchRequest = null;
|
||||
let abortCurrentRequest = null;
|
||||
let currentIds = [];
|
||||
|
||||
@@ -32,15 +34,17 @@ export const defaultState = {
|
||||
error: null,
|
||||
items: [],
|
||||
pendingChanges: {},
|
||||
sortKey: 'quality',
|
||||
sortDirection: sortDirections.DESCENDING,
|
||||
sortKey: 'path',
|
||||
sortDirection: sortDirections.ASCENDING,
|
||||
secondarySortKey: 'path',
|
||||
secondarySortDirection: sortDirections.ASCENDING,
|
||||
recentFolders: [],
|
||||
importMode: 'chooseImportMode',
|
||||
sortPredicates: {
|
||||
path: function(item, direction) {
|
||||
const path = item.path;
|
||||
|
||||
return path.toLowerCase();
|
||||
return naturalExpansion(path.toLowerCase());
|
||||
},
|
||||
|
||||
author: function(item, direction) {
|
||||
@@ -74,6 +78,8 @@ export const defaultState = {
|
||||
};
|
||||
|
||||
export const persistState = [
|
||||
'interactiveImport.sortKey',
|
||||
'interactiveImport.sortDirection',
|
||||
'interactiveImport.recentFolders',
|
||||
'interactiveImport.importMode'
|
||||
];
|
||||
@@ -122,6 +128,11 @@ export const clearInteractiveImportBookFiles = createAction(CLEAR_INTERACTIVE_IM
|
||||
// Action Handlers
|
||||
export const actionHandlers = handleThunks({
|
||||
[FETCH_INTERACTIVE_IMPORT_ITEMS]: function(getState, payload, dispatch) {
|
||||
if (abortCurrentFetchRequest) {
|
||||
abortCurrentFetchRequest();
|
||||
abortCurrentFetchRequest = null;
|
||||
}
|
||||
|
||||
if (!payload.downloadId && !payload.folder) {
|
||||
dispatch(set({ section, error: { message: '`downloadId` or `folder` is required.' } }));
|
||||
return;
|
||||
@@ -129,12 +140,14 @@ export const actionHandlers = handleThunks({
|
||||
|
||||
dispatch(set({ section, isFetching: true }));
|
||||
|
||||
const promise = createAjaxRequest({
|
||||
const { request, abortRequest } = createAjaxRequest({
|
||||
url: '/manualimport',
|
||||
data: payload
|
||||
}).request;
|
||||
});
|
||||
|
||||
promise.done((data) => {
|
||||
abortCurrentFetchRequest = abortRequest;
|
||||
|
||||
request.done((data) => {
|
||||
dispatch(batchActions([
|
||||
update({ section, data }),
|
||||
|
||||
@@ -147,7 +160,11 @@ export const actionHandlers = handleThunks({
|
||||
]));
|
||||
});
|
||||
|
||||
promise.fail((xhr) => {
|
||||
request.fail((xhr) => {
|
||||
if (xhr.aborted) {
|
||||
return;
|
||||
}
|
||||
|
||||
dispatch(set({
|
||||
section,
|
||||
isFetching: false,
|
||||
|
||||
@@ -71,6 +71,7 @@ function getInternalLink(source) {
|
||||
function getTestLink(source, props) {
|
||||
switch (source) {
|
||||
case 'IndexerStatusCheck':
|
||||
case 'IndexerLongTermStatusCheck':
|
||||
return (
|
||||
<SpinnerIconButton
|
||||
name={icons.TEST}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
@@ -9,8 +10,12 @@ import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
|
||||
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
||||
import VirtualTable from 'Components/Table/VirtualTable';
|
||||
import VirtualTableRow from 'Components/Table/VirtualTableRow';
|
||||
import { align, icons, sortDirections } from 'Helpers/Props';
|
||||
import { align, icons, kinds, sortDirections } from 'Helpers/Props';
|
||||
import hasDifferentItemsOrOrder from 'Utilities/Object/hasDifferentItemsOrOrder';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import getSelectedIds from 'Utilities/Table/getSelectedIds';
|
||||
import selectAll from 'Utilities/Table/selectAll';
|
||||
import toggleSelected from 'Utilities/Table/toggleSelected';
|
||||
import UnmappedFilesTableHeader from './UnmappedFilesTableHeader';
|
||||
import UnmappedFilesTableRow from './UnmappedFilesTableRow';
|
||||
|
||||
@@ -23,10 +28,43 @@ class UnmappedFilesTable extends Component {
|
||||
super(props, context);
|
||||
|
||||
this.state = {
|
||||
scroller: null
|
||||
scroller: null,
|
||||
allSelected: false,
|
||||
allUnselected: false,
|
||||
lastToggled: null,
|
||||
selectedState: {}
|
||||
};
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.setSelectedState();
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
const {
|
||||
items,
|
||||
sortKey,
|
||||
sortDirection,
|
||||
isDeleting,
|
||||
deleteError
|
||||
} = this.props;
|
||||
|
||||
if (sortKey !== prevProps.sortKey ||
|
||||
sortDirection !== prevProps.sortDirection ||
|
||||
hasDifferentItemsOrOrder(prevProps.items, items)
|
||||
) {
|
||||
this.setSelectedState();
|
||||
}
|
||||
|
||||
const hasFinishedDeleting = prevProps.isDeleting &&
|
||||
!isDeleting &&
|
||||
!deleteError;
|
||||
|
||||
if (hasFinishedDeleting) {
|
||||
this.onSelectAllChange({ value: false });
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Control
|
||||
|
||||
@@ -34,6 +72,68 @@ class UnmappedFilesTable extends Component {
|
||||
this.setState({ scroller: ref });
|
||||
};
|
||||
|
||||
getSelectedIds = () => {
|
||||
if (this.state.allUnselected) {
|
||||
return [];
|
||||
}
|
||||
return getSelectedIds(this.state.selectedState);
|
||||
};
|
||||
|
||||
setSelectedState() {
|
||||
const {
|
||||
items
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
selectedState
|
||||
} = this.state;
|
||||
|
||||
const newSelectedState = {};
|
||||
|
||||
items.forEach((file) => {
|
||||
const isItemSelected = selectedState[file.id];
|
||||
|
||||
if (isItemSelected) {
|
||||
newSelectedState[file.id] = isItemSelected;
|
||||
} else {
|
||||
newSelectedState[file.id] = false;
|
||||
}
|
||||
});
|
||||
|
||||
const selectedCount = getSelectedIds(newSelectedState).length;
|
||||
const newStateCount = Object.keys(newSelectedState).length;
|
||||
let isAllSelected = false;
|
||||
let isAllUnselected = false;
|
||||
|
||||
if (selectedCount === 0) {
|
||||
isAllUnselected = true;
|
||||
} else if (selectedCount === newStateCount) {
|
||||
isAllSelected = true;
|
||||
}
|
||||
|
||||
this.setState({ selectedState: newSelectedState, allSelected: isAllSelected, allUnselected: isAllUnselected });
|
||||
}
|
||||
|
||||
onSelectAllChange = ({ value }) => {
|
||||
this.setState(selectAll(this.state.selectedState, value));
|
||||
};
|
||||
|
||||
onSelectAllPress = () => {
|
||||
this.onSelectAllChange({ value: !this.state.allSelected });
|
||||
};
|
||||
|
||||
onSelectedChange = ({ id, value, shiftKey = false }) => {
|
||||
this.setState((state) => {
|
||||
return toggleSelected(state, this.props.items, id, value, shiftKey);
|
||||
});
|
||||
};
|
||||
|
||||
onDeleteUnmappedFilesPress = () => {
|
||||
const selectedIds = this.getSelectedIds();
|
||||
|
||||
this.props.deleteUnmappedFiles(selectedIds);
|
||||
};
|
||||
|
||||
rowRenderer = ({ key, rowIndex, style }) => {
|
||||
const {
|
||||
items,
|
||||
@@ -41,6 +141,10 @@ class UnmappedFilesTable extends Component {
|
||||
deleteUnmappedFile
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
selectedState
|
||||
} = this.state;
|
||||
|
||||
const item = items[rowIndex];
|
||||
|
||||
return (
|
||||
@@ -51,6 +155,8 @@ class UnmappedFilesTable extends Component {
|
||||
<UnmappedFilesTableRow
|
||||
key={item.id}
|
||||
columns={columns}
|
||||
isSelected={selectedState[item.id]}
|
||||
onSelectedChange={this.onSelectedChange}
|
||||
deleteUnmappedFile={deleteUnmappedFile}
|
||||
{...item}
|
||||
/>
|
||||
@@ -63,6 +169,7 @@ class UnmappedFilesTable extends Component {
|
||||
const {
|
||||
isFetching,
|
||||
isPopulated,
|
||||
isDeleting,
|
||||
error,
|
||||
items,
|
||||
columns,
|
||||
@@ -72,13 +179,19 @@ class UnmappedFilesTable extends Component {
|
||||
onSortPress,
|
||||
isScanningFolders,
|
||||
onAddMissingAuthorsPress,
|
||||
deleteUnmappedFiles,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
scroller
|
||||
scroller,
|
||||
allSelected,
|
||||
allUnselected,
|
||||
selectedState
|
||||
} = this.state;
|
||||
|
||||
const selectedTrackFileIds = this.getSelectedIds();
|
||||
|
||||
return (
|
||||
<PageContent title={translate('UnmappedFiles')}>
|
||||
<PageToolbar>
|
||||
@@ -90,6 +203,13 @@ class UnmappedFilesTable extends Component {
|
||||
isSpinning={isScanningFolders}
|
||||
onPress={onAddMissingAuthorsPress}
|
||||
/>
|
||||
<PageToolbarButton
|
||||
label={translate('DeleteSelected')}
|
||||
iconName={icons.DELETE}
|
||||
isDisabled={selectedTrackFileIds.length === 0}
|
||||
isSpinning={isDeleting}
|
||||
onPress={this.onDeleteUnmappedFilesPress}
|
||||
/>
|
||||
</PageToolbarSection>
|
||||
|
||||
<PageToolbarSection alignContent={align.RIGHT}>
|
||||
@@ -117,9 +237,9 @@ class UnmappedFilesTable extends Component {
|
||||
|
||||
{
|
||||
isPopulated && !error && !items.length &&
|
||||
<div>
|
||||
<Alert kind={kinds.INFO}>
|
||||
Success! My work is done, all files on disk are matched to known books.
|
||||
</div>
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
@@ -138,8 +258,12 @@ class UnmappedFilesTable extends Component {
|
||||
sortDirection={sortDirection}
|
||||
onTableOptionChange={onTableOptionChange}
|
||||
onSortPress={onSortPress}
|
||||
allSelected={allSelected}
|
||||
allUnselected={allUnselected}
|
||||
onSelectAllChange={this.onSelectAllChange}
|
||||
/>
|
||||
}
|
||||
selectedState={selectedState}
|
||||
sortKey={sortKey}
|
||||
sortDirection={sortDirection}
|
||||
/>
|
||||
@@ -153,6 +277,8 @@ class UnmappedFilesTable extends Component {
|
||||
UnmappedFilesTable.propTypes = {
|
||||
isFetching: PropTypes.bool.isRequired,
|
||||
isPopulated: PropTypes.bool.isRequired,
|
||||
isDeleting: PropTypes.bool.isRequired,
|
||||
deleteError: PropTypes.object,
|
||||
error: PropTypes.object,
|
||||
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
@@ -161,6 +287,7 @@ UnmappedFilesTable.propTypes = {
|
||||
onTableOptionChange: PropTypes.func.isRequired,
|
||||
onSortPress: PropTypes.func.isRequired,
|
||||
deleteUnmappedFile: PropTypes.func.isRequired,
|
||||
deleteUnmappedFiles: PropTypes.func.isRequired,
|
||||
isScanningFolders: PropTypes.bool.isRequired,
|
||||
onAddMissingAuthorsPress: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
@@ -5,7 +5,7 @@ import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import * as commandNames from 'Commands/commandNames';
|
||||
import withCurrentPage from 'Components/withCurrentPage';
|
||||
import { deleteBookFile, fetchBookFiles, setBookFilesSort, setBookFilesTableOption } from 'Store/Actions/bookFileActions';
|
||||
import { deleteBookFile, deleteBookFiles, fetchBookFiles, setBookFilesSort, setBookFilesTableOption } from 'Store/Actions/bookFileActions';
|
||||
import { executeCommand } from 'Store/Actions/commandActions';
|
||||
import createClientSideCollectionSelector from 'Store/Selectors/createClientSideCollectionSelector';
|
||||
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
|
||||
@@ -28,7 +28,9 @@ function createMapStateToProps() {
|
||||
items,
|
||||
...otherProps
|
||||
} = bookFiles;
|
||||
|
||||
const unmappedFiles = _.filter(items, { bookId: 0 });
|
||||
|
||||
return {
|
||||
items: unmappedFiles,
|
||||
...otherProps,
|
||||
@@ -57,6 +59,10 @@ function createMapDispatchToProps(dispatch, props) {
|
||||
dispatch(deleteBookFile({ id }));
|
||||
},
|
||||
|
||||
deleteUnmappedFiles(bookFileIds) {
|
||||
dispatch(deleteBookFiles({ bookFileIds }));
|
||||
},
|
||||
|
||||
onAddMissingAuthorsPress() {
|
||||
dispatch(executeCommand({
|
||||
name: commandNames.RESCAN_FOLDERS,
|
||||
@@ -106,7 +112,8 @@ UnmappedFilesTableConnector.propTypes = {
|
||||
onSortPress: PropTypes.func.isRequired,
|
||||
onTableOptionChange: PropTypes.func.isRequired,
|
||||
fetchUnmappedFiles: PropTypes.func.isRequired,
|
||||
deleteUnmappedFile: PropTypes.func.isRequired
|
||||
deleteUnmappedFile: PropTypes.func.isRequired,
|
||||
deleteUnmappedFiles: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default withCurrentPage(
|
||||
|
||||
@@ -4,6 +4,7 @@ import IconButton from 'Components/Link/IconButton';
|
||||
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
|
||||
import VirtualTableHeader from 'Components/Table/VirtualTableHeader';
|
||||
import VirtualTableHeaderCell from 'Components/Table/VirtualTableHeaderCell';
|
||||
import VirtualTableSelectAllHeaderCell from 'Components/Table/VirtualTableSelectAllHeaderCell';
|
||||
import { icons } from 'Helpers/Props';
|
||||
// import hasGrowableColumns from './hasGrowableColumns';
|
||||
import styles from './UnmappedFilesTableHeader.css';
|
||||
@@ -12,6 +13,9 @@ function UnmappedFilesTableHeader(props) {
|
||||
const {
|
||||
columns,
|
||||
onTableOptionChange,
|
||||
allSelected,
|
||||
allUnselected,
|
||||
onSelectAllChange,
|
||||
...otherProps
|
||||
} = props;
|
||||
|
||||
@@ -30,6 +34,17 @@ function UnmappedFilesTableHeader(props) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (name === 'select') {
|
||||
return (
|
||||
<VirtualTableSelectAllHeaderCell
|
||||
key={name}
|
||||
allSelected={allSelected}
|
||||
allUnselected={allUnselected}
|
||||
onSelectAllChange={onSelectAllChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
if (name === 'actions') {
|
||||
return (
|
||||
<VirtualTableHeaderCell
|
||||
@@ -71,6 +86,9 @@ function UnmappedFilesTableHeader(props) {
|
||||
|
||||
UnmappedFilesTableHeader.propTypes = {
|
||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
allSelected: PropTypes.bool.isRequired,
|
||||
allUnselected: PropTypes.bool.isRequired,
|
||||
onSelectAllChange: PropTypes.func.isRequired,
|
||||
onTableOptionChange: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -20,3 +20,9 @@
|
||||
|
||||
flex: 0 0 100px;
|
||||
}
|
||||
|
||||
.checkInput {
|
||||
composes: input from '~Components/Form/CheckInput.css';
|
||||
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'actions': string;
|
||||
'checkInput': string;
|
||||
'dateAdded': string;
|
||||
'path': string;
|
||||
'quality': string;
|
||||
|
||||
@@ -6,6 +6,7 @@ import IconButton from 'Components/Link/IconButton';
|
||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
|
||||
import VirtualTableRowCell from 'Components/Table/Cells/VirtualTableRowCell';
|
||||
import VirtualTableSelectCell from 'Components/Table/Cells/VirtualTableSelectCell';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import InteractiveImportModal from 'InteractiveImport/InteractiveImportModal';
|
||||
import formatBytes from 'Utilities/Number/formatBytes';
|
||||
@@ -69,7 +70,9 @@ class UnmappedFilesTableRow extends Component {
|
||||
size,
|
||||
dateAdded,
|
||||
quality,
|
||||
columns
|
||||
columns,
|
||||
isSelected,
|
||||
onSelectedChange
|
||||
} = this.props;
|
||||
|
||||
const folder = path.substring(0, Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')));
|
||||
@@ -93,6 +96,19 @@ class UnmappedFilesTableRow extends Component {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (name === 'select') {
|
||||
return (
|
||||
<VirtualTableSelectCell
|
||||
inputClassName={styles.checkInput}
|
||||
id={id}
|
||||
key={name}
|
||||
isSelected={isSelected}
|
||||
isDisabled={false}
|
||||
onSelectedChange={onSelectedChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
if (name === 'path') {
|
||||
return (
|
||||
<VirtualTableRowCell
|
||||
@@ -208,6 +224,8 @@ UnmappedFilesTableRow.propTypes = {
|
||||
quality: PropTypes.object.isRequired,
|
||||
dateAdded: PropTypes.string.isRequired,
|
||||
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
isSelected: PropTypes.bool,
|
||||
onSelectedChange: PropTypes.func.isRequired,
|
||||
deleteUnmappedFile: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
11
frontend/src/Utilities/String/naturalExpansion.js
Normal file
11
frontend/src/Utilities/String/naturalExpansion.js
Normal file
@@ -0,0 +1,11 @@
|
||||
const regex = /\d+/g;
|
||||
|
||||
function naturalExpansion(input) {
|
||||
if (!input) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return input.replace(regex, (n) => n.padStart(8, '0'));
|
||||
}
|
||||
|
||||
export default naturalExpansion;
|
||||
@@ -1,9 +1,11 @@
|
||||
const regex = /\b\w+/g;
|
||||
|
||||
function titleCase(input) {
|
||||
if (!input) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return input.replace(/\b\w+/g, (match) => {
|
||||
return input.replace(regex, (match) => {
|
||||
return match.charAt(0).toUpperCase() + match.substr(1).toLowerCase();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ export async function fetchTranslations(): Promise<boolean> {
|
||||
|
||||
export default function translate(
|
||||
key: string,
|
||||
tokens?: Record<string, string | number | boolean>
|
||||
tokens: Record<string, string | number | boolean> = { appName: 'Readarr' }
|
||||
) {
|
||||
const translation = translations[key] || key;
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ class CutoffUnmetConnector extends Component {
|
||||
gotoCutoffUnmetFirstPage
|
||||
} = this.props;
|
||||
|
||||
registerPagePopulator(this.repopulate, ['bookFileUpdated']);
|
||||
registerPagePopulator(this.repopulate, ['bookFileUpdated', 'bookFileDeleted']);
|
||||
|
||||
if (useCurrentPage) {
|
||||
fetchCutoffUnmet();
|
||||
|
||||
@@ -50,7 +50,7 @@ class MissingConnector extends Component {
|
||||
gotoMissingFirstPage
|
||||
} = this.props;
|
||||
|
||||
registerPagePopulator(this.repopulate, ['bookFileUpdated']);
|
||||
registerPagePopulator(this.repopulate, ['bookFileUpdated', 'bookFileDeleted']);
|
||||
|
||||
if (useCurrentPage) {
|
||||
fetchMissing();
|
||||
|
||||
@@ -4,6 +4,8 @@ import { render } from 'react-dom';
|
||||
import createAppStore from 'Store/createAppStore';
|
||||
import App from './App/App';
|
||||
|
||||
import 'Diag/ConsoleApi';
|
||||
|
||||
export async function bootstrap() {
|
||||
const history = createBrowserHistory();
|
||||
const store = createAppStore(history);
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"@fortawesome/free-regular-svg-icons": "6.4.0",
|
||||
"@fortawesome/free-solid-svg-icons": "6.4.0",
|
||||
"@fortawesome/react-fontawesome": "0.2.0",
|
||||
"@microsoft/signalr": "6.0.21",
|
||||
"@microsoft/signalr": "6.0.25",
|
||||
"@sentry/browser": "7.51.2",
|
||||
"@sentry/integrations": "7.51.2",
|
||||
"@types/node": "18.16.16",
|
||||
@@ -95,6 +95,7 @@
|
||||
"@babel/preset-react": "7.22.5",
|
||||
"@babel/preset-typescript": "7.22.11",
|
||||
"@types/lodash": "4.14.197",
|
||||
"@types/react-lazyload": "3.2.1",
|
||||
"@types/redux-actions": "2.6.2",
|
||||
"@typescript-eslint/eslint-plugin": "6.5.0",
|
||||
"@typescript-eslint/parser": "6.5.0",
|
||||
@@ -120,7 +121,7 @@
|
||||
"html-webpack-plugin": "5.5.3",
|
||||
"loader-utils": "^3.2.1",
|
||||
"mini-css-extract-plugin": "2.7.6",
|
||||
"postcss": "8.4.23",
|
||||
"postcss": "8.4.31",
|
||||
"postcss-color-function": "4.1.0",
|
||||
"postcss-loader": "7.3.0",
|
||||
"postcss-mixins": "9.0.4",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<PackageVersion Include="AutoFixture" Version="4.17.0" />
|
||||
<PackageVersion Include="coverlet.collector" Version="3.0.4-preview.27.ge7cb7c3b40" PrivateAssets="all" />
|
||||
<PackageVersion Include="Dapper" Version="2.0.123" />
|
||||
<PackageVersion Include="DryIoc.dll" Version="5.4.1" />
|
||||
<PackageVersion Include="DryIoc.dll" Version="5.4.3" />
|
||||
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
|
||||
<PackageVersion Include="Equ" Version="2.3.0" />
|
||||
<PackageVersion Include="FluentAssertions" Version="5.10.3" />
|
||||
@@ -16,11 +16,11 @@
|
||||
<PackageVersion Include="ImpromptuInterface" Version="7.0.1" />
|
||||
<PackageVersion Include="LazyCache" Version="2.4.0" />
|
||||
<PackageVersion Include="Mailkit" Version="3.6.0" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.21" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.25" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
||||
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
||||
@@ -32,7 +32,7 @@
|
||||
<PackageVersion Include="NLog.Extensions.Logging" Version="5.2.3" />
|
||||
<PackageVersion Include="NLog" Version="5.1.4" />
|
||||
<PackageVersion Include="NLog.Targets.Syslog" Version="7.0.0" />
|
||||
<PackageVersion Include="Npgsql" Version="7.0.4" />
|
||||
<PackageVersion Include="Npgsql" Version="7.0.6" />
|
||||
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageVersion Include="NUnit" Version="3.13.3" />
|
||||
<PackageVersion Include="NunitXml.TestLogger" Version="3.0.117" />
|
||||
@@ -59,7 +59,7 @@
|
||||
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
|
||||
<PackageVersion Include="System.ServiceProcess.ServiceController" Version="6.0.1" />
|
||||
<PackageVersion Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
||||
<PackageVersion Include="System.Text.Json" Version="6.0.8" />
|
||||
<PackageVersion Include="System.Text.Json" Version="6.0.9" />
|
||||
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
|
||||
<PackageVersion Include="TagLibSharp-Lidarr" Version="2.2.0.19" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -70,15 +70,15 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
||||
[TestCase(@"[Info] MigrationController: *** Migrating Database=readarr-main;Host=postgres14;Username=mySecret;Password=mySecret;Port=5432;token=mySecret;Enlist=False&username=mySecret;mypassword=mySecret;mypass=shouldkeep1;test_token=mySecret;password=123%@%_@!#^#@;use_password=mySecret;get_token=shouldkeep2;usetoken=shouldkeep3;passwrd=mySecret;")]
|
||||
|
||||
// Announce URLs (passkeys) Magnet & Tracker
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2f9pr04sg601233210imaveql2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2ftracker.php%2f9pr04sg601233210imaveql2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce%2f9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce.php%3fpasskey%3d9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/9pr04sg601233210imaveql2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/tracker.php/9pr04sg601233210imaveql2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce/9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce.php?passkey=9pr04sg601233210imaveql2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""http://xxx.yyy/announce.php?passkey=9pr04sg601233210imaveql2tyu8xyui"",""info"":""http://xxx.yyy/info?a=b""")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2f9pr04sg601233210IMAveQL2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2ftracker.php%2f9pr04sg601233210IMAveQL2tyu8xyui%2fannounce""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce%2f9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"magnet_uri"":""magnet:?xt=urn:btih:9pr04sgkillroyimaveql2tyu8xyui&dn=&tr=https%3a%2f%2fxxx.yyy%2fannounce.php%3fpasskey%3d9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/9pr04sg601233210IMAveQL2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/tracker.php/9pr04sg601233210IMAveQL2tyu8xyui/announce""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce/9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""https://xxx.yyy/announce.php?passkey=9pr04sg601233210IMAveQL2tyu8xyui""}")]
|
||||
[TestCase(@"tracker"":""http://xxx.yyy/announce.php?passkey=9pr04sg601233210IMAveQL2tyu8xyui"",""info"":""http://xxx.yyy/info?a=b""")]
|
||||
|
||||
// Notifiarr
|
||||
[TestCase(@"https://xxx.yyy/api/v1/notification/readarr/9pr04sg6-0123-3210-imav-eql2tyu8xyui")]
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
new (@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
// Trackers Announce Keys; Designed for Qbit Json; should work for all in theory
|
||||
new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce"),
|
||||
new (@"announce(\.php)?(/|%2f|%3fpasskey%3d)(?<secret>[a-z0-9]{16,})|(?<secret>[a-z0-9]{16,})(/|%2f)announce", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
// Path
|
||||
new (@"C:\\Users\\(?<secret>[^\""]+?)(\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
@@ -5,6 +5,7 @@ using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Books;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.CustomFormats;
|
||||
using NzbDrone.Core.DecisionEngine.Specifications;
|
||||
using NzbDrone.Core.Download.TrackedDownloads;
|
||||
@@ -369,5 +370,31 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
|
||||
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_return_false_if_same_quality_non_proper_in_queue_and_download_propers_is_do_not_upgrade()
|
||||
{
|
||||
_remoteBook.ParsedBookInfo.Quality = new QualityModel(Quality.FLAC, new Revision(2));
|
||||
_author.QualityProfile.Value.Cutoff = _remoteBook.ParsedBookInfo.Quality.Quality.Id;
|
||||
|
||||
Mocker.GetMock<IConfigService>()
|
||||
.Setup(s => s.DownloadPropersAndRepacks)
|
||||
.Returns(ProperDownloadTypes.DoNotUpgrade);
|
||||
|
||||
var remoteBook = Builder<RemoteBook>.CreateNew()
|
||||
.With(r => r.Author = _author)
|
||||
.With(r => r.Books = new List<Book> { _book })
|
||||
.With(r => r.ParsedBookInfo = new ParsedBookInfo
|
||||
{
|
||||
Quality = new QualityModel(Quality.FLAC)
|
||||
})
|
||||
.With(r => r.Release = _releaseInfo)
|
||||
.With(r => r.CustomFormats = new List<CustomFormat>())
|
||||
.Build();
|
||||
|
||||
GivenQueue(new List<RemoteBook> { remoteBook });
|
||||
|
||||
Subject.IsSatisfiedBy(_remoteBook, null).Accepted.Should().BeFalse();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -405,7 +405,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
Size = 1000,
|
||||
Progress = 0.7,
|
||||
Eta = 8640000,
|
||||
State = "stalledDL",
|
||||
State = "pausedUP",
|
||||
Label = "",
|
||||
SavePath = @"C:\Torrents".AsOsAgnostic(),
|
||||
ContentPath = @"C:\Torrents\Droned.S01.12".AsOsAgnostic()
|
||||
|
||||
@@ -452,6 +452,30 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.SabnzbdTests
|
||||
result.OutputRootFolders.First().Should().Be(fullCategoryDir);
|
||||
}
|
||||
|
||||
[TestCase("0")]
|
||||
[TestCase("15d")]
|
||||
public void should_set_history_removes_completed_downloads_false(string historyRetention)
|
||||
{
|
||||
_config.Misc.history_retention = historyRetention;
|
||||
|
||||
var downloadClientInfo = Subject.GetStatus();
|
||||
|
||||
downloadClientInfo.RemovesCompletedDownloads.Should().BeFalse();
|
||||
}
|
||||
|
||||
[TestCase("-1")]
|
||||
[TestCase("15")]
|
||||
[TestCase("3")]
|
||||
[TestCase("3d")]
|
||||
public void should_set_history_removes_completed_downloads_true(string historyRetention)
|
||||
{
|
||||
_config.Misc.history_retention = historyRetention;
|
||||
|
||||
var downloadClientInfo = Subject.GetStatus();
|
||||
|
||||
downloadClientInfo.RemovesCompletedDownloads.Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase(@"Y:\nzbget\root", @"completed\downloads", @"vv", @"Y:\nzbget\root\completed\downloads", @"Y:\nzbget\root\completed\downloads\vv")]
|
||||
[TestCase(@"Y:\nzbget\root", @"completed", @"vv", @"Y:\nzbget\root\completed", @"Y:\nzbget\root\completed\vv")]
|
||||
[TestCase(@"/nzbget/root", @"completed/downloads", @"vv", @"/nzbget/root/completed/downloads", @"/nzbget/root/completed/downloads/vv")]
|
||||
|
||||
@@ -27,6 +27,8 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
|
||||
_importListReports = new List<ImportListItemInfo> { importListItem1 };
|
||||
|
||||
var mockImportList = new Mock<IImportList>();
|
||||
|
||||
Mocker.GetMock<IFetchAndParseImportList>()
|
||||
.Setup(v => v.Fetch())
|
||||
.Returns(_importListReports);
|
||||
@@ -53,6 +55,10 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
.Setup(v => v.Get(It.IsAny<int>()))
|
||||
.Returns(new ImportListDefinition { ShouldMonitor = ImportListMonitorType.SpecificBook });
|
||||
|
||||
Mocker.GetMock<IImportListFactory>()
|
||||
.Setup(v => v.AutomaticAddEnabled(It.IsAny<bool>()))
|
||||
.Returns(new List<IImportList> { mockImportList.Object });
|
||||
|
||||
Mocker.GetMock<IFetchAndParseImportList>()
|
||||
.Setup(v => v.Fetch())
|
||||
.Returns(_importListReports);
|
||||
@@ -322,5 +328,31 @@ namespace NzbDrone.Core.Test.ImportListTests
|
||||
t.First().AddOptions.BooksToMonitor.Count == expectedBooksMonitored &&
|
||||
t.First().Monitored == expectedAuthorMonitored), false));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_fetch_if_no_lists_are_enabled()
|
||||
{
|
||||
Mocker.GetMock<IImportListFactory>()
|
||||
.Setup(v => v.AutomaticAddEnabled(It.IsAny<bool>()))
|
||||
.Returns(new List<IImportList>());
|
||||
|
||||
Subject.Execute(new ImportListSyncCommand());
|
||||
|
||||
Mocker.GetMock<IFetchAndParseImportList>()
|
||||
.Verify(v => v.Fetch(), Times.Never);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_process_if_no_items_are_returned()
|
||||
{
|
||||
Mocker.GetMock<IFetchAndParseImportList>()
|
||||
.Setup(v => v.Fetch())
|
||||
.Returns(new List<ImportListItemInfo>());
|
||||
|
||||
Subject.Execute(new ImportListSyncCommand());
|
||||
|
||||
Mocker.GetMock<IImportListExclusionService>()
|
||||
.Verify(v => v.All(), Times.Never);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,5 +68,16 @@ namespace NzbDrone.Core.Test.IndexerTests
|
||||
|
||||
VerifyNoUpdate();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_record_failure_for_unknown_provider()
|
||||
{
|
||||
Subject.RecordFailure(0);
|
||||
|
||||
Mocker.GetMock<IIndexerStatusRepository>()
|
||||
.Verify(v => v.FindByProviderId(1), Times.Never);
|
||||
|
||||
VerifyNoUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,12 +5,15 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using FizzWare.NBuilder;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Books;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.MediaFiles.Events;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
using NzbDrone.Test.Common;
|
||||
using NzbDrone.Test.Common.AutoMoq;
|
||||
@@ -166,7 +169,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
||||
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||
public void should_read_duration(string filename, string[] ignored)
|
||||
{
|
||||
var path = Path.Combine(_testdir, filename);
|
||||
@@ -177,7 +180,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
||||
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||
public void should_read_write_tags(string filename, string[] skipProperties)
|
||||
{
|
||||
GivenFileCopy(filename);
|
||||
@@ -198,7 +201,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
||||
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||
public void should_read_audiotag_from_file_with_no_tags(string filename, string[] skipProperties)
|
||||
{
|
||||
GivenFileCopy(filename);
|
||||
@@ -220,7 +223,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
||||
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||
public void should_read_parsedtrackinfo_from_file_with_no_tags(string filename, string[] skipProperties)
|
||||
{
|
||||
GivenFileCopy(filename);
|
||||
@@ -235,7 +238,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
||||
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||
public void should_set_quality_and_mediainfo_for_corrupt_file(string filename, string[] skipProperties)
|
||||
{
|
||||
// use missing to simulate corrupt
|
||||
@@ -250,7 +253,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
||||
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||
public void should_read_file_with_only_title_tag(string filename, string[] ignored)
|
||||
{
|
||||
GivenFileCopy(filename);
|
||||
@@ -270,7 +273,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
|
||||
[TestCaseSource(typeof(TestCaseFactory), nameof(TestCaseFactory.TestCases))]
|
||||
public void should_remove_date_from_tags_when_not_in_metadata(string filename, string[] ignored)
|
||||
{
|
||||
GivenFileCopy(filename);
|
||||
@@ -365,6 +368,29 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
|
||||
var fileInfo = _diskProvider.GetFileInfo(file.Path);
|
||||
file.Modified.Should().Be(fileInfo.LastWriteTimeUtc);
|
||||
file.Size.Should().Be(fileInfo.Length);
|
||||
|
||||
Mocker.GetMock<IEventAggregator>()
|
||||
.Verify(v => v.PublishEvent(It.IsAny<BookFileRetaggedEvent>()), Times.Once());
|
||||
}
|
||||
|
||||
[TestCase("nin.mp3")]
|
||||
public void write_tags_should_not_update_tags_if_already_updated(string filename)
|
||||
{
|
||||
Mocker.GetMock<IConfigService>()
|
||||
.Setup(x => x.ScrubAudioTags)
|
||||
.Returns(true);
|
||||
|
||||
GivenFileCopy(filename);
|
||||
|
||||
var file = GivenPopulatedTrackfile(0);
|
||||
|
||||
file.Path = _copiedFile;
|
||||
Subject.WriteTags(file, false, true);
|
||||
Subject.WriteTags(file, false, true);
|
||||
Subject.WriteTags(file, false, true);
|
||||
|
||||
Mocker.GetMock<IEventAggregator>()
|
||||
.Verify(v => v.PublishEvent(It.IsAny<BookFileRetaggedEvent>()), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -13,6 +13,7 @@ using NzbDrone.Core.Test.Framework;
|
||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2023-12-31 00:00:00Z")]
|
||||
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
|
||||
{
|
||||
private MetadataProfile _metadataProfile;
|
||||
|
||||
@@ -15,6 +15,7 @@ using NzbDrone.Test.Common;
|
||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2023-12-31 00:00:00Z")]
|
||||
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
|
||||
{
|
||||
[SetUp]
|
||||
|
||||
@@ -64,6 +64,11 @@ namespace NzbDrone.Core.Test.NotificationTests
|
||||
TestLogger.Info("OnRename was called");
|
||||
}
|
||||
|
||||
public override void OnAuthorAdded(Author author)
|
||||
{
|
||||
TestLogger.Info("OnAuthorAdded was called");
|
||||
}
|
||||
|
||||
public override void OnAuthorDelete(AuthorDeleteMessage message)
|
||||
{
|
||||
TestLogger.Info("OnAuthorDelete was called");
|
||||
@@ -138,6 +143,7 @@ namespace NzbDrone.Core.Test.NotificationTests
|
||||
notification.SupportsOnUpgrade.Should().BeTrue();
|
||||
notification.SupportsOnRename.Should().BeTrue();
|
||||
notification.SupportsOnHealthIssue.Should().BeTrue();
|
||||
notification.SupportsOnAuthorAdded.Should().BeTrue();
|
||||
notification.SupportsOnAuthorDelete.Should().BeTrue();
|
||||
notification.SupportsOnBookDelete.Should().BeTrue();
|
||||
notification.SupportsOnBookFileDelete.Should().BeTrue();
|
||||
@@ -157,6 +163,7 @@ namespace NzbDrone.Core.Test.NotificationTests
|
||||
notification.SupportsOnReleaseImport.Should().BeFalse();
|
||||
notification.SupportsOnUpgrade.Should().BeFalse();
|
||||
notification.SupportsOnRename.Should().BeFalse();
|
||||
notification.SupportsOnAuthorAdded.Should().BeFalse();
|
||||
notification.SupportsOnAuthorDelete.Should().BeFalse();
|
||||
notification.SupportsOnBookDelete.Should().BeFalse();
|
||||
notification.SupportsOnBookFileDelete.Should().BeFalse();
|
||||
|
||||
@@ -35,16 +35,13 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
[TestCase("or")]
|
||||
[TestCase("an")]
|
||||
[TestCase("of")]
|
||||
public void should_remove_common_words(string word)
|
||||
public void should_remove_common_words_from_middle_of_title(string word)
|
||||
{
|
||||
var dirtyFormat = new[]
|
||||
{
|
||||
"word.{0}.word",
|
||||
"word {0} word",
|
||||
"word-{0}-word",
|
||||
"word.word.{0}",
|
||||
"word-word-{0}",
|
||||
"word-word {0}",
|
||||
"word-{0}-word"
|
||||
};
|
||||
|
||||
foreach (var s in dirtyFormat)
|
||||
@@ -54,6 +51,27 @@ namespace NzbDrone.Core.Test.ParserTests
|
||||
}
|
||||
}
|
||||
|
||||
[TestCase("the")]
|
||||
[TestCase("and")]
|
||||
[TestCase("or")]
|
||||
[TestCase("an")]
|
||||
[TestCase("of")]
|
||||
public void should_not_remove_common_words_from_end_of_title(string word)
|
||||
{
|
||||
var dirtyFormat = new[]
|
||||
{
|
||||
"word.word.{0}",
|
||||
"word-word-{0}",
|
||||
"word-word {0}"
|
||||
};
|
||||
|
||||
foreach (var s in dirtyFormat)
|
||||
{
|
||||
var dirty = string.Format(s, word);
|
||||
dirty.CleanAuthorName().Should().Be("wordword" + word.ToLower());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_remove_a_from_middle_of_title()
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@ using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using FluentValidation;
|
||||
using FluentValidation.Results;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.Disk;
|
||||
@@ -218,11 +219,11 @@ namespace NzbDrone.Core.Books.Calibre
|
||||
double? seriesIndex = null;
|
||||
if (double.TryParse(serieslink?.Position, out var index))
|
||||
{
|
||||
_logger.Trace($"Parsed {serieslink?.Position} as {index}");
|
||||
_logger.Trace("Parsed '{0}' as '{1}'", serieslink.Position, index);
|
||||
seriesIndex = index;
|
||||
}
|
||||
|
||||
_logger.Trace($"Book: {book} Series: {series?.Title}, Position: {seriesIndex}");
|
||||
_logger.Trace("Book: {0} Series: {1}, Position: {2}", book, series?.Title, seriesIndex);
|
||||
|
||||
var cover = edition.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Cover);
|
||||
string image = null;
|
||||
@@ -275,7 +276,9 @@ namespace NzbDrone.Core.Books.Calibre
|
||||
|
||||
var updatedPath = GetOriginalFormat(updated.Formats);
|
||||
|
||||
if (updatedPath != file.Path)
|
||||
_logger.Trace("File path from Calibre: '{0}'", updatedPath);
|
||||
|
||||
if (updatedPath.IsNotNullOrWhiteSpace() && updatedPath != file.Path)
|
||||
{
|
||||
_rootFolderWatchingService.ReportFileSystemChangeBeginning(updatedPath);
|
||||
file.Path = updatedPath;
|
||||
@@ -304,6 +307,7 @@ namespace NzbDrone.Core.Books.Calibre
|
||||
|
||||
var request = builder.Build();
|
||||
request.SetContent(payload.ToJson());
|
||||
request.ContentSummary = payload.ToJson(Formatting.None);
|
||||
|
||||
_httpClient.Execute(request);
|
||||
}
|
||||
|
||||
@@ -322,6 +322,20 @@ namespace NzbDrone.Core.Configuration
|
||||
}
|
||||
}
|
||||
|
||||
public void MigrateConfigFile()
|
||||
{
|
||||
if (!File.Exists(_configFile))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// If SSL is enabled and a cert hash is still in the config file disable SSL
|
||||
if (EnableSsl && GetValue("SslCertHash", null).IsNotNullOrWhiteSpace())
|
||||
{
|
||||
SetValue("EnableSsl", false);
|
||||
}
|
||||
}
|
||||
|
||||
private void DeleteOldValues()
|
||||
{
|
||||
var xDoc = LoadConfigFile();
|
||||
@@ -404,6 +418,7 @@ namespace NzbDrone.Core.Configuration
|
||||
|
||||
public void HandleAsync(ApplicationStartedEvent message)
|
||||
{
|
||||
MigrateConfigFile();
|
||||
EnsureDefaultConfigFile();
|
||||
DeleteOldValues();
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ namespace NzbDrone.Core.CustomFormats
|
||||
}
|
||||
}
|
||||
|
||||
return matches;
|
||||
return matches.OrderBy(x => x.Name).ToList();
|
||||
}
|
||||
|
||||
private static List<CustomFormat> ParseCustomFormat(BookFile bookFile, Author author, List<CustomFormat> allCustomFormats)
|
||||
|
||||
@@ -9,9 +9,9 @@ namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
public interface IConnectionStringFactory
|
||||
{
|
||||
string MainDbConnectionString { get; }
|
||||
string LogDbConnectionString { get; }
|
||||
string CacheDbConnectionString { get; }
|
||||
DatabaseConnectionInfo MainDbConnection { get; }
|
||||
DatabaseConnectionInfo LogDbConnection { get; }
|
||||
DatabaseConnectionInfo CacheDbConnection { get; }
|
||||
string GetDatabasePath(string connectionString);
|
||||
}
|
||||
|
||||
@@ -23,19 +23,19 @@ namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
_configFileProvider = configFileProvider;
|
||||
|
||||
MainDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) :
|
||||
MainDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) :
|
||||
GetConnectionString(appFolderInfo.GetDatabase());
|
||||
|
||||
LogDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) :
|
||||
LogDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) :
|
||||
GetConnectionString(appFolderInfo.GetLogDatabase());
|
||||
|
||||
CacheDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresCacheDb) :
|
||||
CacheDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresCacheDb) :
|
||||
GetConnectionString(appFolderInfo.GetCacheDatabase());
|
||||
}
|
||||
|
||||
public string MainDbConnectionString { get; private set; }
|
||||
public string LogDbConnectionString { get; private set; }
|
||||
public string CacheDbConnectionString { get; private set; }
|
||||
public DatabaseConnectionInfo MainDbConnection { get; private set; }
|
||||
public DatabaseConnectionInfo LogDbConnection { get; private set; }
|
||||
public DatabaseConnectionInfo CacheDbConnection { get; private set; }
|
||||
|
||||
public string GetDatabasePath(string connectionString)
|
||||
{
|
||||
@@ -44,37 +44,40 @@ namespace NzbDrone.Core.Datastore
|
||||
return connectionBuilder.DataSource;
|
||||
}
|
||||
|
||||
private static string GetConnectionString(string dbPath)
|
||||
private static DatabaseConnectionInfo GetConnectionString(string dbPath)
|
||||
{
|
||||
var connectionBuilder = new SQLiteConnectionStringBuilder();
|
||||
|
||||
connectionBuilder.DataSource = dbPath;
|
||||
connectionBuilder.CacheSize = -10000;
|
||||
connectionBuilder.DateTimeKind = DateTimeKind.Utc;
|
||||
connectionBuilder.JournalMode = OsInfo.IsOsx ? SQLiteJournalModeEnum.Truncate : SQLiteJournalModeEnum.Wal;
|
||||
connectionBuilder.Pooling = true;
|
||||
connectionBuilder.Version = 3;
|
||||
var connectionBuilder = new SQLiteConnectionStringBuilder
|
||||
{
|
||||
DataSource = dbPath,
|
||||
CacheSize = -20000,
|
||||
DateTimeKind = DateTimeKind.Utc,
|
||||
JournalMode = OsInfo.IsOsx ? SQLiteJournalModeEnum.Truncate : SQLiteJournalModeEnum.Wal,
|
||||
Pooling = true,
|
||||
Version = 3,
|
||||
BusyTimeout = 100
|
||||
};
|
||||
|
||||
if (OsInfo.IsOsx)
|
||||
{
|
||||
connectionBuilder.Add("Full FSync", true);
|
||||
}
|
||||
|
||||
return connectionBuilder.ConnectionString;
|
||||
return new DatabaseConnectionInfo(DatabaseType.SQLite, connectionBuilder.ConnectionString);
|
||||
}
|
||||
|
||||
private string GetPostgresConnectionString(string dbName)
|
||||
private DatabaseConnectionInfo GetPostgresConnectionString(string dbName)
|
||||
{
|
||||
var connectionBuilder = new NpgsqlConnectionStringBuilder();
|
||||
var connectionBuilder = new NpgsqlConnectionStringBuilder
|
||||
{
|
||||
Database = dbName,
|
||||
Host = _configFileProvider.PostgresHost,
|
||||
Username = _configFileProvider.PostgresUser,
|
||||
Password = _configFileProvider.PostgresPassword,
|
||||
Port = _configFileProvider.PostgresPort,
|
||||
Enlist = false
|
||||
};
|
||||
|
||||
connectionBuilder.Database = dbName;
|
||||
connectionBuilder.Host = _configFileProvider.PostgresHost;
|
||||
connectionBuilder.Username = _configFileProvider.PostgresUser;
|
||||
connectionBuilder.Password = _configFileProvider.PostgresPassword;
|
||||
connectionBuilder.Port = _configFileProvider.PostgresPort;
|
||||
connectionBuilder.Enlist = false;
|
||||
|
||||
return connectionBuilder.ConnectionString;
|
||||
return new DatabaseConnectionInfo(DatabaseType.PostgreSQL, connectionBuilder.ConnectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
14
src/NzbDrone.Core/Datastore/DatabaseConnectionInfo.cs
Normal file
14
src/NzbDrone.Core/Datastore/DatabaseConnectionInfo.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
public class DatabaseConnectionInfo
|
||||
{
|
||||
public DatabaseConnectionInfo(DatabaseType databaseType, string connectionString)
|
||||
{
|
||||
DatabaseType = databaseType;
|
||||
ConnectionString = connectionString;
|
||||
}
|
||||
|
||||
public DatabaseType DatabaseType { get; internal set; }
|
||||
public string ConnectionString { get; internal set; }
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Data.Common;
|
||||
using System.Data.SQLite;
|
||||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
using NLog;
|
||||
using Npgsql;
|
||||
using NzbDrone.Common.Disk;
|
||||
@@ -59,30 +60,30 @@ namespace NzbDrone.Core.Datastore
|
||||
|
||||
public IDatabase Create(MigrationContext migrationContext)
|
||||
{
|
||||
string connectionString;
|
||||
DatabaseConnectionInfo connectionInfo;
|
||||
|
||||
switch (migrationContext.MigrationType)
|
||||
{
|
||||
case MigrationType.Main:
|
||||
{
|
||||
connectionString = _connectionStringFactory.MainDbConnectionString;
|
||||
CreateMain(connectionString, migrationContext);
|
||||
connectionInfo = _connectionStringFactory.MainDbConnection;
|
||||
CreateMain(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case MigrationType.Log:
|
||||
{
|
||||
connectionString = _connectionStringFactory.LogDbConnectionString;
|
||||
CreateLog(connectionString, migrationContext);
|
||||
connectionInfo = _connectionStringFactory.LogDbConnection;
|
||||
CreateLog(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case MigrationType.Cache:
|
||||
{
|
||||
connectionString = _connectionStringFactory.CacheDbConnectionString;
|
||||
CreateLog(connectionString, migrationContext);
|
||||
connectionInfo = _connectionStringFactory.CacheDbConnection;
|
||||
CreateLog(connectionInfo.ConnectionString, migrationContext, connectionInfo.DatabaseType);
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -97,14 +98,14 @@ namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
DbConnection conn;
|
||||
|
||||
if (connectionString.Contains(".db"))
|
||||
if (connectionInfo.DatabaseType == DatabaseType.SQLite)
|
||||
{
|
||||
conn = SQLiteFactory.Instance.CreateConnection();
|
||||
conn.ConnectionString = connectionString;
|
||||
conn.ConnectionString = connectionInfo.ConnectionString;
|
||||
}
|
||||
else
|
||||
{
|
||||
conn = new NpgsqlConnection(connectionString);
|
||||
conn = new NpgsqlConnection(connectionInfo.ConnectionString);
|
||||
}
|
||||
|
||||
conn.Open();
|
||||
@@ -114,12 +115,12 @@ namespace NzbDrone.Core.Datastore
|
||||
return db;
|
||||
}
|
||||
|
||||
private void CreateMain(string connectionString, MigrationContext migrationContext)
|
||||
private void CreateMain(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
||||
{
|
||||
try
|
||||
{
|
||||
_restoreDatabaseService.Restore();
|
||||
_migrationController.Migrate(connectionString, migrationContext);
|
||||
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||
}
|
||||
catch (SQLiteException e)
|
||||
{
|
||||
@@ -142,15 +143,17 @@ namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
Logger.Error(e, "Failure to connect to Postgres DB, {0} retries remaining", retryCount);
|
||||
|
||||
Thread.Sleep(5000);
|
||||
|
||||
try
|
||||
{
|
||||
_migrationController.Migrate(connectionString, migrationContext);
|
||||
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||
return;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (--retryCount > 0)
|
||||
{
|
||||
System.Threading.Thread.Sleep(5000);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -169,11 +172,11 @@ namespace NzbDrone.Core.Datastore
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateLog(string connectionString, MigrationContext migrationContext)
|
||||
private void CreateLog(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
||||
{
|
||||
try
|
||||
{
|
||||
_migrationController.Migrate(connectionString, migrationContext);
|
||||
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||
}
|
||||
catch (SQLiteException e)
|
||||
{
|
||||
@@ -193,7 +196,7 @@ namespace NzbDrone.Core.Datastore
|
||||
Logger.Error("Unable to recreate logging database automatically. It will need to be removed manually.");
|
||||
}
|
||||
|
||||
_migrationController.Migrate(connectionString, migrationContext);
|
||||
_migrationController.Migrate(connectionString, migrationContext, databaseType);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using FluentMigrator;
|
||||
using NzbDrone.Core.Datastore.Migration.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
[Migration(038)]
|
||||
public class add_on_author_added_to_notifications : NzbDroneMigrationBase
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
Alter.Table("Notifications").AddColumn("OnAuthorAdded").AsBoolean().WithDefaultValue(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||
{
|
||||
public interface IMigrationController
|
||||
{
|
||||
void Migrate(string connectionString, MigrationContext migrationContext);
|
||||
void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType);
|
||||
}
|
||||
|
||||
public class MigrationController : IMigrationController
|
||||
@@ -29,7 +29,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||
_migrationLoggerProvider = migrationLoggerProvider;
|
||||
}
|
||||
|
||||
public void Migrate(string connectionString, MigrationContext migrationContext)
|
||||
public void Migrate(string connectionString, MigrationContext migrationContext, DatabaseType databaseType)
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||
|
||||
ServiceProvider serviceProvider;
|
||||
|
||||
var db = connectionString.Contains(".db") ? "sqlite" : "postgres";
|
||||
var db = databaseType == DatabaseType.SQLite ? "sqlite" : "postgres";
|
||||
|
||||
serviceProvider = new ServiceCollection()
|
||||
.AddLogging(b => b.AddNLog())
|
||||
|
||||
@@ -85,6 +85,7 @@ namespace NzbDrone.Core.Datastore
|
||||
.Ignore(i => i.SupportsOnReleaseImport)
|
||||
.Ignore(i => i.SupportsOnUpgrade)
|
||||
.Ignore(i => i.SupportsOnRename)
|
||||
.Ignore(i => i.SupportsOnAuthorAdded)
|
||||
.Ignore(i => i.SupportsOnAuthorDelete)
|
||||
.Ignore(i => i.SupportsOnBookDelete)
|
||||
.Ignore(i => i.SupportsOnBookFileDelete)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.CustomFormats;
|
||||
using NzbDrone.Core.Download.TrackedDownloads;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
@@ -15,16 +16,19 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
|
||||
private readonly IQueueService _queueService;
|
||||
private readonly UpgradableSpecification _upgradableSpecification;
|
||||
private readonly ICustomFormatCalculationService _formatService;
|
||||
private readonly IConfigService _configService;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public QueueSpecification(IQueueService queueService,
|
||||
UpgradableSpecification upgradableSpecification,
|
||||
ICustomFormatCalculationService formatService,
|
||||
IConfigService configService,
|
||||
Logger logger)
|
||||
{
|
||||
_queueService = queueService;
|
||||
_upgradableSpecification = upgradableSpecification;
|
||||
_formatService = formatService;
|
||||
_configService = configService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -85,6 +89,15 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
|
||||
{
|
||||
return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades");
|
||||
}
|
||||
|
||||
if (_upgradableSpecification.IsRevisionUpgrade(remoteBook.ParsedBookInfo.Quality, subject.ParsedBookInfo.Quality))
|
||||
{
|
||||
if (_configService.DownloadPropersAndRepacks == ProperDownloadTypes.DoNotUpgrade)
|
||||
{
|
||||
_logger.Debug("Auto downloading of propers is disabled");
|
||||
return Decision.Reject("Proper downloading is disabled");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Decision.Accept();
|
||||
|
||||
@@ -304,13 +304,13 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
break;
|
||||
}
|
||||
|
||||
if (version >= new Version("2.6.1"))
|
||||
if (version >= new Version("2.6.1") && item.Status == DownloadItemStatus.Completed)
|
||||
{
|
||||
if (torrent.ContentPath != torrent.SavePath)
|
||||
{
|
||||
item.OutputPath = _remotePathMappingService.RemapRemoteToLocal(Settings.Host, new OsPath(torrent.ContentPath));
|
||||
}
|
||||
else if (item.Status == DownloadItemStatus.Completed)
|
||||
else
|
||||
{
|
||||
item.Status = DownloadItemStatus.Warning;
|
||||
item.Message = "Unable to Import. Path matches client base download directory, it's possible 'Keep top-level folder' is disabled for this torrent or 'Torrent Content Layout' is NOT set to 'Original' or 'Create Subfolder'?";
|
||||
@@ -386,11 +386,13 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
}
|
||||
}
|
||||
|
||||
var minimumRetention = 60 * 24 * 14;
|
||||
|
||||
return new DownloadClientInfo
|
||||
{
|
||||
IsLocalhost = Settings.Host == "127.0.0.1" || Settings.Host == "localhost",
|
||||
OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, destDir) },
|
||||
RemovesCompletedDownloads = (config.MaxRatioEnabled || config.MaxSeedingTimeEnabled) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles)
|
||||
RemovesCompletedDownloads = (config.MaxRatioEnabled || (config.MaxSeedingTimeEnabled && config.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -263,7 +263,16 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
||||
status.OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, category.FullPath) };
|
||||
}
|
||||
|
||||
status.RemovesCompletedDownloads = config.Misc.history_retention != "0";
|
||||
if (config.Misc.history_retention.IsNotNullOrWhiteSpace() && config.Misc.history_retention.EndsWith("d"))
|
||||
{
|
||||
int.TryParse(config.Misc.history_retention.AsSpan(0, config.Misc.history_retention.Length - 1),
|
||||
out var daysRetention);
|
||||
status.RemovesCompletedDownloads = daysRetention < 14;
|
||||
}
|
||||
else
|
||||
{
|
||||
status.RemovesCompletedDownloads = config.Misc.history_retention != "0";
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -368,6 +368,10 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
_mediaFileAttributeService.SetFilePermissions(fullPath);
|
||||
}
|
||||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
_logger.Warn(ex, "Couldn't download image {0} for {1}. {2}", image.Url, author, ex.Message);
|
||||
}
|
||||
catch (WebException ex)
|
||||
{
|
||||
_logger.Warn(ex, "Couldn't download image {0} for {1}. {2}", image.Url, author, ex.Message);
|
||||
|
||||
@@ -16,15 +16,30 @@ namespace NzbDrone.Core.Housekeeping.Housekeepers
|
||||
{
|
||||
using var mapper = _database.OpenConnection();
|
||||
|
||||
mapper.Execute(@"UPDATE ""Editions""
|
||||
SET ""Monitored"" = 0
|
||||
WHERE ""Id"" IN (
|
||||
SELECT MIN(""Id"")
|
||||
FROM ""Editions""
|
||||
WHERE ""Monitored"" = 1
|
||||
GROUP BY ""BookId""
|
||||
HAVING COUNT(""BookId"") > 1
|
||||
)");
|
||||
if (_database.DatabaseType == DatabaseType.PostgreSQL)
|
||||
{
|
||||
mapper.Execute(@"UPDATE ""Editions""
|
||||
SET ""Monitored"" = true
|
||||
WHERE ""Id"" IN (
|
||||
SELECT MIN(""Id"")
|
||||
FROM ""Editions""
|
||||
WHERE ""Monitored"" = true
|
||||
GROUP BY ""BookId""
|
||||
HAVING COUNT(""BookId"") > 1
|
||||
)");
|
||||
}
|
||||
else
|
||||
{
|
||||
mapper.Execute(@"UPDATE ""Editions""
|
||||
SET ""Monitored"" = 0
|
||||
WHERE ""Id"" IN (
|
||||
SELECT MIN(""Id"")
|
||||
FROM ""Editions""
|
||||
WHERE ""Monitored"" = 1
|
||||
GROUP BY ""BookId""
|
||||
HAVING COUNT(""BookId"") > 1
|
||||
)");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,41 +67,51 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
private List<Book> SyncAll()
|
||||
{
|
||||
if (_importListFactory.AutomaticAddEnabled().Empty())
|
||||
{
|
||||
_logger.Debug("No import lists with automatic add enabled");
|
||||
|
||||
return new List<Book>();
|
||||
}
|
||||
|
||||
_logger.ProgressInfo("Starting Import List Sync");
|
||||
|
||||
var rssReleases = _listFetcherAndParser.Fetch();
|
||||
var listItems = _listFetcherAndParser.Fetch().ToList();
|
||||
|
||||
var reports = rssReleases.ToList();
|
||||
|
||||
return ProcessReports(reports);
|
||||
return ProcessListItems(listItems);
|
||||
}
|
||||
|
||||
private List<Book> SyncList(ImportListDefinition definition)
|
||||
{
|
||||
_logger.ProgressInfo(string.Format("Starting Import List Refresh for List {0}", definition.Name));
|
||||
_logger.ProgressInfo($"Starting Import List Refresh for List {definition.Name}");
|
||||
|
||||
var rssReleases = _listFetcherAndParser.FetchSingleList(definition);
|
||||
var listItems = _listFetcherAndParser.FetchSingleList(definition).ToList();
|
||||
|
||||
var reports = rssReleases.ToList();
|
||||
|
||||
return ProcessReports(reports);
|
||||
return ProcessListItems(listItems);
|
||||
}
|
||||
|
||||
private List<Book> ProcessReports(List<ImportListItemInfo> reports)
|
||||
private List<Book> ProcessListItems(List<ImportListItemInfo> items)
|
||||
{
|
||||
var processed = new List<Book>();
|
||||
var authorsToAdd = new List<Author>();
|
||||
var booksToAdd = new List<Book>();
|
||||
|
||||
_logger.ProgressInfo("Processing {0} list items", reports.Count);
|
||||
if (items.Count == 0)
|
||||
{
|
||||
_logger.ProgressInfo("No list items to process");
|
||||
|
||||
return new List<Book>();
|
||||
}
|
||||
|
||||
_logger.ProgressInfo("Processing {0} list items", items.Count);
|
||||
|
||||
var reportNumber = 1;
|
||||
|
||||
var listExclusions = _importListExclusionService.All();
|
||||
|
||||
foreach (var report in reports)
|
||||
foreach (var report in items)
|
||||
{
|
||||
_logger.ProgressTrace("Processing list item {0}/{1}", reportNumber, reports.Count);
|
||||
_logger.ProgressTrace("Processing list item {0}/{1}", reportNumber, items.Count);
|
||||
|
||||
reportNumber++;
|
||||
|
||||
@@ -130,7 +140,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
var addedAuthors = _addAuthorService.AddAuthors(authorsToAdd, false);
|
||||
var addedBooks = _addBookService.AddBooks(booksToAdd, false);
|
||||
|
||||
var message = string.Format($"Import List Sync Completed. Items found: {reports.Count}, Authors added: {authorsToAdd.Count}, Books added: {booksToAdd.Count}");
|
||||
var message = string.Format($"Import List Sync Completed. Items found: {items.Count}, Authors added: {authorsToAdd.Count}, Books added: {booksToAdd.Count}");
|
||||
|
||||
_logger.ProgressInfo(message);
|
||||
|
||||
@@ -364,7 +374,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
var existingAuthor = _authorService.FindById(report.AuthorGoodreadsId);
|
||||
|
||||
// Check to see if author excluded
|
||||
var excludedAuthor = listExclusions.Where(s => s.ForeignId == report.AuthorGoodreadsId).SingleOrDefault();
|
||||
var excludedAuthor = listExclusions.SingleOrDefault(s => s.ForeignId == report.AuthorGoodreadsId);
|
||||
|
||||
// Check to see if author in import
|
||||
var existingImportAuthor = authorsToAdd.Find(i => i.ForeignAuthorId == report.AuthorGoodreadsId);
|
||||
@@ -425,16 +435,7 @@ namespace NzbDrone.Core.ImportLists
|
||||
|
||||
public void Execute(ImportListSyncCommand message)
|
||||
{
|
||||
List<Book> processed;
|
||||
|
||||
if (message.DefinitionId.HasValue)
|
||||
{
|
||||
processed = SyncList(_importListFactory.Get(message.DefinitionId.Value));
|
||||
}
|
||||
else
|
||||
{
|
||||
processed = SyncAll();
|
||||
}
|
||||
var processed = message.DefinitionId.HasValue ? SyncList(_importListFactory.Get(message.DefinitionId.Value)) : SyncAll();
|
||||
|
||||
_eventAggregator.PublishEvent(new ImportListSyncCompleteEvent(processed));
|
||||
}
|
||||
|
||||
@@ -53,7 +53,6 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
yield return GetDefinition("NZBFinder.ws", GetSettings("https://nzbfinder.ws"));
|
||||
yield return GetDefinition("NZBgeek", GetSettings("https://api.nzbgeek.info"));
|
||||
yield return GetDefinition("nzbplanet.net", GetSettings("https://api.nzbplanet.net"));
|
||||
yield return GetDefinition("OZnzb.com", GetSettings("https://api.oznzb.com"));
|
||||
yield return GetDefinition("SimplyNZBs", GetSettings("https://simplynzbs.com"));
|
||||
yield return GetDefinition("Tabula Rasa", GetSettings("https://www.tabula-rasa.pw", apiPath: @"/api/v1/api"));
|
||||
yield return GetDefinition("Usenet Crawler", GetSettings("https://www.usenet-crawler.com"));
|
||||
|
||||
@@ -85,16 +85,15 @@ namespace NzbDrone.Core.Instrumentation
|
||||
|
||||
log.Level = logEvent.Level.Name;
|
||||
|
||||
var connectionString = _connectionStringFactory.LogDbConnectionString;
|
||||
var connectionInfo = _connectionStringFactory.LogDbConnection;
|
||||
|
||||
//TODO: Probably need more robust way to differentiate what's being used
|
||||
if (connectionString.Contains(".db"))
|
||||
if (connectionInfo.DatabaseType == DatabaseType.SQLite)
|
||||
{
|
||||
WriteSqliteLog(log, connectionString);
|
||||
WriteSqliteLog(log, connectionInfo.ConnectionString);
|
||||
}
|
||||
else
|
||||
{
|
||||
WritePostgresLog(log, connectionString);
|
||||
WritePostgresLog(log, connectionInfo.ConnectionString);
|
||||
}
|
||||
}
|
||||
catch (SQLiteException ex)
|
||||
|
||||
@@ -216,8 +216,6 @@
|
||||
"FileManagement": "إدارة الملفات",
|
||||
"FileDateHelpText": "تغيير تاريخ الملف عند الاستيراد / إعادة الفحص",
|
||||
"FailedDownloadHandling": "فشل معالجة التنزيل",
|
||||
"ExtraFileExtensionsHelpTexts2": "أمثلة: \".sub أو .nfo\" أو \"sub، nfo\"",
|
||||
"ExtraFileExtensionsHelpTexts1": "قائمة مفصولة بفواصل بالملفات الإضافية المراد استيرادها (سيتم استيراد .nfo كـ .nfo-Orig)",
|
||||
"Exception": "استثناء",
|
||||
"ErrorLoadingPreviews": "خطأ في تحميل المعاينات",
|
||||
"ErrorLoadingContents": "خطأ في تحميل المحتويات",
|
||||
@@ -628,5 +626,7 @@
|
||||
"AddNew": "اضف جديد",
|
||||
"System": "النظام",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "يتم إخفاء جميع النتائج بواسطة عامل التصفية المطبق",
|
||||
"Backup": "دعم"
|
||||
"Backup": "دعم",
|
||||
"ExtraFileExtensionsHelpText": "قائمة مفصولة بفواصل بالملفات الإضافية المراد استيرادها (سيتم استيراد .nfo كـ .nfo-Orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "أمثلة: \".sub أو .nfo\" أو \"sub، nfo\""
|
||||
}
|
||||
|
||||
@@ -122,8 +122,6 @@
|
||||
"ErrorLoadingContents": "Грешка при зареждането на съдържанието",
|
||||
"ErrorLoadingPreviews": "Грешка при зареждането на визуализациите",
|
||||
"Exception": "Изключение",
|
||||
"ExtraFileExtensionsHelpTexts1": "Списък с допълнителни файлове за импортиране, разделени със запетая (.nfo ще бъде импортиран като .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Примери: '.sub, .nfo' или 'sub, nfo'",
|
||||
"FailedDownloadHandling": "Неуспешно обработване на изтеглянето",
|
||||
"FileDateHelpText": "Променете датата на файла при импортиране / пресканиране",
|
||||
"FileManagement": "Управление на файлове",
|
||||
@@ -626,5 +624,9 @@
|
||||
"AddNew": "Добави нов",
|
||||
"NextExecution": "Следващо изпълнение",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Всички резултати са скрити от приложения филтър",
|
||||
"Backup": "Архивиране"
|
||||
"Backup": "Архивиране",
|
||||
"MetadataProfiles": "Добави профил на метадата",
|
||||
"MetadataProfile": "Добави профил на метадата",
|
||||
"ExtraFileExtensionsHelpText": "Списък с допълнителни файлове за импортиране, разделени със запетая (.nfo ще бъде импортиран като .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Примери: '.sub, .nfo' или 'sub, nfo'"
|
||||
}
|
||||
|
||||
@@ -326,7 +326,6 @@
|
||||
"DownloadClientStatusCheckAllClientMessage": "Tots els clients de descàrrega no estan disponibles a causa d'errors",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Baixa els clients no disponibles a causa d'errors: {0}",
|
||||
"Duration": "durada",
|
||||
"ExtraFileExtensionsHelpTexts1": "Llista separada per comes de fitxers addicionals per importar (.nfo s'importarà com a .nfo-orig)",
|
||||
"FileWasDeletedByViaUI": "El fitxer s'ha suprimit mitjançant la interfície d'usuari",
|
||||
"GeneralSettingsSummary": "Port, SSL, nom d'usuari/contrasenya, servidor intermediari, analítiques i actualitzacions",
|
||||
"GrabRelease": "Captura novetat",
|
||||
@@ -528,7 +527,6 @@
|
||||
"CutoffUnmet": "Tall no assolit",
|
||||
"DeleteDelayProfileMessageText": "Esteu segur que voleu suprimir aquest perfil de retard?",
|
||||
"DeleteImportListExclusionMessageText": "Esteu segur que voleu suprimir aquesta exclusió de la llista d'importació?",
|
||||
"ExtraFileExtensionsHelpTexts2": "Exemples: '.sub, .nfo' o 'sub,nfo'",
|
||||
"HasPendingChangesSaveChanges": "Desa els canvis",
|
||||
"ICalLink": "Enllaç iCal`",
|
||||
"IgnoredHelpText": "La publicació es rebutjarà si conté un o més dels termes (no distingeix entre majúscules i minúscules)",
|
||||
|
||||
@@ -80,19 +80,19 @@
|
||||
"DeleteDelayProfile": "Odstranění profilu zpoždění",
|
||||
"DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
|
||||
"DeleteDownloadClient": "Odstranění klienta pro stahování",
|
||||
"DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování „{0}“?",
|
||||
"DeleteDownloadClientMessageText": "Opravdu chcete odstranit klienta pro stahování '{name}'?",
|
||||
"DeleteEmptyFolders": "Odstraňte prázdné složky",
|
||||
"DeleteEmptyFoldersHelpText": "Během skenování disku a při mazání filmových souborů odstraňte prázdné složky s filmy",
|
||||
"DeleteImportListExclusion": "Odstranit vyloučení seznamu importů",
|
||||
"DeleteImportListExclusionMessageText": "Opravdu chcete toto vyloučení importního seznamu smazat?",
|
||||
"DeleteImportListMessageText": "Opravdu chcete smazat seznam „{0}“?",
|
||||
"DeleteImportListMessageText": "Opravdu chcete smazat seznam '{name}'?",
|
||||
"DeleteIndexer": "Odstranit indexer",
|
||||
"DeleteIndexerMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
||||
"DeleteMetadataProfileMessageText": "Opravdu chcete smazat kvalitní profil {0}",
|
||||
"DeleteIndexerMessageText": "Opravdu chcete odstranit indexer '{name}'?",
|
||||
"DeleteMetadataProfileMessageText": "Opravdu chcete smazat profil metadat '{name}'?",
|
||||
"DeleteNotification": "Smazat oznámení",
|
||||
"DeleteNotificationMessageText": "Opravdu chcete smazat oznámení „{0}“?",
|
||||
"DeleteNotificationMessageText": "Opravdu chcete smazat oznámení '{name}'?",
|
||||
"DeleteQualityProfile": "Smažte profil kvality",
|
||||
"DeleteQualityProfileMessageText": "Opravdu chcete smazat kvalitní profil {0}",
|
||||
"DeleteQualityProfileMessageText": "Opravdu chcete smazat profil kvality '{name}'?",
|
||||
"DeleteReleaseProfile": "Smazat profil zpoždění",
|
||||
"DeleteReleaseProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
|
||||
"DeleteSelectedBookFiles": "Odstranit vybrané filmové soubory",
|
||||
@@ -128,8 +128,6 @@
|
||||
"ErrorLoadingContents": "Chyba při načítání obsahu",
|
||||
"ErrorLoadingPreviews": "Chyba při načítání náhledů",
|
||||
"Exception": "Výjimka",
|
||||
"ExtraFileExtensionsHelpTexts1": "Seznam extra souborů k importu oddělených čárkami (.nfo bude importován jako .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Příklady: „.sub, .nfo“ nebo „sub, nfo“",
|
||||
"FailedDownloadHandling": "Zpracování stahování se nezdařilo",
|
||||
"FileDateHelpText": "Změnit datum souboru při importu / opětovném skenování",
|
||||
"FileManagement": "Správa souborů",
|
||||
@@ -588,23 +586,23 @@
|
||||
"Required": "Požadované",
|
||||
"NoEventsFound": "Nebyly nalezeny žádné události",
|
||||
"RedownloadFailed": "Stažení se nezdařilo",
|
||||
"DeleteSelectedImportListsMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
||||
"DeleteSelectedImportListsMessageText": "Opravdu chcete smazat {count} vybraných seznamů k importu?",
|
||||
"DeleteSelectedIndexers": "Odstranit indexer",
|
||||
"ExistingTag": "Stávající značka",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Jak použít značky na vybrané filmy",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Opravdu chcete smazat {count} vybraných klientů pro stahování?",
|
||||
"No": "Ne",
|
||||
"NoChange": "Žádná změna",
|
||||
"RemovingTag": "Odebírání značky",
|
||||
"SetTags": "Nastavit značky",
|
||||
"ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané importní seznamy",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexátory",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané seznamy k importu",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexery",
|
||||
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky",
|
||||
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (zadáním žádné značky vymažete všechny značky)",
|
||||
"DeleteSelectedDownloadClients": "Odstranit staženého klienta",
|
||||
"DeleteSelectedIndexersMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
||||
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (prázdné pole vymaže všechny značky)",
|
||||
"DeleteSelectedDownloadClients": "Odstranit klienta pro stahování",
|
||||
"DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?",
|
||||
"Yes": "Ano",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Všechny seznamy nejsou k dispozici z důvodu selhání",
|
||||
"Small": "Malý",
|
||||
@@ -624,7 +622,7 @@
|
||||
"TotalSpace": "Celkový prostor",
|
||||
"ConnectionLost": "Spojení ztraceno",
|
||||
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
|
||||
"ConnectionLostToBackend": "{appName} ztratila spojení s backendem a pro obnovení funkčnosti bude třeba ji znovu načíst.",
|
||||
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude třebaho znovu načíst.",
|
||||
"Large": "Velký",
|
||||
"LastDuration": "lastDuration",
|
||||
"Ui": "UI",
|
||||
@@ -645,8 +643,8 @@
|
||||
"CloneCondition": "Klonovat podmínku",
|
||||
"Clone": "Klonovat",
|
||||
"ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {0} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru",
|
||||
"ChooseImportMethod": "Vyberte mód importu",
|
||||
"CatalogNumber": "katalogové číslo",
|
||||
"ChooseImportMethod": "Vyberte způsob importu",
|
||||
"CatalogNumber": "Katalogové číslo",
|
||||
"Publisher": "Vydavatel",
|
||||
"StatusEndedContinuing": "Pokračující",
|
||||
"MetadataProfiles": "profil metadat",
|
||||
@@ -655,12 +653,35 @@
|
||||
"Label": "Etiketa",
|
||||
"Library": "Knihovna",
|
||||
"BypassIfAboveCustomFormatScore": "Obejít, pokud je vyšší než skóre vlastního formátu",
|
||||
"AppUpdatedVersion": "{appName} byla aktualizována na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}.",
|
||||
"AppUpdatedVersion": "{appName} byl aktualizován na verzi `{version}`, abyste získali nejnovější změny, musíte znovu načíst {appName}",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "Povolit obcházení, pokud má vydání vyšší skóre, než je nakonfigurované minimální skóre vlastního formátu",
|
||||
"BypassIfHighestQuality": "Obejít v případě nejvyšší kvality",
|
||||
"Theme": "Motiv",
|
||||
"MinimumCustomFormatScoreHelpText": "Minimální skóre vlastního formátu požadované pro obejití zpoždění preferovaného protokolu",
|
||||
"Series": "Seriál",
|
||||
"DeleteCondition": "Odstranit podmínku",
|
||||
"Database": "Databáze"
|
||||
"Database": "Databáze",
|
||||
"CountDownloadClientsSelected": "{count} vybraných klientů ke stahování",
|
||||
"ImportListMissingRoot": "Chybí kořenový adresář pro import seznamu: {0}",
|
||||
"IndexerDownloadClientHelpText": "Zvolte, který klient pro stahování bude použit pro zachytávání z toho indexeru",
|
||||
"ImportListMultipleMissingRoots": "Několik kořenových adresářů chybí pro seznamy importu: {0}",
|
||||
"EditSelectedDownloadClients": "Upravit vybrané klienty pro stahování",
|
||||
"EditSelectedIndexers": "Upravit vybrané indexery",
|
||||
"EnableProfile": "Povolit profil",
|
||||
"DeleteImportList": "Smazat seznam importovaných položek",
|
||||
"AddNewItem": "Přidat novou položku",
|
||||
"AddMissing": "Přidat chybějící",
|
||||
"EditSelectedImportLists": "Upravit vybrané seznamy k importu",
|
||||
"DeleteSelectedImportLists": "Smazat seznam k importu",
|
||||
"Duration": "Trvání",
|
||||
"DeleteRootFolder": "Smazat kořenový adresář",
|
||||
"DownloadClientTagHelpText": "Tohoto klienta pro stahování používat pouze pro filmy s alespoň jednou odpovídající značkou. Pro použití se všemi filmy ponechte prázdné pole.",
|
||||
"AddedAuthorSettings": "Nastavení umělce přidáno",
|
||||
"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}.",
|
||||
"IndexerTagsHelpText": "Tohoto klienta pro stahování používat pouze pro filmy s alespoň jednou odpovídající značkou. Pro použití se všemi filmy ponechte prázdné pole.",
|
||||
"BlocklistReleaseHelpText": "Zabránit {appName}u v opětovném sebrání tohoto vydání",
|
||||
"ListsSettingsSummary": "Seznam k importu",
|
||||
"ExtraFileExtensionsHelpText": "Seznam extra souborů k importu oddělených čárkami (.nfo bude importován jako .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Příklady: „.sub, .nfo“ nebo „sub, nfo“",
|
||||
"ImportLists": "Seznam k importu"
|
||||
}
|
||||
|
||||
@@ -123,8 +123,6 @@
|
||||
"ErrorLoadingContents": "Fejl ved indlæsning af indhold",
|
||||
"ErrorLoadingPreviews": "Fejl ved indlæsning af forhåndsvisning",
|
||||
"Exception": "Undtagelse",
|
||||
"ExtraFileExtensionsHelpTexts1": "Kommasepareret liste over ekstra filer, der skal importeres (.nfo importeres som .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Eksempler: '.sub, .nfo' eller 'sub, nfo'",
|
||||
"FailedDownloadHandling": "Fejlet Download Håndtering",
|
||||
"FileDateHelpText": "Skift fildato ved import / genscanning",
|
||||
"FileManagement": "Fil Håndtering",
|
||||
@@ -635,5 +633,7 @@
|
||||
"Large": "Stor",
|
||||
"Library": "Bibliotek",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Alle resultater skjules af det anvendte filter",
|
||||
"AddNewItem": "Tilføj Ny Genstand"
|
||||
"AddNewItem": "Tilføj Ny Genstand",
|
||||
"ExtraFileExtensionsHelpText": "Kommasepareret liste over ekstra filer, der skal importeres (.nfo importeres som .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Eksempler: '.sub, .nfo' eller 'sub, nfo'"
|
||||
}
|
||||
|
||||
@@ -122,8 +122,6 @@
|
||||
"ErrorLoadingContents": "Fehler beim laden der Inhalte",
|
||||
"ErrorLoadingPreviews": "Fehler beim laden der Vorschauen",
|
||||
"Exception": "Ausnahme",
|
||||
"ExtraFileExtensionsHelpTexts1": "Kommaseparierte Liste von Dateiendungen die als Extra Dateien importiert werden sollen ( .nfo wird in .nfo-orig umbenannt )",
|
||||
"ExtraFileExtensionsHelpTexts2": "Vorschläge: sub, nfo, srt, jpg",
|
||||
"FailedDownloadHandling": "Verarbeitung fehlgeschlagener Downloads",
|
||||
"FileDateHelpText": "Aktualisiere das Erstelldatum beim Import oder Re-Scan",
|
||||
"FileManagement": "Dateiverwaltung",
|
||||
@@ -240,32 +238,32 @@
|
||||
"PortNumber": "Port Nummer",
|
||||
"PosterSize": "Plakatgröße",
|
||||
"Profiles": "Profile",
|
||||
"Proper": "Proper",
|
||||
"Proper": "Korrekt",
|
||||
"PropersAndRepacks": "Propers und Repacks",
|
||||
"Protocol": "Protokoll",
|
||||
"ProtocolHelpText": "Wählen Sie, welche(s) Protokoll(e) verwendet werden soll(en) und welches Protokoll bei der Wahl zwischen ansonsten gleichwertigen Releases bevorzugt wird",
|
||||
"ProtocolHelpText": "Wählen Sie aus, welche(s) Protokoll(e) Sie verwenden möchten und welches Protokoll Sie bevorzugen, wenn Sie zwischen ansonsten gleichen Versionen wählen",
|
||||
"Proxy": "Proxy",
|
||||
"ProxyBypassFilterHelpText": "Verwende ',' als Trennzeichen und '*.' als Platzhalter für Subdomains",
|
||||
"ProxyPasswordHelpText": "Nur wenn ein Benutzername und Passwort erforderlich ist, muss es eingegeben werden. Ansonsten leer lassen.",
|
||||
"ProxyType": "Proxy Typ",
|
||||
"PublishedDate": "Veröffentlichungs Datum",
|
||||
"ProxyBypassFilterHelpText": "Verwenden Sie ',' als Trennzeichen und '*.' als Wildcard für Subdomains",
|
||||
"ProxyPasswordHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.",
|
||||
"ProxyType": "Proxy-Typ",
|
||||
"PublishedDate": "Veröffentlichungsdatum",
|
||||
"Quality": "Qualität",
|
||||
"QualityDefinitions": "Qualitätsdefinitionen",
|
||||
"QualityProfile": "Qualitätsprofil",
|
||||
"QualityProfiles": "Qualitätsprofile",
|
||||
"QualitySettings": "Qualitäts Einstellungen",
|
||||
"QualitySettings": "Qualitätseinstellungen",
|
||||
"Queue": "Warteschlange",
|
||||
"RSSSync": "RSS-Sync",
|
||||
"RSSSyncInterval": "RSS Synchronisierungs Intervall",
|
||||
"ReadTheWikiForMoreInformation": "Lese das Wiki für mehr Informationen",
|
||||
"ReadTheWikiForMoreInformation": "Lesen Sie das Wiki für weitere Informationen",
|
||||
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Jeder Indexer der den Newznab-Standard verwendet oder unten aufgelistet ist wird untertützt.",
|
||||
"ReadarrTags": "Radarr Tags",
|
||||
"Real": "Echt",
|
||||
"Reason": "Grund",
|
||||
"Real": "Real",
|
||||
"Reason": "Begründung",
|
||||
"RecycleBinCleanupDaysHelpText": "Auf 0 setzen um das automatische leeren des Papierkorbs zu deaktivieren",
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "Datien im Papierkorb die älter sind als der gewählte Wert, werden endgültig gelöscht",
|
||||
"RecycleBinHelpText": "Gelöschte Filmdateien werden hierher verschoben anstatt sie direkt endgültig zu löschen",
|
||||
"RecyclingBinCleanup": "Papierkorb aufräumen",
|
||||
"RecyclingBinCleanup": "Papierkorb leeren",
|
||||
"Redownload": "Nochmal herunterladen",
|
||||
"Refresh": "Aktualisieren",
|
||||
"RefreshInformationAndScanDisk": "Metadaten aktualisieren und Festplatte scannen",
|
||||
@@ -338,7 +336,7 @@
|
||||
"ShowSizeOnDisk": "Belegter Speicherplatz anzeigen",
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Wird in der Wochenansicht über jeder Spalte angezeigt",
|
||||
"Size": " Größe",
|
||||
"SkipFreeSpaceCheck": "Pürfung des freien Speichers überspringen",
|
||||
"SkipFreeSpaceCheck": "Prüfung des freien Speichers überspringen",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Aktiviere diese Option, wenn es Readarr nicht möglich ist, den freien Speicherplatz des Stammverzeichnisses für Autoren zu erkennen",
|
||||
"SorryThatAuthorCannotBeFound": "Schade, dieser Film kann nicht gefunden werden.",
|
||||
"SorryThatBookCannotBeFound": "Schade, dieser Film kann nicht gefunden werden.",
|
||||
@@ -435,7 +433,7 @@
|
||||
"YesCancel": "Ja, abbrechen",
|
||||
"BindAddressHelpTextWarning": "Erfordert einen Neustart",
|
||||
"LoadingBooksFailed": "Laden der Film-Dateien fehlgeschlagen",
|
||||
"ProxyUsernameHelpText": "Nur wenn ein Benutzername und Passwort erforderlich ist, muss es eingegeben werden. Ansonsten leer lassen.",
|
||||
"ProxyUsernameHelpText": "Sie müssen nur einen Benutzernamen und ein Passwort eingeben, wenn dies erforderlich ist. Andernfalls lassen Sie sie leer.",
|
||||
"SslPortHelpTextWarning": "Erfordert einen Neustart",
|
||||
"UnableToLoadMetadataProfiles": "Verzögerungsprofile konnten nicht geladen werden",
|
||||
"ApiKeyHelpTextWarning": "Erfordert einen Neustart",
|
||||
@@ -694,8 +692,8 @@
|
||||
"PathHelpText": "Stammordner für die Musikbibliothek",
|
||||
"ProxyCheckBadRequestMessage": "Proxy konnte nicht getestet werden. StatusCode: {0}",
|
||||
"ProxyCheckFailedToTestMessage": "Proxy konnte nicht getestet werden: {0}",
|
||||
"Queued": "In der Warteschlange",
|
||||
"RefreshAndScan": "Aktualisieren",
|
||||
"Queued": "In Warteschlange",
|
||||
"RefreshAndScan": "Aktualisieren und scannen",
|
||||
"SettingsRemotePathMappingRemotePathHelpText": "Root-Pfad zum Verzeichnis, auf das der Download-Client zugreift",
|
||||
"Yesterday": "Gestern",
|
||||
"UpdateAvailable": "Neue Version verfügbar",
|
||||
@@ -750,8 +748,8 @@
|
||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "Wenn kein Ausschluss der Import Liste hinzugefügt wird und der Künstler ein anderes Metadaten Profil als 'Keine' hat, kann es passieren, dass dieses Album bei der nächsten Aktualisierung des Künstlers erneut hinzugefügt wird.",
|
||||
"MissingFromDisk": "Radarr konnte die Datei nicht auf der Festplatte finden, daher wurde die Verknüpfung auf die Datei aus der Datenbank entfernt",
|
||||
"ProxyCheckResolveIpMessage": "Fehler beim Auflösen der IP-Adresse für den konfigurierten Proxy-Host {0}",
|
||||
"QualitySettingsSummary": "Qualitätgrößen und Bennenung",
|
||||
"QueueIsEmpty": "Warteschlange ist leer",
|
||||
"QualitySettingsSummary": "Qualitätsgrößen und Namensgebung",
|
||||
"QueueIsEmpty": "Die Warteschlange ist leer",
|
||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Lidarr unterstützt mehrere Listen für den Import von Alben und Künstlern in die Datenbank.",
|
||||
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} Titel insgesamt. {1} Titel mit Dateien.",
|
||||
"SearchFiltered": "Suche gefilterte",
|
||||
@@ -985,7 +983,7 @@
|
||||
"ConnectionLost": "Verbindung unterbrochen",
|
||||
"Events": "Events",
|
||||
"LastDuration": "Letzte Dauer",
|
||||
"RecentChanges": "Neuste Änderungen",
|
||||
"RecentChanges": "Kürzliche Änderungen",
|
||||
"System": "System",
|
||||
"WhatsNew": "Was gibt's Neues?",
|
||||
"NextExecution": "Nächste Ausführung",
|
||||
@@ -993,7 +991,9 @@
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "Einige Ergebnisse werden wegen der aktiven Filter nicht angezeigt",
|
||||
"Medium": "Medium",
|
||||
"Activity": "Aktivität",
|
||||
"AddNew": "Hinzufügen",
|
||||
"AddNew": "Neue hinzufügen",
|
||||
"Backup": "Backups",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Keine Ergebnisse mit den ausgewählten Filtern"
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Keine Ergebnisse mit den ausgewählten Filtern",
|
||||
"AppUpdated": "{appName} aktualisiert",
|
||||
"AppUpdatedVersion": "{appName} wurde auf die Version `{version}` aktualisiert. Um die neusten Funktionen zu bekommen lade {appName} neu"
|
||||
}
|
||||
|
||||
@@ -124,8 +124,6 @@
|
||||
"ErrorLoadingContents": "Σφάλμα κατά τη φόρτωση περιεχομένων",
|
||||
"ErrorLoadingPreviews": "Σφάλμα κατά τη φόρτωση προεπισκοπήσεων",
|
||||
"Exception": "Εξαίρεση",
|
||||
"ExtraFileExtensionsHelpTexts1": "Λίστα πρόσθετων αρχείων που διαχωρίζονται με κόμμα για εισαγωγή (το .nfo θα εισαχθεί ως .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Παραδείγματα: «.sub, .nfo» ή «sub, nfo»",
|
||||
"FailedDownloadHandling": "Η Διαχείρηση Λήψης Απέτυχε",
|
||||
"FileDateHelpText": "Αλλαγή ημερομηνίας αρχείου κατά την εισαγωγή / επανασύνδεση",
|
||||
"FileManagement": "Διαχείρηση Αρχείων",
|
||||
@@ -996,5 +994,6 @@
|
||||
"Small": "Μικρό",
|
||||
"AppUpdated": "{appName} Ενημερώθηκε",
|
||||
"AppUpdatedVersion": "ξαναφορτωθεί",
|
||||
"AutoAdd": "Προσθήκη"
|
||||
"AutoAdd": "Προσθήκη",
|
||||
"ErrorLoadingContent": "Υπήρξε ένα σφάλμα κατά τη φόρτωση του αρχείου"
|
||||
}
|
||||
|
||||
@@ -242,6 +242,7 @@
|
||||
"DeleteRemotePathMappingMessageText": "Are you sure you want to delete this remote path mapping?",
|
||||
"DeleteRootFolder": "Delete Root Folder",
|
||||
"DeleteRootFolderMessageText": "Are you sure you want to delete the root folder '{name}'?",
|
||||
"DeleteSelected": "Delete Selected",
|
||||
"DeleteSelectedBookFiles": "Delete Selected Book Files",
|
||||
"DeleteSelectedBookFilesMessageText": "Are you sure you want to delete the selected book files?",
|
||||
"DeleteSelectedDownloadClients": "Delete Download Client(s)",
|
||||
@@ -317,8 +318,8 @@
|
||||
"ExistingTag": "Existing tag",
|
||||
"ExistingTagsScrubbed": "Existing tags scrubbed",
|
||||
"ExportCustomFormat": "Export Custom Format",
|
||||
"ExtraFileExtensionsHelpTexts1": "Comma separated list of extra files to import (.nfo will be imported as .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Examples: \".sub, .nfo\" or \"sub,nfo\"",
|
||||
"ExtraFileExtensionsHelpText": "Comma separated list of extra files to import (.nfo will be imported as .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Examples: '.sub, .nfo' or 'sub,nfo'",
|
||||
"FailedDownloadHandling": "Failed Download Handling",
|
||||
"FailedToLoadQueue": "Failed to load Queue",
|
||||
"FileDateHelpText": "Change file date on import/rescan",
|
||||
@@ -592,6 +593,8 @@
|
||||
"NotificationTriggers": "Notification Triggers",
|
||||
"OnApplicationUpdate": "On Application Update",
|
||||
"OnApplicationUpdateHelpText": "On Application Update",
|
||||
"OnAuthorAdded": "On Author Added",
|
||||
"OnAuthorAddedHelpText": "On Author Added",
|
||||
"OnAuthorDelete": "On Author Delete",
|
||||
"OnAuthorDeleteHelpText": "On Author Delete",
|
||||
"OnBookDelete": "On Book Delete",
|
||||
|
||||
@@ -14,11 +14,11 @@
|
||||
"60MinutesSixty": "60 Minutos: {0}",
|
||||
"APIKey": "Clave API",
|
||||
"About": "Acerca de",
|
||||
"AddListExclusion": "Añadir Exclusión De Lista",
|
||||
"AddListExclusion": "Agregar Lista de Exclusión",
|
||||
"AddingTag": "Añadir etiqueta",
|
||||
"AgeWhenGrabbed": "Antigüedad (cuando se añadió)",
|
||||
"AlreadyInYourLibrary": "Ya en tu biblioteca",
|
||||
"AlternateTitles": "Título alternativo",
|
||||
"AlternateTitles": "Titulos alternativos",
|
||||
"Analytics": "Analíticas",
|
||||
"AnalyticsEnabledHelpText": "Envíe información anónima de uso y error a los servidores de Radarr. Esto incluye información sobre su navegador, qué páginas de Radarr WebUI utiliza, informes de errores, así como el sistema operativo y la versión en tiempo de ejecución. Usaremos esta información para priorizar funciones y correcciones de errores.",
|
||||
"AnalyticsEnabledHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
||||
@@ -45,9 +45,9 @@
|
||||
"CalendarWeekColumnHeaderHelpText": "Mostrado sobre cada columna cuando la vista activa es semana",
|
||||
"Cancel": "Cancelar",
|
||||
"CancelMessageText": "Seguro que quieres cancelar esta tarea pendiente?",
|
||||
"CertificateValidation": "Validación del certificado",
|
||||
"CertificateValidationHelpText": "Cambiar la rigidez de la validación de la certificación HTTPS",
|
||||
"ChangeFileDate": "Cambiar Fecha de Archivo",
|
||||
"CertificateValidation": "Validacion de certificado",
|
||||
"CertificateValidationHelpText": "Cambiar como es la validacion de la certificacion estricta de HTTPS. No cambiar a menos que entiendas las consecuencias.",
|
||||
"ChangeFileDate": "Cambiar fecha de archivo",
|
||||
"ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado",
|
||||
"ChmodFolder": "Carpeta chmod",
|
||||
"ChmodFolderHelpText": "Octal, aplicado durante la importación / cambio de nombre a carpetas y archivos multimedia (sin bits de ejecución)",
|
||||
@@ -56,12 +56,7 @@
|
||||
"ChownGroupHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Radarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga use el mismo grupo que Radarr.",
|
||||
"Clear": "Borrar",
|
||||
"ClickToChangeQuality": "Clic para cambiar la calidad",
|
||||
"ClientPriority": "Prioridad de Cliente",
|
||||
"CloneIndexer": "Clonar Indexer",
|
||||
"CloneProfile": "Clonar Perfil",
|
||||
"Close": "Cerrar",
|
||||
"Columns": "Columnas",
|
||||
"CompletedDownloadHandling": "Manipulación de descargas completas",
|
||||
"ConnectSettings": "Conectar Ajustes",
|
||||
"Connections": "Conexiones",
|
||||
"CopyUsingHardlinksHelpText": "Usar Hardlinks al intentar copiar ficheros de los torrents que siguen seedeando",
|
||||
@@ -77,23 +72,23 @@
|
||||
"DelayingDownloadUntilInterp": "Retrasar descarga hasta {0} en {1}",
|
||||
"Delete": "Borrar",
|
||||
"DeleteBackup": "Borrar Backup",
|
||||
"DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{0}'?",
|
||||
"DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{name}'?",
|
||||
"DeleteDelayProfile": "Borrar Perfil de Retraso",
|
||||
"DeleteDelayProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
|
||||
"DeleteDownloadClient": "Borrar Gestor de Descargas",
|
||||
"DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{0}'?",
|
||||
"DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{name}'?",
|
||||
"DeleteEmptyFolders": "Borrar carpetas vacías",
|
||||
"DeleteEmptyFoldersHelpText": "Borrar carpetas vacías durante la exploración del disco y cuando se eliminen archivos",
|
||||
"DeleteImportListExclusion": "Borrar exclusión de lista de importación",
|
||||
"DeleteImportListExclusionMessageText": "Estás seguro de que quieres borrar esta exclusión de lista de importación?",
|
||||
"DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{0}'?",
|
||||
"DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{name}'?",
|
||||
"DeleteIndexer": "Borrar Indexer",
|
||||
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
|
||||
"DeleteMetadataProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}",
|
||||
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
|
||||
"DeleteMetadataProfileMessageText": "¿Seguro que quieres eliminar el perfil de metadatos '{name}'?",
|
||||
"DeleteNotification": "Borrar Notificación",
|
||||
"DeleteNotificationMessageText": "Seguro que quieres elminiar la notificación '{0}'?",
|
||||
"DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?",
|
||||
"DeleteQualityProfile": "Borrar Perfil de Calidad",
|
||||
"DeleteQualityProfileMessageText": "Seguro que quieres eliminar el perfil de calidad {0}",
|
||||
"DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?",
|
||||
"DeleteReleaseProfile": "Borrar Perfil de Retraso",
|
||||
"DeleteReleaseProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
|
||||
"DeleteSelectedBookFiles": "Borrar Archivos Seleccionados",
|
||||
@@ -129,8 +124,6 @@
|
||||
"ErrorLoadingContents": "Error al cargar los contenidos",
|
||||
"ErrorLoadingPreviews": "Error al cargar las previsualizaciones",
|
||||
"Exception": "Excepción",
|
||||
"ExtraFileExtensionsHelpTexts1": "Separar con cons la lista de los archivos extra a importar (.nfo será impotado como .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Ejemplos : '.sub, .nfo' o 'sub,nfo'",
|
||||
"FailedDownloadHandling": "Manipulación de Descargas Fallidas",
|
||||
"FileDateHelpText": "Cambiar la fecha del archivo al importar/rescan",
|
||||
"FileManagement": "Administración de Archivos",
|
||||
@@ -154,7 +147,7 @@
|
||||
"GrabSelected": "Capturar Seleccionados",
|
||||
"HasPendingChangesNoChanges": "Sin Cambios",
|
||||
"HasPendingChangesSaveChanges": "Guardar Cambios",
|
||||
"History": "Historia",
|
||||
"History": "Historial",
|
||||
"Host": "Host",
|
||||
"Hostname": "Nombre del Host",
|
||||
"ICalFeed": "iCal Feed",
|
||||
@@ -210,7 +203,7 @@
|
||||
"MinimumLimits": "Límites Mínimos",
|
||||
"Missing": "Falta",
|
||||
"Mode": "Modo",
|
||||
"Monitored": "Monitoreada",
|
||||
"Monitored": "Monitorizado",
|
||||
"MoreInfo": "Más Información",
|
||||
"MustContain": "Debe Contener",
|
||||
"MustNotContain": "No Debe Contener",
|
||||
@@ -440,7 +433,7 @@
|
||||
"YesCancel": "Sí, Cancelar",
|
||||
"20MinutesTwenty": "20 Minutos: {0}",
|
||||
"DownloadClientCheckDownloadingToRoot": "El cliente de descargas {0} coloca las descargas en la carpeta raíz {1}. No debe descargar a una carpeta raíz.",
|
||||
"MaintenanceRelease": "Lanzamiento de mantenimiento",
|
||||
"MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle",
|
||||
"ReplaceIllegalCharactersHelpText": "Reemplazar caracteres ilegales. Si está desactivado, Radarr los eliminará si no",
|
||||
"Actions": "Acciones",
|
||||
"Today": "Hoy",
|
||||
@@ -462,7 +455,7 @@
|
||||
"Level": "Nivel",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de Radarr, no recibirás actualizaciones",
|
||||
"Blocklist": "Bloqueadas",
|
||||
"BlocklistRelease": "Bloquear este Estreno",
|
||||
"BlocklistRelease": "Lista de lanzamientos bloqueados",
|
||||
"CreateEmptyAuthorFolders": "Crear carpetas de películas vacías",
|
||||
"SelectAll": "Seleccionar Todas",
|
||||
"SelectedCountBooksSelectedInterp": "{0} Película(s) Seleccionada(s)",
|
||||
@@ -599,7 +592,6 @@
|
||||
"BypassIfHighestQuality": "Pasar sí es la calidad más alta",
|
||||
"CustomFormatScore": "Puntuación de Formato personalizado",
|
||||
"MinimumCustomFormatScore": "Puntuación mínima de formato personalizado",
|
||||
"CloneCustomFormat": "Clonar Formato Personalizado",
|
||||
"Conditions": "Condiciones",
|
||||
"CopyToClipboard": "Copiar al portapapeles",
|
||||
"CustomFormat": "Formatos Personalizados",
|
||||
@@ -617,7 +609,7 @@
|
||||
"ThemeHelpText": "Cambia el tema de la interfaz de usuario de la aplicación. El tema \"automático\" utilizará el tema de tu sistema operativo para establecer el modo claro u oscuro. Inspirado por Theme.Park",
|
||||
"CustomFormatSettings": "Ajustes de Formatos Propios",
|
||||
"CutoffFormatScoreHelpText": "Una vez alcanzada esta puntuación del formato propio Radarr dejará de descargar películas",
|
||||
"DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
|
||||
"DeleteCustomFormatMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
|
||||
"ExportCustomFormat": "Exportar Formato Personalizado",
|
||||
"ResetTitles": "Restablecer títulos",
|
||||
"UpgradesAllowed": "Mejoras permitidas",
|
||||
@@ -630,12 +622,11 @@
|
||||
"HideAdvanced": "Ocultar Avanzado",
|
||||
"ShowAdvanced": "Mostrar Avanzado",
|
||||
"ShownClickToHide": "Mostrado, clic para ocultar",
|
||||
"ColonReplacement": "Reemplazo dos puntos",
|
||||
"ReplaceWithDash": "Reemplazar con Dash",
|
||||
"ReplaceWithSpaceDash": "Reemplazar con Space Dash",
|
||||
"ReplaceWithSpaceDashSpace": "Reemplazar con Space Dash Space",
|
||||
"DeleteRemotePathMapping": "Editar Mapeo de Ruta Remota",
|
||||
"BlocklistReleases": "Bloquear este Estreno",
|
||||
"BlocklistReleases": "Lista de lanzamientos bloqueados",
|
||||
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
|
||||
"Negated": "Negado",
|
||||
"RemoveSelectedItem": "Eliminar el elemento seleccionado",
|
||||
@@ -649,21 +640,21 @@
|
||||
"BlocklistReleaseHelpText": "Evita que Radarr vuelva a capturar esta película automáticamente",
|
||||
"NoEventsFound": "No se encontraron eventos",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Cómo añadir etiquetas a las películas seleccionadas",
|
||||
"DeleteSelectedIndexersMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
|
||||
"DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?",
|
||||
"Yes": "Sí",
|
||||
"RedownloadFailed": "La descarga ha fallado",
|
||||
"RemoveCompleted": "Eliminación completada",
|
||||
"RemoveDownloadsAlert": "Los ajustes de eliminación se han trasladado a los ajustes individuales del cliente de descarga en la tabla anterior.",
|
||||
"RemoveFailed": "La eliminación falló",
|
||||
"ApplyTagsHelpTextAdd": "Añadir: Añadir a las etiquetas la lista existente de etiquetas",
|
||||
"ApplyTagsHelpTextAdd": "Añadir: Añadir las etiquetas la lista existente de etiquetas",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Cómo añadir etiquetas a los clientes de descargas seleccionados",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Cómo añadir etiquetas a las listas de importación seleccionadas",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Cómo añadir etiquetas a los indexadores seleccionados",
|
||||
"ApplyTagsHelpTextRemove": "Eliminar: Eliminar las etiquetas introducidas",
|
||||
"ApplyTagsHelpTextReplace": "Reemplazar: Reemplazar las etiquetas con las etiquetas introducidas (no introducir etiquetas para eliminar todas las etiquetas)",
|
||||
"DeleteSelectedDownloadClients": "Borrar Gestor de Descargas",
|
||||
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {0} cliente(s) de descarga seleccionado(s)?",
|
||||
"DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar el indexer '{0}'?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "¿Está seguro de querer eliminar {count} cliente(s) de descarga seleccionado(s)?",
|
||||
"DeleteSelectedImportListsMessageText": "Seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
|
||||
"DeleteSelectedIndexers": "Borrar Indexer",
|
||||
"DownloadClientTagHelpText": "Solo utilizar este indexador para películas que coincidan con al menos una etiqueta. Déjelo en blanco para utilizarlo con todas las películas.",
|
||||
"ExistingTag": "Etiqueta existente",
|
||||
@@ -705,7 +696,7 @@
|
||||
"TotalSpace": "Espacio Total",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.",
|
||||
"ManageImportLists": "Gestionar Listas de Importación",
|
||||
"ConnectionLostToBackend": "Radarr ha perdido su conexión con el backend y tendrá que ser recargado para recuperar su funcionalidad.",
|
||||
"ConnectionLostToBackend": "{appName} ha perdido su conexión con el backend y necesitará ser recargada para restaurar su funcionalidad.",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Las listas no están disponibles debido a errores",
|
||||
"ReleaseProfiles": "perfil de lanzamiento",
|
||||
@@ -723,7 +714,7 @@
|
||||
"NextExecution": "Siguiente ejecución",
|
||||
"NoResultsFound": "No se han encontrado resultados",
|
||||
"RecentChanges": "Cambios recientes",
|
||||
"WhatsNew": "¿Qué hay de nuevo?",
|
||||
"WhatsNew": "Que es lo nuevo?",
|
||||
"Loading": "Cargando",
|
||||
"Events": "Eventos",
|
||||
"Medium": "Medio",
|
||||
@@ -738,15 +729,15 @@
|
||||
"BookFilesCountMessage": "No hay archivos de libros",
|
||||
"AllowFingerprintingHelpText": "Utilizar la huella digital para mejorar la precisión de la coincidencia de libros",
|
||||
"BookStudio": "Estudio de libros",
|
||||
"AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no son compatibles directamente al usar el mecanismo de actualización de Docker. Deberás actualizar la imagen del contenedor fuera de {appName} o utilizar un script",
|
||||
"AutomaticUpdatesDisabledDocker": "Las actualizaciones automáticas no están soportadas directamente cuando se utiliza el mecanismo de actualización de Docker. Tendrá que actualizar la imagen del contenedor fuera de {appName} o utilizar un script",
|
||||
"AuthorIndex": "Índice de autor",
|
||||
"AudioFileMetadata": "Escribir metadatos en archivos de audio",
|
||||
"BookIndex": "Índice de libro",
|
||||
"BookEditor": "Editor de Libro",
|
||||
"ASIN": "ASIN",
|
||||
"AnyEditionOkHelpText": "Readarr cambiará automáticamente a la edición que mejor coincida con los archivos descargados",
|
||||
"AppUpdated": "{appName} Actualizado",
|
||||
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitaras recargar {appName}",
|
||||
"AppUpdated": "{appName} Actualizada",
|
||||
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes necesitará recargar {appName}",
|
||||
"AuthorFolderFormat": "Formato de Carpeta de Autor",
|
||||
"AuthorNameHelpText": "El nombre del autor/libro a excluir (puede ser cualquier cosa significativa)",
|
||||
"BookMonitoring": "Monitoreo de libros",
|
||||
@@ -754,5 +745,26 @@
|
||||
"BookFileCountBookCountTotalTotalBookCountInterp": "{0} / {1} (Total: {2})",
|
||||
"Book": "Libro",
|
||||
"AutomaticallySwitchEdition": "Cambiar edición automáticamente",
|
||||
"BookNaming": "Nombrado de libros"
|
||||
"BookNaming": "Nombrado de libros",
|
||||
"Books": "Libro",
|
||||
"NoHistoryBlocklist": "Sin lista de bloqueo de historial",
|
||||
"WouldYouLikeToRestoreBackup": "Te gustaria restaurar la copia de seguridad '{name}'?",
|
||||
"IsShowingMonitoredUnmonitorSelected": "Monitorizar Seleccionados",
|
||||
"CloneCustomFormat": "Clonar formato personalizado",
|
||||
"MinimumCustomFormatScoreHelpText": "Puntuación mínima de formato personalizado necesaria para evitar el retraso del protocolo preferido",
|
||||
"BypassIfAboveCustomFormatScore": "Omitir si está por encima de la puntuación del formato personalizado",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "Habilitar ignorar cuando la versión tenga una puntuación superior a la puntuación mínima configurada para el formato personalizado",
|
||||
"IsShowingMonitoredMonitorSelected": "Monitorizar Seleccionados",
|
||||
"ClientPriority": "Prioridad del Cliente",
|
||||
"ColonReplacement": "Reemplazar dos puntos",
|
||||
"CloneProfile": "Clonar Perfil",
|
||||
"Close": "Cerrar",
|
||||
"CloneIndexer": "Clonar Indexer",
|
||||
"CompletedDownloadHandling": "Manipulación de descargas completas",
|
||||
"EnableProfile": "Habilitar perfil",
|
||||
"ListsSettingsSummary": "lista de importación",
|
||||
"ExtraFileExtensionsHelpText": "Separar con cons la lista de los archivos extra a importar (.nfo será impotado como .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Ejemplos : '.sub, .nfo' o 'sub,nfo'",
|
||||
"ImportLists": "lista de importación",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} esta configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas del cliente antes que {1} las pueda importar."
|
||||
}
|
||||
|
||||
@@ -12,15 +12,15 @@
|
||||
"About": "Tietoja",
|
||||
"AddListExclusion": "Lisää tuontilistojen poikkeussääntö",
|
||||
"AddingTag": "Tunniste lisätään",
|
||||
"AgeWhenGrabbed": "Ikä (siepatessa)",
|
||||
"AgeWhenGrabbed": "Ikä (sieppaushetkellä)",
|
||||
"AlreadyInYourLibrary": "Elokuva on jo kirjastossasi",
|
||||
"AlternateTitles": "Vaihtoehtoiset nimet",
|
||||
"Analytics": "Analytiikka",
|
||||
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja sovelluksen palvelimille. Tämä sisältää tietoja selaimestasi, verkkokäyttöliittymän sivujen käytöstä, virheraportoinnista sekä käyttöjärjestelmästäsi ja versiosta. Käytämme näitä tietoja ominaisuuksien ja virhekorjauksien painotukseen.",
|
||||
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja palvelimillemme. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
|
||||
"AppDataDirectory": "AppData-kansio",
|
||||
"ApplyTags": "Tunnistetoimenpide",
|
||||
"Authentication": "Todennus",
|
||||
"AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana.",
|
||||
"AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana {appName}in käyttöön.",
|
||||
"AuthorClickToChangeBook": "Vaihda kirjaa painamalla",
|
||||
"AutoRedownloadFailedHelpText": "Etsi ja yritä ladata toinen julkaisu automaattisesti",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Levyltä poistettavien kirjojen valvonta lopetetaan automaattisesti.",
|
||||
@@ -30,7 +30,7 @@
|
||||
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat, automaattiset varmuuskopiot poistetaan automaattisesti.",
|
||||
"Backups": "Varmuuskopiointi",
|
||||
"BindAddress": "Sidososoite",
|
||||
"BindAddressHelpText": "Toimiva IPv4-osoite tai '*' (tähti) kaikille yhteyksille.",
|
||||
"BindAddressHelpText": "Toimiva IP-osoite, \"localhost\" tai \"*\" (tähti) kaikille verkkoliitännöille.",
|
||||
"BindAddressHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
|
||||
"BookIsDownloading": "Kirjaa ladataan",
|
||||
"BookIsDownloadingInterp": "Kirjaa ladataan - {0} % {1}",
|
||||
@@ -112,7 +112,7 @@
|
||||
"EnableAutomaticAdd": "Automaattilisäys",
|
||||
"EnableAutomaticSearch": "Automaattihaku",
|
||||
"EnableColorImpairedMode": "Heikentyneen värinäön tila",
|
||||
"EnableColorImpairedModeHelpText": "Muokattu tyyli käyttäjille, joiden värinäkö on heikentynyt. Auttaa erottamaan värikoodatun tiedon.",
|
||||
"EnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Tuo valmistuneet lataukset lataustyökalusta automaattisesti.",
|
||||
"EnableHelpText": "Luo tälle metatietotyypille metatietotiedostot.",
|
||||
"EnableInteractiveSearch": "Vuorovaikutteinen haku",
|
||||
@@ -123,8 +123,6 @@
|
||||
"ErrorLoadingContents": "Sisällönlatauksen virhe",
|
||||
"ErrorLoadingPreviews": "Virhe ladattaessa esikatselua",
|
||||
"Exception": "Poikkeus",
|
||||
"ExtraFileExtensionsHelpTexts1": "Pilkulla eroteltu lista tuotavista oheistiedostoista (.nfo tuodaan nimellä .nfo-orig).",
|
||||
"ExtraFileExtensionsHelpTexts2": "Esimerkkejä: '.sub, .nfo' tai 'sub, nfo'.",
|
||||
"FailedDownloadHandling": "Latauksen käsittely epäonnistui",
|
||||
"FileDateHelpText": "Muuta tiedoston päiväys tuonnin ja uudelleentarkistuksen yhteydessä.",
|
||||
"FileManagement": "Tiedostojen hallinta",
|
||||
@@ -142,7 +140,7 @@
|
||||
"Global": "Järjestelmänlaajuiset",
|
||||
"GoToInterp": "Siirry kohteeseen '{0}'",
|
||||
"Grab": "Sieppaa",
|
||||
"GrabID": "Sieppauksen ID",
|
||||
"GrabID": "Sieppaustunniste",
|
||||
"GrabRelease": "Sieppaa julkaisu",
|
||||
"GrabReleaseMessageText": "Readarr ei tunnistanut, mille kirjailijalle ja kirjalle tämä julkaisu kuuluu, eikä julkaisun automaattinen tuonti onnistu. Haluatko siepata julkaisun '{0}'?",
|
||||
"GrabSelected": "Sieppaa valitut",
|
||||
@@ -320,9 +318,9 @@
|
||||
"SearchSelected": "Haku valittu",
|
||||
"Security": "Suojaus",
|
||||
"SendAnonymousUsageData": "Lähetä nimettömiä käyttötietoja",
|
||||
"SetPermissions": "Aseta käyttöoikeudet",
|
||||
"SetPermissionsLinuxHelpText": "Pitäisikö chmod suorittaa, kun tiedostoja tuodaan / nimetään uudelleen?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Jos et ole varma näiden asetusten toiminnasta, älä muuta niitä.",
|
||||
"SetPermissions": "Määritä käyttöoikeudet",
|
||||
"SetPermissionsLinuxHelpText": "Tulisiko chmod suorittaa, kun tiedostoja tuodaan/nimetään uudelleen?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Jollet ole varma mitä nämä asetukset tekevät, älä muuta niitä.",
|
||||
"Settings": "Asetukset",
|
||||
"ShortDateFormat": "Lyhyt päivämäärämuoto",
|
||||
"ShowCutoffUnmetIconHelpText": "Näytä kuvake elokuville, joiden tiedostot eivät vastaa vielä määritettyä katkaisutasoa.",
|
||||
@@ -332,7 +330,7 @@
|
||||
"ShowQualityProfile": "Näytä laatuprofiili",
|
||||
"ShowQualityProfileHelpText": "Näytä laatuprofiili julisteen alla.",
|
||||
"ShowRelativeDates": "Näytä suhteutetut päiväykset",
|
||||
"ShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) tai absoluuttiset päiväykset.",
|
||||
"ShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan",
|
||||
"ShowSearch": "Näytä haku",
|
||||
"ShowSearchActionHelpText": "Näytä hakupainike osoitettaessa.",
|
||||
"ShowSizeOnDisk": "Näytä tiedostokoko",
|
||||
@@ -352,12 +350,12 @@
|
||||
"StartupDirectory": "Käynnistyskansio",
|
||||
"Status": "Tila",
|
||||
"StatusEndedEnded": "Päättynyt",
|
||||
"Style": "Ulkoasun tyyli",
|
||||
"Style": "Ulkoasu",
|
||||
"SuccessMyWorkIsDoneNoFilesToRename": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.",
|
||||
"SuccessMyWorkIsDoneNoFilesToRetag": "Menestys! Työni on valmis, ei nimettäviä tiedostoja.",
|
||||
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS-syötettä ei ole käytettävissä tälle tietolähteelle",
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Hakemistoa ei tueta tällä hakemistolla",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Profiilia käytetään automaattihaun yhteydessä, kun haku suoritetaan käyttöliittymästä tai Readarrin toimesta.",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai Readarrin toimesta.",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.",
|
||||
"Tags": "Tunnisteet",
|
||||
@@ -367,7 +365,7 @@
|
||||
"TestAllIndexers": "Testaa tietolähteet",
|
||||
"TestAllLists": "Testaa listat",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Tämä koskee kaikkia tietolähteitä. Noudata niiden asettamia sääntöjä.",
|
||||
"TimeFormat": "Kellonajan esitystapa",
|
||||
"TimeFormat": "Kellonajan esitys",
|
||||
"Title": "Nimike",
|
||||
"TorrentDelay": "Torrent-viive",
|
||||
"TorrentDelayHelpText": "Viive minuutteina ennen kuin torrentia siepataan.",
|
||||
@@ -469,7 +467,7 @@
|
||||
"ShowTitleHelpText": "Näytä kirjailijan nimi julisteen alla",
|
||||
"ShowUnknownAuthorItems": "Näytä 'Tuntemattomat kirjailijat' -kohde",
|
||||
"SkipBooksWithMissingReleaseDate": "Ohita kirjat, joilta puuttuu julkaisupäivä",
|
||||
"UrlBaseHelpText": "Lisää Calibren URL-osoitteeseen etuliitteen, (esim. 'http://[host]:[port]/[urlBase]').",
|
||||
"UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.",
|
||||
"Author": "Kirjailija",
|
||||
"BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.",
|
||||
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille kirjailijoille. Käytä kaikille jättämällä tyhjäksi.",
|
||||
@@ -539,7 +537,7 @@
|
||||
"CalibreNotCalibreWeb": "Readarr voi käyttää Calibren omaa sisältöpalvelinta, muttei täysin erillistä Calibre-Web-sovellusta.",
|
||||
"CalibreContentServer": "Calibre-sisältöpalvelin",
|
||||
"CalibreLibrary": "Calibre-kirjasto",
|
||||
"CalibreHost": "Calibren isäntä",
|
||||
"CalibreHost": "Calibre-palvelin",
|
||||
"CalibreMetadata": "Calibren metatiedot",
|
||||
"CalibreOutputFormat": "Calibren kohdemuoto",
|
||||
"CalibreOutputProfile": "Calibren kohdeprofiili",
|
||||
@@ -662,7 +660,7 @@
|
||||
"OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma",
|
||||
"OnRename": "Kun elokuva nimetään uudelleen",
|
||||
"OnUpgrade": "Kun elokuva päivitetään",
|
||||
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen '{0}' IP-osoitteen selvitys epäonnistui.",
|
||||
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.",
|
||||
"QualitySettingsSummary": "Laatumääritykset erilaisia sisältömuotoja ja tiedostokokoja varten.",
|
||||
"QueueIsEmpty": "Jono on tyhjä",
|
||||
"ReadarrSupportsAnyDownloadClient": "Monet torrent- ja Usenet-lataustyökalut ovat tuettuja.",
|
||||
@@ -775,7 +773,7 @@
|
||||
"OnApplicationUpdate": "Sovelluksen päivittyessä",
|
||||
"OnApplicationUpdateHelpText": "Sovelluksen päivittyessä",
|
||||
"Theme": "Teema",
|
||||
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan käyttöjärjestelmäsi teemaa vastaavaksi. Innoittanut Theme.Park.",
|
||||
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasu. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
|
||||
"EnableRssHelpText": "Käytetään etsittäessä julkaisuja RSS-syötteistä ajoitetusti.",
|
||||
"BypassIfHighestQuality": "Ohita, jos korkein laatu",
|
||||
"CustomFormatScore": "Mukautetun muodon pisteytys",
|
||||
@@ -826,7 +824,7 @@
|
||||
"ResetQualityDefinitions": "Palauta laatumääritykset",
|
||||
"ResetQualityDefinitionsMessageText": "Haluatko varmasti palauttaa laatumääritykset?",
|
||||
"NoEventsFound": "Tapahtumia ei löytynyt",
|
||||
"BlocklistReleaseHelpText": "Estää julkaisun automaattisen uudelleensieppauksen.",
|
||||
"BlocklistReleaseHelpText": "Estää {appName}ia sieppaamasta näitä tiedostoja automaattisesti uudelleen.",
|
||||
"RecycleBinUnableToWriteHealthCheck": "Määritettyyn roskakorikansioon ei voi tallentaa: {0}. Varmista, että sijainti on olemassa ja että käyttäjällä on kirjoitusoikeus kansioon.",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Tunnisteisiin kohdistettavat toimenpiteet:",
|
||||
"DeleteSelectedImportLists": "Poista tuontilista",
|
||||
@@ -853,7 +851,7 @@
|
||||
"RemoveCompleted": "Poista valmistuneet",
|
||||
"RemoveDownloadsAlert": "Poistoasetukset on siirretty yllä olevassa taulukossa yksittäisten lataustyökalujen alle.",
|
||||
"SetTags": "Tunnisteiden määritys",
|
||||
"ConnectionLostToBackend": "Radarr on menettänyt yhteyden taustajärjestelmään ja sivu on päivitettävä toiminnallisuuden palauttamiseksi.",
|
||||
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja käytettävyyden palauttamiseksi se on ladattava uudelleen.",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}",
|
||||
"System": "Järjestelmä",
|
||||
@@ -866,7 +864,7 @@
|
||||
"Events": "Tapahtumat",
|
||||
"FreeSpace": "Vapaa tila",
|
||||
"ConnectionLost": "Yhteys on katkennut",
|
||||
"ConnectionLostReconnect": "Radarr pyrkii muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".",
|
||||
"ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai sitä voidaan yrittää manuaalisesti painamalla alta \"Lataa uudelleen\".",
|
||||
"RecentChanges": "Viimeaikaiset muutokset",
|
||||
"WhatsNew": "Mikä on uutta?",
|
||||
"Large": "Suuri",
|
||||
@@ -879,5 +877,11 @@
|
||||
"Activity": "Tapahtumat",
|
||||
"AddNew": "Lisää uusi",
|
||||
"Backup": "Varmuuskopio",
|
||||
"NextExecution": "Seuraava suoritus"
|
||||
"NextExecution": "Seuraava suoritus",
|
||||
"AutomaticUpdatesDisabledDocker": "Suoraa automaattista päivitystä ei tueta käytettäessä Dockerin päivitysmekanismia. Joko Docker-säiliö on päivitettävä {appName}in ulkopuolella tai päivitys on suoritettava skriptillä.",
|
||||
"AppUpdated": "{appName} on päivitetty",
|
||||
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.",
|
||||
"Iso639-3": "ISO 639-3 -kielikoodit tai \"null\" (pilkuin eroteltuna)",
|
||||
"ExtraFileExtensionsHelpText": "Pilkulla eroteltu lista tuotavista oheistiedostoista (.nfo tuodaan nimellä .nfo-orig).",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Esimerkkejä: '.sub, .nfo' tai 'sub, nfo'."
|
||||
}
|
||||
|
||||
@@ -9,21 +9,21 @@
|
||||
"ApiKeyHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"Branch": "Branche",
|
||||
"Docker": "Docker",
|
||||
"DeleteRootFolderMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importer automatiquement les téléchargements terminés depuis le client de téléchargement",
|
||||
"DeleteRootFolderMessageText": "Êtes-vous sûr de vouloir supprimer le dossier racine « {name} » ?",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importer automatiquement les téléchargements terminés à partir du client de téléchargement",
|
||||
"EnableRSS": "Activer le RSS",
|
||||
"FileManagement": "Gestion de fichiers",
|
||||
"Host": "Hôte",
|
||||
"LoadingBooksFailed": "Le chargement des fichiers vidéo a échoué",
|
||||
"Logging": "Enregistrement",
|
||||
"Mode": "Mode",
|
||||
"ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si vous en avez besoin. Sinon, laissez-les vides.",
|
||||
"QualityProfiles": "Profils qualité",
|
||||
"ProxyUsernameHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.",
|
||||
"QualityProfiles": "Profils de qualité",
|
||||
"Security": "Sécurité",
|
||||
"SslPortHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"SslCertPathHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"UnableToLoadMetadataProfiles": "Impossible de charger les profils de délai",
|
||||
"AddingTag": "Ajouter un tag",
|
||||
"AddingTag": "Ajout d'une étiquette",
|
||||
"AgeWhenGrabbed": "Âge (au moment de la saisie)",
|
||||
"AlreadyInYourLibrary": "Déjà dans la bibliothèque",
|
||||
"AlternateTitles": "Titres alternatifs",
|
||||
@@ -31,19 +31,19 @@
|
||||
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Readarr. Cela inclut des informations sur votre navigateur, quelle page de l'interface web Readarr vous utilisez, les rapports d'erreur ainsi que le SE et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.",
|
||||
"AnalyticsEnabledHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"AppDataDirectory": "Dossier AppData",
|
||||
"ApplyTags": "Appliquer les tags",
|
||||
"ApplyTags": "Appliquer les étiquettes",
|
||||
"Authentication": "Authentification",
|
||||
"AuthenticationMethodHelpText": "Exiger un identifiant et un mot de passe pour accéder à Readarr",
|
||||
"AuthenticationMethodHelpText": "Exiger un nom d'utilisateur et un mot de passe pour accéder à Readarr",
|
||||
"AuthorClickToChangeBook": "Cliquer pour changer le livre",
|
||||
"AutoRedownloadFailedHelpText": "Recherche automatique et tentative de téléchargement d'une version différente",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Les livres qui sont effacés du disque dur sont automatiquement non-surveillés dans Readarr",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Les livres effacés du disque dur ne seront plus surveillés dans Readarr",
|
||||
"Automatic": "Automatique",
|
||||
"BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de Readarr",
|
||||
"BackupNow": "Sauvegarder maintenant",
|
||||
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de rétention seront nettoyées automatiquement",
|
||||
"Backups": "Sauvegardes",
|
||||
"BindAddress": "Adresse de liaison",
|
||||
"BindAddressHelpText": "Adresse IP valide, localhost ou '*' pour toutes les interfaces",
|
||||
"BindAddressHelpText": "Adresse IP valide, localhost ou « * » pour toutes les interfaces",
|
||||
"BookIsDownloading": "Le livre est en cours de téléchargement",
|
||||
"BookIsDownloadingInterp": "Le livre est en cours de téléchargement - {0}% {1}",
|
||||
"BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales",
|
||||
@@ -67,7 +67,7 @@
|
||||
"CloneProfile": "Dupliqué le profil",
|
||||
"Close": "Fermer",
|
||||
"Columns": "Colonnes",
|
||||
"CompletedDownloadHandling": "Gestion des téléchargements terminés",
|
||||
"CompletedDownloadHandling": "Traitement du téléchargement terminé",
|
||||
"ConnectSettings": "Paramètres de connexion",
|
||||
"Connections": "Connexions",
|
||||
"CopyUsingHardlinksHelpText": "Les liens physiques permettent à Readarr d'importer des torrents en cours de partage sans utiliser d'espace disque supplémentaire et sans avoir à copier le contenu du fichier. Les liens physiques ne fonctionnent que si la source et la destination sont sur le même volume",
|
||||
@@ -75,56 +75,56 @@
|
||||
"CreateEmptyAuthorFoldersHelpText": "Créer les dossiers auteurs manquants pendant le scan du disque",
|
||||
"CreateGroup": "Créer un groupe",
|
||||
"CutoffHelpText": "Quand cette qualité est atteinte, Readarr ne téléchargera plus de livres",
|
||||
"CutoffUnmet": "Limite non satisfaite",
|
||||
"CutoffUnmet": "Seuil non atteint",
|
||||
"DBMigration": "Migration de la base de données",
|
||||
"Dates": "Dates",
|
||||
"DelayProfile": "Profil de delai",
|
||||
"DelayProfile": "Profil de retard",
|
||||
"DelayProfiles": "Profils de retard",
|
||||
"DelayingDownloadUntilInterp": "Retarder le téléchargement jusqu'au {0} à {1}",
|
||||
"Delete": "Supprimer",
|
||||
"DeleteBackup": "Supprimer la sauvegarde",
|
||||
"DeleteBackupMessageText": "Êtes-vous sûr de vouloir supprimer la sauvegarde '{0}' ?",
|
||||
"DeleteDelayProfile": "Supprimer le profil de délai",
|
||||
"DeleteDelayProfileMessageText": "Êtes vous sûr de vouloir effacer ce profil de délai ?",
|
||||
"DeleteBackupMessageText": "Voulez-vous supprimer la sauvegarde « {name} » ?",
|
||||
"DeleteDelayProfile": "Supprimer le profil de retard",
|
||||
"DeleteDelayProfileMessageText": "Êtes-vous sûr de vouloir supprimer ce profil de retard ?",
|
||||
"DeleteDownloadClient": "Supprimer le client de téléchargement",
|
||||
"DeleteDownloadClientMessageText": "Êtes-vous sûr de vouloir supprimer le client de téléchargement '{0}' ?",
|
||||
"DeleteDownloadClientMessageText": "Voulez-vous supprimer le client de téléchargement « {name} » ?",
|
||||
"DeleteEmptyFolders": "Supprimer les dossiers vides",
|
||||
"DeleteEmptyFoldersHelpText": "Supprimer les dossiers auteurs vides pendant le scan du disque dur et quand les fichiers de livres sont supprimés",
|
||||
"DeleteImportListExclusion": "Supprimer les exclusions de liste d'imports",
|
||||
"DeleteImportListExclusionMessageText": "Êtes vous sûr de vouloir effacer cette exclusion de liste d'imports ?",
|
||||
"DeleteImportListMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?",
|
||||
"DeleteImportListExclusion": "Supprimer l'exclusion de la liste d'importation",
|
||||
"DeleteImportListExclusionMessageText": "Êtes-vous sûr de vouloir supprimer cette exclusion de la liste d'importation ?",
|
||||
"DeleteImportListMessageText": "Êtes-vous sûr de vouloir supprimer cette exclusion de la liste d'importation ?",
|
||||
"DeleteIndexer": "Supprimer l'indexeur",
|
||||
"DeleteIndexerMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
|
||||
"DeleteMetadataProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?",
|
||||
"DeleteIndexerMessageText": "Voulez-vous vraiment supprimer l'indexeur « {name} » ?",
|
||||
"DeleteMetadataProfileMessageText": "Êtes-vous sûr de vouloir supprimer le profil de métadonnées « {name} » ?",
|
||||
"DeleteNotification": "Supprimer la notification",
|
||||
"DeleteNotificationMessageText": "Êtes-vous sûr de vouloir supprimer la notification '{0}' ?",
|
||||
"DeleteQualityProfile": "Supprimer le profil qualité",
|
||||
"DeleteQualityProfileMessageText": "Voulez-vous vraiment supprimer le profil de qualité {0} ?",
|
||||
"DeleteNotificationMessageText": "Voulez-vous supprimer la notification « {name} » ?",
|
||||
"DeleteQualityProfile": "Supprimer le profil de qualité",
|
||||
"DeleteQualityProfileMessageText": "Êtes-vous sûr de vouloir supprimer le profil de qualité « {name} » ?",
|
||||
"DeleteReleaseProfile": "Supprimer le profil de version",
|
||||
"DeleteReleaseProfileMessageText": "Êtes vous sûr de vouloir effacer ce profil de version ?",
|
||||
"DeleteSelectedBookFiles": "Supprimer les fichiers de livres sélectionnés",
|
||||
"DeleteSelectedBookFilesMessageText": "Voulez-vous vraiment supprimer les fichiers vidéo sélectionnés ?",
|
||||
"DeleteTag": "Supprimer le tag",
|
||||
"DeleteTagMessageText": "Voulez-vous vraiment supprimer la balise '{0}' ?",
|
||||
"DestinationPath": "Chemin de Destination",
|
||||
"DestinationPath": "Chemin de destination",
|
||||
"DetailedProgressBar": "Barre de progression détaillée",
|
||||
"DetailedProgressBarHelpText": "Afficher le texte sur la barre de progression",
|
||||
"DiskSpace": "Espace disque",
|
||||
"DownloadClient": "Client de Téléchargement",
|
||||
"DownloadClientSettings": "Réglages Clients de téléchargement",
|
||||
"DownloadClients": "Clients téléchargement",
|
||||
"DownloadClient": "Client de téléchargement",
|
||||
"DownloadClientSettings": "Télécharger les paramètres client",
|
||||
"DownloadClients": "Clients de téléchargement",
|
||||
"DownloadFailedCheckDownloadClientForMoreDetails": "Téléchargement échoué : voir le client de téléchargement pour plus de détails",
|
||||
"DownloadFailedInterp": "Échec du téléchargement : {0}",
|
||||
"DownloadPropersAndRepacksHelpTexts1": "S'il faut ou non mettre à niveau automatiquement vers Propres/Repacks",
|
||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Avertissement téléchargement : voir le client de téléchargement pour plus de détails",
|
||||
"Edit": "Éditer",
|
||||
"Edit": "Modifier",
|
||||
"Edition": "Édition",
|
||||
"Enable": "Activer",
|
||||
"EnableAutomaticAdd": "Activer l'ajout automatique",
|
||||
"EnableAutomaticSearch": "Activer la recherche automatique",
|
||||
"EnableColorImpairedMode": "Activer le mode daltonien",
|
||||
"EnableColorImpairedModeHelpText": "Style modifié pour permettre aux utilisateurs daltoniens de distinguer les codes couleurs",
|
||||
"EnableHelpText": "Activer la création d'un fichier de métadonnées pour ce type de métadonnée",
|
||||
"EnableColorImpairedMode": "Activer le mode de couleurs altérées",
|
||||
"EnableColorImpairedModeHelpText": "Style modifié pour permettre aux utilisateurs ayant des difficultés de couleur de mieux distinguer les informations codées par couleur",
|
||||
"EnableHelpText": "Activer la création de fichiers de métadonnées pour ce type de métadonnées",
|
||||
"EnableInteractiveSearch": "Activer la recherche interactive",
|
||||
"EnableSSL": "Activer le SSL",
|
||||
"EnableSslHelpText": " Nécessite un redémarrage en tant qu'administrateur pour être effectif",
|
||||
@@ -132,50 +132,48 @@
|
||||
"ErrorLoadingContents": "Erreur lors du chargement du contenu",
|
||||
"ErrorLoadingPreviews": "Erreur lors du chargement des aperçus",
|
||||
"Exception": "Exception",
|
||||
"ExtraFileExtensionsHelpTexts1": "Liste séparée par des virgules des fichiers supplémentaires à importer (.nfo sera importé en tant que .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Exemples : '.sub, .nfo' ou 'sub,nfo'",
|
||||
"FailedDownloadHandling": "Gestion des échecs de téléchargement",
|
||||
"FileDateHelpText": "Changer la date du fichier lors de l'import/re-scan",
|
||||
"FileNames": "Noms de fichier",
|
||||
"Filename": "Nom de fichier",
|
||||
"Files": "Fichiers",
|
||||
"FirstDayOfWeek": "Premier jour de la semaine",
|
||||
"Fixed": "Corrigé",
|
||||
"Fixed": "Corrigés",
|
||||
"Folder": "Dossier",
|
||||
"Folders": "Dossiers",
|
||||
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Pour plus d'informations sur les clients de téléchargement individuels, cliquez sur les boutons d'information.",
|
||||
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Pour plus d'informations sur les indexeurs individuels, cliquez sur les boutons info.",
|
||||
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Pour plus d'informations sur les listes d'importation individuelles, cliquez sur les boutons d'information.",
|
||||
"GeneralSettings": "Réglages Généraux",
|
||||
"GeneralSettings": "Réglages généraux",
|
||||
"Global": "Global",
|
||||
"GoToInterp": "Aller à {0}",
|
||||
"Grab": "Télécharger",
|
||||
"Grab": "Saisir",
|
||||
"GrabID": "ID du grab",
|
||||
"GrabRelease": "Télécharger la version",
|
||||
"GrabRelease": "Saisir Release",
|
||||
"GrabReleaseMessageText": "Readarr n'a pas été en mesure de déterminer à quel auteur et livre correspondait cette version. Readarr peut être incapable d'importer automatiquement cette version. Voulez-vous récupérer '{0}' ?",
|
||||
"GrabSelected": "Saisir la sélection",
|
||||
"Group": "Groupe",
|
||||
"HasPendingChangesNoChanges": "Aucun changement",
|
||||
"HasPendingChangesNoChanges": "Aucune modification",
|
||||
"HasPendingChangesSaveChanges": "Sauvegarder les modifications",
|
||||
"History": "Historique",
|
||||
"Hostname": "Nom d'hôte",
|
||||
"ICalFeed": "Flux iCal",
|
||||
"ICalHttpUrlHelpText": "Copiez cette URL dans votre client ou cliquez pour souscrire si votre navigateur est compatible avec webcal",
|
||||
"ICalHttpUrlHelpText": "Copiez cette URL dans votre/vos client(s) ou cliquez pour abonner si votre navigateur est compatible avec webcal",
|
||||
"ICalLink": "Lien iCal",
|
||||
"IconForCutoffUnmet": "Icône pour limite non atteinte",
|
||||
"IconForCutoffUnmet": "Icône pour la date limite non respectée",
|
||||
"IconTooltip": "Programmé",
|
||||
"IgnoredAddresses": "Adresses ignorées",
|
||||
"IgnoredHelpText": "La version sera rejetée si elle contient au moins l'un de ces termes (insensible à la casse)",
|
||||
"IgnoredPlaceHolder": "Ajouter une nouvelle restriction",
|
||||
"IllRestartLater": "Je redémarrerai plus tard",
|
||||
"ImportExtraFiles": "Importer les fichiers extra",
|
||||
"ImportExtraFiles": "Importer des fichiers supplémentaires",
|
||||
"ImportExtraFilesHelpText": "Importer les fichiers extra correspondants (sous-titres, .nfo etc.) après avoir importé un fichier de livre",
|
||||
"ImportFailedInterp": "Importation a échoué : {0}",
|
||||
"ImportedTo": "Importé vers",
|
||||
"Importing": "Importation",
|
||||
"IncludeHealthWarningsHelpText": "Inclure avertissements santé",
|
||||
"IncludeUnknownAuthorItemsHelpText": "Afficher les éléments sans auteur dans la file d'attente. Cela peut inclure des auteurs, livres ou autres éléments supprimés de la catégorie de Readarr",
|
||||
"IncludeUnmonitored": "Inclure non surveillé",
|
||||
"IncludeUnmonitored": "Inclure les non surveillés",
|
||||
"Indexer": "Indexeur",
|
||||
"IndexerPriority": "Priorité de l'indexeur",
|
||||
"IndexerSettings": "Paramètres de l'indexeur",
|
||||
@@ -187,26 +185,26 @@
|
||||
"Language": "Langue",
|
||||
"LaunchBrowserHelpText": " Ouvrir un navigateur Web et accéder à la page d'accueil de Readarr au démarrage de l'application.",
|
||||
"LoadingBookFilesFailed": "Le chargement des fichiers vidéo a échoué",
|
||||
"Local": "Local",
|
||||
"LogFiles": "Fichiers Log",
|
||||
"LogLevel": "Niveau du journal",
|
||||
"Local": "Locale",
|
||||
"LogFiles": "Fichiers journaux",
|
||||
"LogLevel": "Niveau de journalisation",
|
||||
"LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "La journalisation des traces ne doit être activée que temporairement",
|
||||
"Logs": "Journaux",
|
||||
"LongDateFormat": "Format de date long",
|
||||
"LongDateFormat": "Format de date longue",
|
||||
"MIA": "MIA",
|
||||
"ManualImport": "Importation manuelle",
|
||||
"MarkAsFailed": "Marquer comme échoué",
|
||||
"MarkAsFailed": "Marquer comme échec",
|
||||
"MarkAsFailedMessageText": "Voulez-vous vraiment marquer '{0}' comme échoué ?",
|
||||
"MaximumLimits": "Limites maximales",
|
||||
"MaximumSize": "Taille maximum",
|
||||
"MaximumSizeHelpText": "Taille maximale d'une version à saisir en Mo. Mettre à zéro pour définir sur illimité",
|
||||
"MaximumSizeHelpText": "Taille maximale d'une release à récupérer en Mo. Mettre à zéro pour définir sur illimité.",
|
||||
"Mechanism": "Mécanisme",
|
||||
"MediaInfo": "Média Info",
|
||||
"MediaInfo": "Informations médias",
|
||||
"MediaManagementSettings": "Paramètres de gestion des médias",
|
||||
"Message": "Message",
|
||||
"MetadataSettings": "Paramètres métadonnées",
|
||||
"MetadataSettings": "Paramètres des métadonnées",
|
||||
"MinimumAge": "Âge minimum",
|
||||
"MinimumAgeHelpText": "Usenet uniquement: âge minimum en minutes des NZB avant qu'ils ne soient saisis. Utiliser ceci pour donner aux nouvelles versions le temps de se propager à votre fournisseur usenet.",
|
||||
"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.",
|
||||
"MinimumFreeSpace": "Espace libre minimum",
|
||||
"MinimumFreeSpaceWhenImportingHelpText": "Empêcher l'importation si elle laisse moins d'espace disque disponible que cette quantité",
|
||||
"MinimumLimits": "Limites minimales",
|
||||
@@ -216,17 +214,17 @@
|
||||
"MustContain": "Doit contenir",
|
||||
"MustNotContain": "Ne doit pas contenir",
|
||||
"Name": "Nom",
|
||||
"NamingSettings": "Paramètres dénomination",
|
||||
"NamingSettings": "Paramètres de dénomination",
|
||||
"New": "Nouveau",
|
||||
"NoBackupsAreAvailable": "Aucune sauvegarde n'est disponible",
|
||||
"NoHistory": "Pas d'historique",
|
||||
"NoLeaveIt": "Non, laisse-le",
|
||||
"NoLimitForAnyRuntime": "Aucune limite pour aucune durée",
|
||||
"NoHistory": "Aucun historique.",
|
||||
"NoLeaveIt": "Non, laisse tomber",
|
||||
"NoLimitForAnyRuntime": "Aucune limite pour aucune durée d'exécution",
|
||||
"NoLogFiles": "Aucun fichier journal",
|
||||
"NoMinimumForAnyRuntime": "Aucun minimum pour n'importe quel durée",
|
||||
"NoMinimumForAnyRuntime": "Aucun minimum pour aucune durée d'exécution",
|
||||
"NoUpdatesAreAvailable": "Aucune mise à jour n'est disponible",
|
||||
"None": "Aucun",
|
||||
"NotificationTriggers": "Déclencheurs de notification",
|
||||
"NotificationTriggers": "Déclencheurs de notifications",
|
||||
"OnGrabHelpText": "À la Récupération",
|
||||
"OnHealthIssueHelpText": "Lors d'un problème de santé",
|
||||
"OnRenameHelpText": "Lors du changement de nom",
|
||||
@@ -235,35 +233,35 @@
|
||||
"Options": "Options",
|
||||
"Original": "Original",
|
||||
"Overview": "Aperçu",
|
||||
"PackageVersion": "Version du package",
|
||||
"PackageVersion": "Version du paquet",
|
||||
"PageSize": "Pagination",
|
||||
"PageSizeHelpText": "Nombre d'éléments à afficher sur chaque page",
|
||||
"Password": "Mot de passe",
|
||||
"Path": "Chemin",
|
||||
"Permissions": "Autorisations",
|
||||
"Permissions": "Permissions",
|
||||
"Port": "Port",
|
||||
"PortHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"PortNumber": "Numéro de port",
|
||||
"PosterSize": "Taille des posters",
|
||||
"PreviewRename": "Aperçu Renommage",
|
||||
"PosterSize": "Poster taille",
|
||||
"PreviewRename": "Aperçu Renommer",
|
||||
"Profiles": "Profils",
|
||||
"Proper": "Proper",
|
||||
"Proper": "Approprié",
|
||||
"PropersAndRepacks": "Propres et Repacks",
|
||||
"Protocol": "Protocole",
|
||||
"ProtocolHelpText": "Choisissez le(s) protocole(s) à utiliser et celui qui est préféré lors du choix entre des versions par ailleurs égales",
|
||||
"ProtocolHelpText": "Choisissez quel(s) protocole(s) utiliser et lequel est préféré lorsque vous choisissez entre des versions par ailleurs égales",
|
||||
"Proxy": "Proxy",
|
||||
"ProxyBypassFilterHelpText": "Utiliser ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines",
|
||||
"ProxyPasswordHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si vous en avez besoin. Sinon, laissez-les vides.",
|
||||
"ProxyType": "Type de proxy",
|
||||
"ProxyBypassFilterHelpText": "Utilisez ',' comme séparateur et '*.' comme caractère générique pour les sous-domaines",
|
||||
"ProxyPasswordHelpText": "Il vous suffit de saisir un nom d'utilisateur et un mot de passe si nécessaire. Sinon, laissez-les vides.",
|
||||
"ProxyType": "Type de mandataire",
|
||||
"PublishedDate": "Date de publication",
|
||||
"Quality": "Qualité",
|
||||
"QualityDefinitions": "Définitions qualité",
|
||||
"QualityDefinitions": "Définitions de la qualité",
|
||||
"QualityProfile": "Profil de qualité",
|
||||
"QualitySettings": "Paramètres Qualité",
|
||||
"QualitySettings": "Paramètres de qualité",
|
||||
"Queue": "File d'attente",
|
||||
"RSSSync": "Synchro RSS",
|
||||
"RSSSyncInterval": "Intervalle de synchronisation RSS",
|
||||
"ReadTheWikiForMoreInformation": "Consultez le Wiki pour plus d'informations",
|
||||
"ReadTheWikiForMoreInformation": "Lisez le wiki pour plus d'informations",
|
||||
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Readarr prend en charge tout indexeur qui utilise le standard Newznab, ainsi que d'autres indexeurs répertoriés ci-dessous.",
|
||||
"ReadarrTags": "Readarr Tags",
|
||||
"Real": "Réel",
|
||||
@@ -271,14 +269,14 @@
|
||||
"RecycleBinCleanupDaysHelpText": "Définir sur 0 pour désactiver le nettoyage automatique",
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "Les fichiers dans la corbeille plus anciens que le nombre de jours sélectionné seront nettoyés automatiquement",
|
||||
"RecycleBinHelpText": "Les fichiers vidéo iront ici lorsqu'ils seront supprimés au lieu d'être supprimés définitivement",
|
||||
"RecyclingBin": "Corbeille",
|
||||
"RecyclingBinCleanup": "Nettoyage de la Corbeille",
|
||||
"RecyclingBin": "Poubelle de recyclage",
|
||||
"RecyclingBinCleanup": "Nettoyage du bac de recyclage",
|
||||
"Redownload": "Télécharger à nouveau",
|
||||
"Refresh": "Actualiser",
|
||||
"Refresh": "Rafraîchir",
|
||||
"RefreshInformationAndScanDisk": "Actualiser les informations et analyser le disque",
|
||||
"ReleaseDate": "Date de sortie",
|
||||
"ReleaseGroup": "Groupe de versions",
|
||||
"ReleaseRejected": "Version rejetée",
|
||||
"ReleaseRejected": "Libération rejetée",
|
||||
"ReleaseWillBeProcessedInterp": "La Version sera traitée {0}",
|
||||
"Reload": "Recharger",
|
||||
"RemotePathMappings": "Mappages de chemins distants",
|
||||
@@ -289,7 +287,7 @@
|
||||
"RemoveFromDownloadClient": "Supprimer du client de téléchargement",
|
||||
"RemoveFromQueue": "Supprimer de la file d'attente",
|
||||
"RemoveHelpTextWarning": "La suppression supprimera le téléchargement et le(s) fichier(s) du client de téléchargement.",
|
||||
"RemoveSelected": "Supprimer la sélection",
|
||||
"RemoveSelected": "Enlever la sélection",
|
||||
"RemoveTagExistingTag": "Tag existant",
|
||||
"RemoveTagRemovingTag": "Suppression du tag",
|
||||
"RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches",
|
||||
@@ -310,37 +308,37 @@
|
||||
"RestoreBackup": "Restaurer la sauvegarde",
|
||||
"Result": "Résultat",
|
||||
"Retention": "Rétention",
|
||||
"RetentionHelpText": "Usenet uniquement: définir sur zéro pour une rétention illimitée",
|
||||
"RetentionHelpText": "Usenet uniquement : définissez-le sur zéro pour définir une rétention illimitée",
|
||||
"RetryingDownloadInterp": "Nouvelle tentative de téléchargement {0} à {1}",
|
||||
"RootFolder": "Dossier racine",
|
||||
"RootFolders": "Dossiers racine",
|
||||
"RssSyncIntervalHelpText": "Intervalle en minutes. Mettre à zéro pour désactiver (cela arrêtera tous les téléchargements automatiques)",
|
||||
"RssSyncIntervalHelpText": "Intervalle en minutes. Réglez sur zéro pour désactiver (cela arrêtera toute capture de libération automatique)",
|
||||
"SSLCertPassword": "Mot de passe du certificat SSL",
|
||||
"SSLCertPath": "Chemin du certificat SSL",
|
||||
"SSLPort": "Port SSL",
|
||||
"Scheduled": "Programmé",
|
||||
"ScriptPath": "Chemin du script",
|
||||
"Search": "Rechercher",
|
||||
"SearchAll": "Rechercher tout",
|
||||
"SearchForMissing": "Recherche les manquants",
|
||||
"SearchSelected": "Recherche sélectionnée",
|
||||
"SearchAll": "Tout rechercher",
|
||||
"SearchForMissing": "Recherche des manquants",
|
||||
"SearchSelected": "Rechercher la sélection",
|
||||
"SendAnonymousUsageData": "Envoyer des données d'utilisation anonymes",
|
||||
"SetPermissions": "Définir les autorisations",
|
||||
"SetPermissionsLinuxHelpText": "Chmod doit-il être exécuté lorsque les fichiers sont importés/renommés?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Si vous ne savez pas ce que font ces paramètres, ne les modifiez pas.",
|
||||
"SetPermissionsLinuxHelpText": "Chmod doit-il être exécuté lorsque les fichiers sont importés/renommés ?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Si vous n'êtes pas sûr de l'utilité de ces paramètres, ne les modifiez pas.",
|
||||
"Settings": "Paramètres",
|
||||
"ShortDateFormat": "Format de date court",
|
||||
"ShortDateFormat": "Format de date courte",
|
||||
"ShowCutoffUnmetIconHelpText": "Afficher l'icône des fichiers lorsque la limite n'a pas été atteinte",
|
||||
"ShowDateAdded": "Afficher la date d'ajout",
|
||||
"ShowMonitored": "Afficher les éléments surveillés",
|
||||
"ShowMonitoredHelpText": "Afficher le statut surveillé sous l'affiche",
|
||||
"ShowMonitored": "Afficher le chemin",
|
||||
"ShowMonitoredHelpText": "Afficher l'état de surveillance sous le poster",
|
||||
"ShowPath": "Afficher le chemin",
|
||||
"ShowQualityProfile": "Afficher le profil de qualité",
|
||||
"ShowQualityProfileHelpText": "Afficher le profil de qualité sous l'affiche",
|
||||
"ShowRelativeDates": "Afficher les dates relatives",
|
||||
"ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/ Hier/ etc) ou absolues",
|
||||
"ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/Hier/etc) ou absolues",
|
||||
"ShowSearch": "Afficher la recherche",
|
||||
"ShowSearchActionHelpText": "Afficher le bouton de recherche au survol de la souris",
|
||||
"ShowSearchActionHelpText": "Afficher le bouton de recherche au survol du curseur",
|
||||
"ShowSizeOnDisk": "Afficher la taille sur le disque",
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Affiché au dessus de chaque colonne quand \"Semaine\" est l'affichage actif",
|
||||
"Size": " Taille",
|
||||
@@ -352,11 +350,11 @@
|
||||
"SourcePath": "Chemin source",
|
||||
"SslCertPasswordHelpText": "Mot de passe pour le fichier pfx",
|
||||
"SslCertPasswordHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"SslCertPathHelpText": "Chemin vers le fichier pfx",
|
||||
"SslCertPathHelpText": "Chemin d'accès au fichier pfx",
|
||||
"StandardBookFormat": "Format de livre standard",
|
||||
"StartTypingOrSelectAPathBelow": "Commencer à taper ou sélectionner un chemin ci-dessous",
|
||||
"StartTypingOrSelectAPathBelow": "Commencer à écrire ou sélectionner un chemin ci-dessous",
|
||||
"StartupDirectory": "Répertoire de démarrage",
|
||||
"Status": "Statut",
|
||||
"Status": "État",
|
||||
"StatusEndedEnded": "Terminé",
|
||||
"Style": "Style",
|
||||
"SuccessMyWorkIsDoneNoFilesToRename": "Victoire ! Mon travail est terminé, aucun fichier à renommer.",
|
||||
@@ -365,21 +363,21 @@
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "La recherche n'est pas prise en charge avec cet indexeur",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Sera utilisé lorsque les recherches automatiques sont effectuées via l'interface utilisateur ou par Readarr",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Sera utilisé lorsque la recherche interactive est utilisée",
|
||||
"TagIsNotUsedAndCanBeDeleted": "La balise n'est pas utilisée et peut être supprimée",
|
||||
"TagIsNotUsedAndCanBeDeleted": "L'étiquette n'est pas utilisée et peut être supprimée",
|
||||
"Tags": "Tags",
|
||||
"Tasks": "Tâches",
|
||||
"TestAll": "Tout tester",
|
||||
"TestAllClients": "Tester tous les clients",
|
||||
"TestAllIndexers": "Tester tous les indexeurs",
|
||||
"TestAllIndexers": "Testez tous les indexeurs",
|
||||
"TestAllLists": "Tester toutes les listes",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Cela s'appliquera à tous les indexeurs, veuillez suivre les règles définies par eux",
|
||||
"TimeFormat": "Format de l'heure",
|
||||
"Title": "Titre",
|
||||
"TorrentDelay": "Torrent Délai",
|
||||
"TorrentDelayHelpText": "Délia en minutes avant de récupérer un torrent",
|
||||
"TorrentDelay": "Retard du torrent",
|
||||
"TorrentDelayHelpText": "Délai en minutes avant de récupérer un torrent",
|
||||
"Torrents": "Torrents",
|
||||
"TotalFileSize": "Taille totale du fichier",
|
||||
"UILanguage": "UI Langue",
|
||||
"TotalFileSize": "Taille totale des fichiers",
|
||||
"UILanguage": "Langue de l'IU",
|
||||
"UILanguageHelpText": "Langue que Readarr utilisera pour l'interface utilisateur",
|
||||
"UILanguageHelpTextWarning": "Rechargement du navigateur requis",
|
||||
"UISettings": "Paramètres UI",
|
||||
@@ -394,11 +392,11 @@
|
||||
"UnableToAddANewRemotePathMappingPleaseTryAgain": "Impossible d'ajouter un nouveau mappage de chemin distant, veuillez réessayer.",
|
||||
"UnableToAddANewRootFolderPleaseTryAgain": "Impossible d'ajouter un nouveau format personnalisé, veuillez réessayer.",
|
||||
"UnableToLoadBackups": "Impossible de charger les sauvegardes",
|
||||
"UnableToLoadDelayProfiles": "Impossible de charger les profils de délai",
|
||||
"UnableToLoadDelayProfiles": "Impossible de charger les profils de retard",
|
||||
"UnableToLoadDownloadClientOptions": "Impossible de charger les options du client de téléchargement",
|
||||
"UnableToLoadDownloadClients": "Impossible de charger les clients de téléchargement",
|
||||
"UnableToLoadGeneralSettings": "Impossible de charger les paramètres généraux",
|
||||
"UnableToLoadHistory": "Impossible de charger l'historique",
|
||||
"UnableToLoadHistory": "Impossible de charger l'historique.",
|
||||
"UnableToLoadImportListExclusions": "Impossible de charger les exclusions de liste",
|
||||
"UnableToLoadIndexerOptions": "Impossible de charger les options de l'indexeur",
|
||||
"UnableToLoadIndexers": "Impossible de charger les indexeurs",
|
||||
@@ -413,35 +411,35 @@
|
||||
"UnableToLoadReleaseProfiles": "Impossible de charger les profils de délai",
|
||||
"UnableToLoadRemotePathMappings": "Impossible de charger les mappages de chemins distants",
|
||||
"UnableToLoadRootFolders": "Impossible de charger les dossiers racine",
|
||||
"UnableToLoadTags": "Impossible de charger les balises",
|
||||
"UnableToLoadTags": "Impossible de charger les étiquettes",
|
||||
"UnableToLoadTheCalendar": "Impossible de charger le calendrier",
|
||||
"UnableToLoadUISettings": "Impossible de charger les paramètres de l'interface utilisateur",
|
||||
"Ungroup": "Dissocier",
|
||||
"Unmonitored": "Non surveillé",
|
||||
"UnmonitoredHelpText": "Inclure les livres non surveillés dans le flux iCal",
|
||||
"UpdateAll": "Tout actualiser",
|
||||
"UpdateAutomaticallyHelpText": "Télécharger et installer automatiquement les mises à jour. Vous pourrez toujours installer à partir de System : Updates",
|
||||
"UpdateAutomaticallyHelpText": "Téléchargez et installez automatiquement les mises à jour. Vous pourrez toujours installer à partir du système : mises à jour",
|
||||
"UpdateMechanismHelpText": "Utiliser le programme de mise à jour intégré de Readarr ou un script",
|
||||
"UpdateScriptPathHelpText": "Chemin vers un script personnalisé qui prend un package de mise à jour extraite et gère le reste du processus de mise à jour",
|
||||
"UpdateScriptPathHelpText": "Chemin d'accès à un script personnalisé qui prend un package de mise à jour extrait et gère le reste du processus de mise à jour",
|
||||
"Updates": "Mises à jour",
|
||||
"UpgradeAllowedHelpText": "Si désactivé, la qualité ne sera pas améliorée",
|
||||
"Uptime": "Durée de fonctionnent",
|
||||
"UpgradeAllowedHelpText": "Si désactivé, les qualités ne seront pas améliorées",
|
||||
"Uptime": "Disponibilité",
|
||||
"UrlBaseHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"UseHardlinksInsteadOfCopy": "Utiliser des liens physiques au lieu de copier",
|
||||
"UseProxy": "Utiliser un proxy",
|
||||
"UseHardlinksInsteadOfCopy": "Utiliser les liens durs au lieu de copier",
|
||||
"UseProxy": "Utiliser le proxy",
|
||||
"Usenet": "Usenet",
|
||||
"UsenetDelay": "Délai Usenet",
|
||||
"UsenetDelayHelpText": "Délai en minutes avant de récupérer une version Usenet",
|
||||
"UsenetDelay": "Retard Usenet",
|
||||
"UsenetDelayHelpText": "Délai en minutes avant de récupérer une release de Usenet",
|
||||
"Username": "Nom d'utilisateur",
|
||||
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Branche à utiliser pour mettre à jour Readarr",
|
||||
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branche utilisée par le mécanisme de mise à jour extérieur",
|
||||
"Version": "Version",
|
||||
"WeekColumnHeader": "En-tête de la colonne : Semaine",
|
||||
"WeekColumnHeader": "En-tête de colonne de la semaine",
|
||||
"Year": "Année",
|
||||
"YesCancel": "Oui, annuler",
|
||||
"DownloadClientCheckDownloadingToRoot": "Le client de téléchargement {0} place les téléchargements dans le dossier racine {1}. Vous ne devez pas télécharger dans un dossier racine.",
|
||||
"Series": "Séries",
|
||||
"MaintenanceRelease": "Version de maintenance : corrections de bugs et autres améliorations. Voir historique des changements Github pour plus d'informations",
|
||||
"Series": "Série",
|
||||
"MaintenanceRelease": "Version de maintenance : corrections de bugs et autres améliorations. Voir l'historique des validations Github pour plus de détails",
|
||||
"LogRotation": "Rotation du journal",
|
||||
"LogRotateHelpText": "Nombre maximum de fichiers journaux à conserver dans le dossier des journaux",
|
||||
"FilterSentryEventsHelpText": "Filtrer les événements d'erreur utilisateur connus pour qu'ils ne soient pas envoyés en tant qu'Analytics",
|
||||
@@ -458,11 +456,11 @@
|
||||
"BookAvailableButMissing": "Livre disponible, mais manquant",
|
||||
"OutputPath": "Chemin de sortie",
|
||||
"ReleaseTitle": "Titre de la version",
|
||||
"ShowBookTitleHelpText": "Afficher le titre du livre sous l'affiche",
|
||||
"ShowBookTitleHelpText": "Affiche le titre du livre sous l'affiche",
|
||||
"ShowReleaseDate": "Afficher la date de sortie",
|
||||
"ShowTitle": "Afficher le titre",
|
||||
"ShowTitle": "Montrer le titre",
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Le dossier '{0}' et son contenu vont être supprimés.",
|
||||
"ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non cochée, Readarr les supprimera à la place",
|
||||
"ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non coché, Readarr les supprimera",
|
||||
"Level": "Niveau",
|
||||
"Publisher": "Éditeur",
|
||||
"Label": "Label",
|
||||
@@ -478,7 +476,7 @@
|
||||
"SelectAll": "Tout sélectionner",
|
||||
"SelectedCountBooksSelectedInterp": "{0} Livre(s) Sélectionné(s)",
|
||||
"ThisCannotBeCancelled": "Cela ne peut pas être annulé une fois démarré sans désactiver tous vos indexeurs.",
|
||||
"UnselectAll": "Tout déselectionner",
|
||||
"UnselectAll": "Tout désélectionner",
|
||||
"UpdateSelected": "Mettre à jour la sélection",
|
||||
"All": "Tout",
|
||||
"Wanted": "Recherché",
|
||||
@@ -520,12 +518,12 @@
|
||||
"SearchFiltered": "Chercher les filtrés",
|
||||
"SettingsRemotePathMappingLocalPath": "Chemin local",
|
||||
"UpdateAvailable": "Une nouvelle mise à jour est disponible",
|
||||
"DownloadClientsSettingsSummary": "Clients de Téléchargement, la gestion des téléchargements et les mappages de chemins d'accès à distance",
|
||||
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins distants",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Aucun client de téléchargement n'est disponible en raison d'échecs",
|
||||
"ImportListStatusCheckAllClientMessage": "Toutes les listes ne sont pas disponibles en raison d'échecs",
|
||||
"ImportMechanismHealthCheckMessage": "Activer la gestion des téléchargements terminés",
|
||||
"IndexerRssHealthCheckNoIndexers": "Aucun indexeur disponible avec la synchronisation RSS activée, Readarr ne récupérera pas automatiquement les nouvelles versions",
|
||||
"CouldntFindAnyResultsForTerm": "Pas de résultats pour '{0}'",
|
||||
"CouldntFindAnyResultsForTerm": "Aucun résultat pour de résultats pour '{0}'",
|
||||
"ReadarrSupportsAnyDownloadClient": "Readarr prend en charge de nombreux clients de téléchargement torrent et usenet.",
|
||||
"RefreshAndScan": "Actualiser et analyser",
|
||||
"RemotePathMappingCheckFileRemoved": "Le fichier {0} a été supprimé pendant le processus.",
|
||||
@@ -542,25 +540,25 @@
|
||||
"FileWasDeletedByUpgrade": "Le fichier à été supprimé pour importer une version supérieure",
|
||||
"Filters": "Filtres",
|
||||
"General": "Général",
|
||||
"GeneralSettingsSummary": "Port, SSL, nom d'utilisateur/mot de passe, proxy, analyses et mises à jour",
|
||||
"GeneralSettingsSummary": "Port, SSL/TLS, nom d'utilisateur/mot de passe, proxy, analyses et mises à jour",
|
||||
"HealthNoIssues": "Aucun problème avec votre configuration",
|
||||
"ImportListStatusCheckSingleClientMessage": "Listes indisponibles en raison d'échecs : {0}",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Tous les indexeurs sont indisponibles en raison d'échecs de plus de 6 heures",
|
||||
"Lists": "Listes",
|
||||
"Monitor": "Surveiller",
|
||||
"Monitor": "Surveillé",
|
||||
"MissingFromDisk": "Readarr n'a pas pu trouver le fichier sur le disque, il a donc été supprimé dans la base de données",
|
||||
"MountCheckMessage": "Le montage contenant un chemin d'auteur est monté en lecture seule : ",
|
||||
"OnBookFileDelete": "À la suppression d'un fichier vidéo",
|
||||
"OnBookFileDeleteForUpgrade": "À la suppression du fichier vidéo pour mise à niveau",
|
||||
"OnBookFileDeleteForUpgradeHelpText": "À la suppression du fichier vidéo pour mise à niveau",
|
||||
"OnBookFileDeleteHelpText": "À la suppression d'un fichier vidéo",
|
||||
"OnGrab": "À la Récupération",
|
||||
"OnHealthIssue": "Lors d'un problème de santé",
|
||||
"OnRename": "Lors du changement de nom",
|
||||
"OnGrab": "À saisir",
|
||||
"OnHealthIssue": "Sur la question de la santé",
|
||||
"OnRename": "Au renommage",
|
||||
"ProxyCheckBadRequestMessage": "Échec du test du proxy. StatusCode : {0}",
|
||||
"ProxyCheckFailedToTestMessage": "Échec du test du proxy : {0}",
|
||||
"ProxyCheckResolveIpMessage": "Impossible de résoudre l'adresse IP de l'hôte proxy configuré {0}",
|
||||
"QualitySettingsSummary": "Tailles qualité et dénomination",
|
||||
"QualitySettingsSummary": "Tailles et dénomination de qualité",
|
||||
"Queued": "En file d'attente",
|
||||
"QueueIsEmpty": "La file d'attente est vide",
|
||||
"RemotePathMappingCheckDownloadPermissions": "Readarr peut voir mais ne peut accéder au livre téléchargé {0}. Il s'agit probablement d'une erreur de permissions.",
|
||||
@@ -599,7 +597,7 @@
|
||||
"CalibreUsername": "Nom d'utilisateur Calibre",
|
||||
"ContinuingAllBooksDownloaded": "Continuation (Tous les livres téléchargés)",
|
||||
"CalibreContentServerText": "L'utilisation d'un serveur de contenu Calibre (et non Calibre Web) permet à Readarr d'ajouter des livres à votre bibliothèque Calibre et de déclencher des conversions entre les formats",
|
||||
"Continuing": "Continuant",
|
||||
"Continuing": "Continuer",
|
||||
"ContinuingMoreBooksAreExpected": "D'autres livres sont attendus",
|
||||
"ContinuingNoAdditionalBooksAreExpected": "Aucun livre supplémentaire n'est prévu",
|
||||
"AuthorIndex": "Index de l'auteur",
|
||||
@@ -611,7 +609,7 @@
|
||||
"BookList": "Liste des livres",
|
||||
"CalibreContentServer": "Serveur de contenu Calibre",
|
||||
"AllowedLanguages": "Langues autorisées",
|
||||
"AllowFingerprinting": "Autoriser la prise d'empreinte (Fingerprinting)",
|
||||
"AllowFingerprinting": "Autoriser le tracking audio",
|
||||
"AllowFingerprintingHelpTextWarning": "Cela nécessite que Readarr lise certaines parties du fichier, ce qui ralentit les analyses et peut entraîner une forte activité du disque dur ou du réseau.",
|
||||
"ASIN": "ASIN",
|
||||
"Author": "Auteur",
|
||||
@@ -652,10 +650,10 @@
|
||||
"DefaultMetadataProfileIdHelpText": "Profil de métadonnées par défaut pour les auteurs détectés dans ce dossier",
|
||||
"DefaultMonitorOptionHelpText": "Quels livres doivent être surveillés lors de l'ajout initial pour les auteurs détectés dans ce dossier",
|
||||
"DefaultQualityProfileIdHelpText": "Profil de qualité par défaut pour les auteurs détectés dans ce dossier",
|
||||
"AddMissing": "Ajouter les manquants",
|
||||
"AddMissing": "Ajouter manquant",
|
||||
"BookFileCountBookCountTotalTotalBookCountInterp": "{0} / {1} (Total : {2})",
|
||||
"InstanceName": "Nom de l'instance",
|
||||
"InstanceNameHelpText": "Nom de l'instance dans l'onglet du navigateur et pour le nom d'application dans Syslog",
|
||||
"InstanceNameHelpText": "Nom de l'instance dans l'onglet et pour le nom de l'application Syslog",
|
||||
"UseCalibreContentServer": "Serveur de contenu Calibre",
|
||||
"DefaultTagsHelpText": "Profil de métadonnées par défaut pour les auteurs détectés dans ce dossier",
|
||||
"MetadataProfiles": "profil de métadonnées",
|
||||
@@ -663,48 +661,48 @@
|
||||
"MetadataProfile": "profil de métadonnées",
|
||||
"StatusEndedContinuing": "Continuant",
|
||||
"Database": "Base de données",
|
||||
"ApplicationUrlHelpText": "URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL",
|
||||
"ApplicationUrlHelpText": "L'URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL",
|
||||
"ApplicationURL": "URL de l'application",
|
||||
"ImportListExclusions": "Supprimer les exclusions de liste d'imports",
|
||||
"ImportListExclusions": "Exclusions de la liste d'importation",
|
||||
"ChooseImportMethod": "Choisir une méthode d'importation",
|
||||
"ClickToChangeReleaseGroup": "Cliquez pour changer de groupe de diffusion",
|
||||
"HardlinkCopyFiles": "Lier/copier les fichiers",
|
||||
"MoveFiles": "Déplacer les fichiers",
|
||||
"OnApplicationUpdate": "Lors de la mise à jour de l'app",
|
||||
"HardlinkCopyFiles": "Lien physique/Copie de fichiers",
|
||||
"MoveFiles": "Déplacer des fichiers",
|
||||
"OnApplicationUpdate": "Sur la mise à jour de l'application",
|
||||
"OnApplicationUpdateHelpText": "Lors de la mise à jour de l'app",
|
||||
"BypassIfAboveCustomFormatScore": "Contourner si au-dessus du score du format personnalisé",
|
||||
"BypassIfHighestQuality": "Contourner si la qualité est la plus élevée",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "Activez le contournement lorsque la version a un score supérieur au score minimum configuré pour le format personnalisé",
|
||||
"CustomFormatScore": "Score du format personnalisé",
|
||||
"MinimumCustomFormatScore": "Score de format personnalisé minimum",
|
||||
"CustomFormatScore": "Partition au format personnalisé",
|
||||
"MinimumCustomFormatScore": "Score minimum de format personnalisé",
|
||||
"Theme": "Thème",
|
||||
"ThemeHelpText": "Changez le thème de l'interface de l'application. Le thème \"Auto\" utilisera celui de votre système d'exploitation pour définir le mode clair ou foncé. Inspiré par Theme.Park",
|
||||
"ThemeHelpText": "Modifiez le thème de l'interface utilisateur de l'application, le thème « Auto » utilisera le thème de votre système d'exploitation pour définir le mode clair ou sombre. Inspiré par Theme.Park",
|
||||
"EnableRssHelpText": "Sera utilisé lorsque Readarr recherche périodiquement des sorties via la synchronisation RSS",
|
||||
"CloneCustomFormat": "Dupliqué le format personnalisé",
|
||||
"Conditions": "Conditions",
|
||||
"CopyToClipboard": "Copier dans le presse-papier",
|
||||
"CustomFormat": "Format Personnalisé",
|
||||
"CustomFormat": "Format personnalisé",
|
||||
"CustomFormatSettings": "Réglages Formats Personnalisés",
|
||||
"CustomFormats": "Formats perso.",
|
||||
"CustomFormats": "Formats personnalisés",
|
||||
"DeleteCustomFormat": "Supprimer le format personnalisé",
|
||||
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
|
||||
"DeleteFormatMessageText": "Êtes-vous sûr de vouloir supprimer le tag {0} ?",
|
||||
"ExportCustomFormat": "Exporter format personnalisé",
|
||||
"DeleteCustomFormatMessageText": "Voulez-vous vraiment supprimer le format personnalisé « {name} » ?",
|
||||
"DeleteFormatMessageText": "Êtes-vous sûr de vouloir supprimer le tag « {0} » ?",
|
||||
"ExportCustomFormat": "Exporter un format personnalisé",
|
||||
"Formats": "Formats",
|
||||
"IncludeCustomFormatWhenRenamingHelpText": "Inclus dans {Custom Formats} renommer le format",
|
||||
"MinFormatScoreHelpText": "Score de format personnalisé minimum autorisé à télécharger",
|
||||
"NegateHelpText": "Si coché, le format personnalisé ne s'appliquera pas si cette condition {0} correspond.",
|
||||
"ResetDefinitionTitlesHelpText": "Réinitialiser les titres des définitions ainsi que les valeurs",
|
||||
"ResetDefinitionTitlesHelpText": "Réinitialiser les titres de définition ainsi que les valeurs",
|
||||
"UnableToLoadCustomFormats": "Impossible de charger les formats personnalisés",
|
||||
"UpgradesAllowed": "Mises à niveau autorisées",
|
||||
"ReleaseProfiles": "profil de version",
|
||||
"ReleaseProfiles": "Profils de version",
|
||||
"CutoffFormatScoreHelpText": "Quand ce score de format personnalisé est atteint, Readarr ne téléchargera plus de versions du livre",
|
||||
"DataFutureBooks": "Surveiller les livres qui ne sont pas encore sortis",
|
||||
"ResetDefinitions": "Réinitialiser les définitions",
|
||||
"ResetTitles": "Réinitialiser les titres",
|
||||
"ImportListMissingRoot": "Le dossier racine est manquant pour importer la/les listes : {0}",
|
||||
"ImportListMultipleMissingRoots": "Plusieurs dossiers racines sont manquants pour importer les listes : {0}",
|
||||
"IndexerDownloadClientHelpText": "Spécifiez quel client de téléchargement est utilisé pour cet indexeur",
|
||||
"IndexerDownloadClientHelpText": "Spécifiez quel client de téléchargement est utilisé pour les récupérations à partir de cet indexeur",
|
||||
"IndexerTagsHelpText": "Utiliser seulement cet indexeur pour les auteurs avec au moins un tag correspondant. Laisser vide pour l'utiliser avec tous les auteurs.",
|
||||
"RecycleBinUnableToWriteHealthCheck": "Impossible d'écrire dans le dossier de corbeille configuré : {0}. Assurez vous que ce chemin existe et est accessible en écriture par l'utilisateur exécutant Readarr",
|
||||
"Loading": "Chargement",
|
||||
@@ -712,64 +710,64 @@
|
||||
"ThereWasAnErrorLoadingThisPage": "Une erreur s'est produite lors du chargement de cette page",
|
||||
"ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration",
|
||||
"DeleteBookFile": "Effacer le fichier du livre",
|
||||
"HiddenClickToShow": "Caché, cliquez pour afficher",
|
||||
"HideAdvanced": "Masquer avancé",
|
||||
"ShowAdvanced": "Afficher avancés",
|
||||
"ShownClickToHide": "Montré, cliquez pour masquer",
|
||||
"ColonReplacement": "Remplacement pour le 'deux-points'",
|
||||
"ReplaceWithDash": "Remplacer par Dash",
|
||||
"ReplaceWithSpaceDash": "Remplacer par Space Dash",
|
||||
"ReplaceWithSpaceDashSpace": "Remplacer par Space Dash Space",
|
||||
"DeleteRemotePathMapping": "Éditer le chemin distant",
|
||||
"DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir effacer ce chemin ?",
|
||||
"HiddenClickToShow": "Masqué, cliquez pour afficher",
|
||||
"HideAdvanced": "Masquer les Options Avancées",
|
||||
"ShowAdvanced": "Afficher les paramètres avancés",
|
||||
"ShownClickToHide": "Affiché, cliquez pour masquer",
|
||||
"ColonReplacement": "Remplacement pour le « deux-points »",
|
||||
"ReplaceWithDash": "Remplacer par un tiret",
|
||||
"ReplaceWithSpaceDash": "Remplacer par un espace puis un tiret",
|
||||
"ReplaceWithSpaceDashSpace": "Remplacer par un espace, un tiret puis un espace",
|
||||
"DeleteRemotePathMapping": "Supprimer le mappage de chemin distant",
|
||||
"DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir supprimer ce mappage de chemin distant ?",
|
||||
"BlocklistReleases": "Publications de la liste de blocage",
|
||||
"DeleteConditionMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?",
|
||||
"Negated": "Inversé",
|
||||
"DeleteConditionMessageText": "Êtes-vous sûr de vouloir supprimer la condition « {name} » ?",
|
||||
"Negated": "Nier",
|
||||
"RemoveSelectedItem": "Supprimer l'élément sélectionné",
|
||||
"RemoveSelectedItemBlocklistMessageText": "Êtes-vous sûr de vouloir supprimer les films sélectionnés de la liste noire ?",
|
||||
"RemoveSelectedItemQueueMessageText": "Êtes-vous sûr de vouloir désinstaller {0} objet{1} de la file d'attente ?",
|
||||
"RemoveSelectedItemQueueMessageText": "Êtes-vous sûr de vouloir supprimer 1 élément de la file d'attente ?",
|
||||
"RemoveSelectedItems": "Supprimer les éléments sélectionnés",
|
||||
"RemoveSelectedItemsQueueMessageText": "Êtes-vous sûr de vouloir supprimer {0} objet(s) de la file d'attente ?",
|
||||
"RemoveSelectedItemsQueueMessageText": "Voulez-vous vraiment supprimer {0} éléments de la file d'attente ?",
|
||||
"Required": "Obligatoire",
|
||||
"ResetQualityDefinitions": "Réinitialiser les définitions de qualité",
|
||||
"ResetQualityDefinitionsMessageText": "Êtes-vous sûr de vouloir réinitialiser les définitions de qualité ?",
|
||||
"ResetQualityDefinitionsMessageText": "Voulez-vous vraiment réinitialiser les définitions de qualité ?",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Comment appliquer des étiquettes aux indexeurs sélectionnés",
|
||||
"ApplyTagsHelpTextRemove": "Suprimer : Suprime les étiquettes renseignées",
|
||||
"ApplyTagsHelpTextRemove": "Supprimer : supprime les étiquettes renseignées",
|
||||
"AutomaticAdd": "Ajout automatique",
|
||||
"BlocklistReleaseHelpText": "Empêche Lidarr de récupérer automatiquement cette version",
|
||||
"NoChange": "Pas de changement",
|
||||
"NoEventsFound": "Aucun événement trouvé",
|
||||
"RemoveDownloadsAlert": "Les paramètres de suppression ont été déplacés dans les réglages de chaque client de téléchargement dans le tableau ci-dessus.",
|
||||
"RemoveDownloadsAlert": "Les paramètres de suppression ont été déplacés vers les paramètres individuels du client de téléchargement dans le tableau ci-dessus.",
|
||||
"Yes": "Oui",
|
||||
"RedownloadFailed": "Échec du téléchargement",
|
||||
"RemoveCompleted": "Supprimer les complétés",
|
||||
"RemoveFailed": "Echec de la suppression",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Comment appliquer des balises aux clients de téléchargement sélectionnés",
|
||||
"RemoveCompleted": "Supprimer terminé",
|
||||
"RemoveFailed": "Échec de la suppression",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Comment appliquer des étiquettes aux clients de téléchargement sélectionnés",
|
||||
"ApplyChanges": "Appliquer les modifications",
|
||||
"ApplyTagsHelpTextAdd": "Ajouter : Ajouter les tags à la liste de tags existantes",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Comment appliquer des balises aux listes d'importation sélectionnées",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des tags aux indexeurs sélectionnés",
|
||||
"ApplyTagsHelpTextReplace": "Remplacer : Remplace les balises par les balises saisies (ne pas saisir de balises pour effacer toutes les balises)",
|
||||
"CountIndexersSelected": "{0} indexeur(s) sélectionné(s)",
|
||||
"DeleteSelectedDownloadClients": "Supprimer le client de téléchargement",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
|
||||
"DeleteSelectedImportListsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
|
||||
"DeleteSelectedIndexers": "Supprimer l'indexeur",
|
||||
"DeleteSelectedIndexersMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
|
||||
"ApplyTagsHelpTextAdd": "Ajouter : ajoute les étiquettes à la liste de étiquettes existantes",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Comment appliquer des étiquettes aux listes d'importation sélectionnées",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des étiquettes aux indexeurs sélectionnés",
|
||||
"ApplyTagsHelpTextReplace": "Remplacer : remplace les étiquettes par les étiquettes renseignées (ne pas renseigner d'étiquette pour toutes les effacer)",
|
||||
"CountIndexersSelected": "{selectedCount} indexeur(s) sélectionné(s)",
|
||||
"DeleteSelectedDownloadClients": "Supprimer le(s) client(s) de téléchargement",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer {count} client(s) de téléchargement sélectionné(s) ?",
|
||||
"DeleteSelectedImportListsMessageText": "Êtes-vous sûr de vouloir supprimer {count} liste(s) d'importation sélectionnée(s) ?",
|
||||
"DeleteSelectedIndexers": "Supprimer un ou plusieurs indexeurs",
|
||||
"DeleteSelectedIndexersMessageText": "Voulez-vous vraiment supprimer les {count} indexeur(s) sélectionné(s) ?",
|
||||
"DownloadClientTagHelpText": "Utiliser seulement cet indexeur pour les films avec au moins un tag correspondant. Laissez vide pour l'utiliser avec tous les films.",
|
||||
"ExistingTag": "Tag existant",
|
||||
"ExistingTag": "Balise existante",
|
||||
"No": "Non",
|
||||
"RemovingTag": "Suppression du tag",
|
||||
"SetTags": "Définir Tags",
|
||||
"CountDownloadClientsSelected": "{0} client(s) de téléchargement sélectionné(s)",
|
||||
"RemovingTag": "Supprimer la balise",
|
||||
"SetTags": "Définir des balises",
|
||||
"CountDownloadClientsSelected": "{selectedCount} client(s) de téléchargement sélectionné(s)",
|
||||
"EditSelectedDownloadClients": "Modifier les clients de téléchargement sélectionnés",
|
||||
"EditSelectedIndexers": "Modifier les indexeurs sélectionnés",
|
||||
"ConnectionLostReconnect": "Radarr essaiera de se connecter automatiquement, ou vous pouvez cliquer sur \"Recharger\" en bas.",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Applications indisponibles en raison de dysfonctionnements : {0}",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "Tous les résultats ont été dissimulés par le filtre actuellement appliqué",
|
||||
"ConnectionLostReconnect": "{appName} essaiera de se connecter automatiquement, ou vous pouvez cliquer sur « Recharger » en bas.",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Toutes les notifications ne sont pas disponibles en raison d'échecs",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison d'échecs : {0}",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "Certains résultats sont masqués par le filtre appliqué",
|
||||
"ConnectionLost": "Connexion perdue",
|
||||
"ConnectionLostToBackend": "Radarr a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.",
|
||||
"ConnectionLostToBackend": "{appName} a perdu sa connexion au backend et devra être rechargé pour fonctionner à nouveau.",
|
||||
"RecentChanges": "Changements récents",
|
||||
"System": "Système",
|
||||
"WhatsNew": "Quoi de neuf ?",
|
||||
@@ -787,11 +785,146 @@
|
||||
"NextExecution": "Prochaine exécution",
|
||||
"Small": "Petit",
|
||||
"TotalSpace": "Espace total",
|
||||
"Ui": "UI",
|
||||
"Ui": "Interface utilisateur",
|
||||
"Activity": "Activité",
|
||||
"AddNew": "Ajouter un nouveau",
|
||||
"AddNew": "Ajouter une nouvelle",
|
||||
"Backup": "Sauvegarde",
|
||||
"AutoAdd": "Ajout automatique",
|
||||
"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",
|
||||
"AppUpdated": "{appName} Mise à jour"
|
||||
"AppUpdated": "{appName} mis à jour",
|
||||
"NoMissingItems": "Aucun élément manquant",
|
||||
"MediaManagementSettingsSummary": "Nommage, paramètres de gestion de fichiers et dossiers racine",
|
||||
"SmartReplace": "Remplacement intelligent",
|
||||
"Clone": "Cloner",
|
||||
"IsShowingMonitoredUnmonitorSelected": "Arrêter de surveiller la sélection",
|
||||
"ItsEasyToAddANewAuthorOrBookJustStartTypingTheNameOfTheItemYouWantToAdd": "C'est facile d'ajouter un nouvel auteur ou livre, commencez simplement à saisir le nom de l'élément que vous souhaitez ajouter",
|
||||
"DeleteRootFolder": "Supprimer le dossier racine",
|
||||
"DeleteCondition": "Supprimer la condition",
|
||||
"WouldYouLikeToRestoreBackup": "Souhaitez-vous restaurer la sauvegarde « {name} » ?",
|
||||
"DashOrSpaceDashDependingOnName": "Tiret ou espace puis tiret selon le nom",
|
||||
"Implementation": "Mise en œuvre",
|
||||
"ManageDownloadClients": "Gérer les clients de téléchargement",
|
||||
"ManageClients": "Gérer les clients",
|
||||
"NoIndexersFound": "Aucun indexeur n'a été trouvé",
|
||||
"ListWillRefreshEveryInterp": "La liste se rafraîchira tous/toutes la/les {0}",
|
||||
"NoDownloadClientsFound": "Aucun client de téléchargement n'a été trouvé",
|
||||
"MinimumPopularity": "Popularité minimum",
|
||||
"NoHistoryBlocklist": "Pas d'historique de liste noire",
|
||||
"AppUpdatedVersion": "{appName} a été mis à jour vers la version `{version}`, pour profiter des derniers changements, vous devrez relancer {appName}",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexeurs avec des clients de téléchargement invalides : {0].",
|
||||
"MonitoringOptions": "Options de surveillance",
|
||||
"OnDownloadFailure": "En cas d'échec de téléchargement",
|
||||
"RootFolderPathHelpText": "Les éléments de la liste du dossier racine seront ajoutés à",
|
||||
"WatchLibraryForChangesHelpText": "Réanalyser automatiquement lorsque les fichiers changent dans un dossier racine",
|
||||
"SkipRedownload": "Ignorer le nouveau téléchargement",
|
||||
"RemoveFailedDownloads": "Supprimer les téléchargements ayant échoué",
|
||||
"ShowName": "Afficher le nom",
|
||||
"RemotePathMappingsInfo": "Les mappages de chemins distants sont très rarement requis. Si {app} et votre client de téléchargement sont sur le même système, il est préférable de faire correspondre vos chemins. Pour plus d'informations, consultez le [wiki]({wikiLink}).",
|
||||
"NoImportListsFound": "Aucune liste d'importation trouvée",
|
||||
"BypassIfHighestQualityHelpText": "Délai de contournement lorsque la version a la qualité activée la plus élevée dans le profil de qualité",
|
||||
"NoCutoffUnmetItems": "Aucun élément non satisfait",
|
||||
"PathHelpTextWarning": "Cela doit être différent du répertoire dans lequel votre client de téléchargement place les fichiers",
|
||||
"PreviewRetag": "Aperçu du réétiquetage",
|
||||
"OnImportFailure": "En cas d'échec de l'importation",
|
||||
"DiscCount": "Nombre de disques",
|
||||
"IsExpandedHideFileInfo": "Masquer les informations sur le fichier",
|
||||
"OnReleaseImport": "Lors de l'importation de la version",
|
||||
"MetadataConsumers": "Consommateurs de métadonnées",
|
||||
"MusicBrainzRecordingID": "Identifiant d'enregistrement MusicBrainz",
|
||||
"OnDownloadFailureHelpText": "En cas d'échec de téléchargement",
|
||||
"Other": "Autre",
|
||||
"QualityProfileIdHelpText": "Les éléments de la liste du profil de qualité doivent être ajoutés avec",
|
||||
"DeleteFormat": "Supprimer le format",
|
||||
"DeleteImportList": "Supprimer la liste d'importation",
|
||||
"DeleteMetadataProfile": "Supprimer le profil de métadonnées",
|
||||
"ImportListSpecificSettings": "Paramètres spécifiques à la liste d'importation",
|
||||
"MetadataSource": "Source des métadonnées",
|
||||
"MetadataProfileIdHelpText": "Les éléments de la liste de profils de métadonnées doivent être ajoutés avec",
|
||||
"EntityName": "Nom de l'entité",
|
||||
"FutureDaysHelpText": "Journées pour le flux iCal pour regarder vers l'avenir",
|
||||
"FutureDays": "Jours futurs",
|
||||
"ImportLists": "Importer des listes",
|
||||
"ImportListSettings": "Paramètres généraux de la liste d'importation",
|
||||
"DiscNumber": "Numéro de disque",
|
||||
"EnabledHelpText": "Cochez pour activer le profil de version",
|
||||
"CloneCondition": "État du clone",
|
||||
"MinimumCustomFormatScoreHelpText": "Score de format personnalisé minimum requis pour contourner le délai pour le protocole préféré",
|
||||
"CountImportListsSelected": "{selectedCount} liste(s) d'importation sélectionnée(s)",
|
||||
"ListRefreshInterval": "Intervalle d'actualisation de la liste",
|
||||
"DeleteSelectedImportLists": "Supprimer la ou les listes d'importation",
|
||||
"ManageImportLists": "Gérer les listes d'importation",
|
||||
"MusicBrainzReleaseID": "ID de version MusicBrainz",
|
||||
"MusicBrainzTrackID": "Identifiant de la piste MusicBrainz",
|
||||
"RemoveCompletedDownloads": "Supprimer les téléchargements terminés",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Le client de téléchargement {0} 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 {1} puisse les importer.",
|
||||
"DownloadPropersAndRepacksHelpTexts2": "Utilisez « Ne pas préférer » pour trier par score de mot préféré par rapport aux propriétés/repacks",
|
||||
"EditSelectedImportLists": "Modifier les listes d'importation sélectionnées",
|
||||
"ExistingTagsScrubbed": "Balises existantes supprimées",
|
||||
"ImportFailures": "Échecs d’importation",
|
||||
"IndexerIdHelpTextWarning": "L'utilisation d'un indexeur spécifique avec les mots préférés peut conduire à la saisie de versions en double",
|
||||
"IsShowingMonitoredMonitorSelected": "Surveillance sélectionnée",
|
||||
"ManageIndexers": "Gérer les indexeurs",
|
||||
"ManageLists": "Gérer les listes",
|
||||
"ManualDownload": "Téléchargement manuel",
|
||||
"MusicbrainzId": "Identifiant Musicbrainz",
|
||||
"PastDays": "Jours passés",
|
||||
"TrackNumber": "Numéro de piste",
|
||||
"IsExpandedShowFileInfo": "Afficher les informations sur le fichier",
|
||||
"OnImportFailureHelpText": "En cas d'échec de l'importation",
|
||||
"PastDaysHelpText": "Jours pour le flux iCal pour se pencher sur le passé",
|
||||
"SearchMonitored": "Recherche surveillée",
|
||||
"ShowBanners": "Afficher les bannières",
|
||||
"ShouldSearchHelpText": "Recherchez dans les indexeurs les éléments nouvellement ajoutés. À utiliser avec prudence pour les grandes listes.",
|
||||
"ShowBannersHelpText": "Afficher des bannières au lieu de noms",
|
||||
"TrackTitle": "Titre de la piste",
|
||||
"UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "La mise à jour est désactivée dans un conteneur Docker. Mettez plutôt à jour l’image du conteneur.",
|
||||
"WatchRootFoldersForFileChanges": "Surveillez les dossiers racine pour les modifications de fichiers",
|
||||
"WriteMetadataTags": "Écrire des balises de métadonnées",
|
||||
"IndexerIdHelpText": "Spécifiez à quel indexeur le profil s'applique",
|
||||
"Monitoring": "Surveillance",
|
||||
"UnmappedFiles": "Fichiers non mappés",
|
||||
"Bookshelf": "Bibliothèque",
|
||||
"ErrorLoadingContent": "Une erreur s'est produite lors du chargement de ce contenu",
|
||||
"OnReleaseImportHelpText": "Lors de l'importation de la version",
|
||||
"UnableToLoadMetadataProviderSettings": "Impossible de charger les paramètres du fournisseur de métadonnées",
|
||||
"SearchForNewItems": "Rechercher de nouveaux éléments",
|
||||
"MonitorBookExistingOnlyWarning": "Il s’agit d’un ajustement unique du paramètre surveillé pour chaque album. Utilisez l'option sous Artiste/Modifier pour contrôler ce qui se passe pour les albums nouvellement ajoutés",
|
||||
"SearchForMonitoredBooks": "Rechercher des albums surveillés",
|
||||
"WriteAudioTagsScrub": "Effacer les balises existantes",
|
||||
"ShouldMonitorExistingHelpText": "Surveiller automatiquement les albums de cette liste qui sont déjà dans Lidarr",
|
||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "Si vous n'ajoutez pas d'exclusion de liste d'importation et que l'artiste a un profil de métadonnées autre que « Aucun », cet album pourra être ajouté à nouveau lors de la prochaine actualisation de l'artiste.",
|
||||
"MetadataSettingsSummary": "Créez des fichiers de métadonnées lorsque les épisodes sont importés ou que les sites sont actualisés",
|
||||
"MonitoringOptionsHelpText": "Quels albums doivent être surveillés après l'ajout de l'artiste (ajustement unique)",
|
||||
"EnableAutomaticAddHelpText": "Ajoutez des artistes/albums à Lidarr lorsque les synchronisations sont effectuées via l'interface utilisateur ou par Lidarr",
|
||||
"IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnAuthorOrImportList": "Impossible de supprimer un profil de métadonnées associé à un artiste ou à une liste d'importation",
|
||||
"ListsSettingsSummary": "Importer des listes",
|
||||
"ProfilesSettingsSummary": "Profils de qualité, de langue, de délai et de release",
|
||||
"SkipRedownloadHelpText": "Empêche Lidarr d'essayer de télécharger des versions alternatives pour les éléments supprimés",
|
||||
"CountAuthorsSelected": "{selectedCount} artiste(s) sélectionné(s)",
|
||||
"SearchForAllCutoffUnmetBooks": "Rechercher tous les albums de Cutoff Unmet",
|
||||
"WriteAudioTagsScrubHelp": "Supprimez les balises existantes des fichiers, en ne laissant que celles ajoutées par Lidarr.",
|
||||
"EndedAllBooksDownloaded": "Terminé (Toutes les pistes téléchargées)",
|
||||
"ForeignId": "ID étranger",
|
||||
"GoToAuthorListing": "Aller à la liste des artistes",
|
||||
"WriteAudioTags": "Baliser les fichiers audio avec des métadonnées",
|
||||
"TheBooksFilesWillBeDeleted": "Les fichiers de l'album seront supprimés.",
|
||||
"MonitorNewItemsHelpText": "Quels nouveaux albums doivent être surveillés",
|
||||
"MusicBrainzAuthorID": "Identifiant d'artiste MusicBrainz",
|
||||
"MusicBrainzBookID": "Identifiant de la piste MusicBrainz",
|
||||
"DeleteFilesHelpText": "Supprimez les fichiers de piste et le dossier de l'artiste",
|
||||
"ShowTitleHelpText": "Afficher le nom de l'artiste sous l'affiche",
|
||||
"WriteBookTagsHelpTextWarning": "La sélection de « Tous les fichiers » modifiera les fichiers existants lors de leur importation.",
|
||||
"IsInUseCantDeleteAQualityProfileThatIsAttachedToAnAuthorOrImportList": "Impossible de supprimer un profil de qualité associé à un artiste ou à une liste d'importation",
|
||||
"PathHelpText": "Dossier racine contenant votre bibliothèque musicale",
|
||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Lidarr prend en charge plusieurs listes pour importer des albums et des artistes dans la base de données.",
|
||||
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} pistes au total. {1} pistes avec fichiers.",
|
||||
"SearchForAllMissingBooks": "Rechercher tous les albums manquants",
|
||||
"ForeignIdHelpText": "L'identifiant Musicbrainz de l'artiste/album à exclure",
|
||||
"EnableProfile": "Activer profil",
|
||||
"Development": "Développement",
|
||||
"FilesTotal": "Fichiers ({0})",
|
||||
"SearchBoxPlaceHolder": "Par ex. Guerre et Paix, goodreads:656, isbn:067003469X, asin:B00JCDK5ME",
|
||||
"ExtraFileExtensionsHelpText": "Liste de fichiers supplémentaires séparés par des virgules à importer (.nfo sera importé en tant que .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Exemples : '.sub, .nfo' ou 'sub,nfo'",
|
||||
"UseSSL": "Utiliser SSL"
|
||||
}
|
||||
|
||||
@@ -109,8 +109,6 @@
|
||||
"ErrorLoadingContents": "שגיאה בטעינת התוכן",
|
||||
"ErrorLoadingPreviews": "שגיאה בטעינת תצוגה מקדימה",
|
||||
"Exception": "יוצא מן הכלל",
|
||||
"ExtraFileExtensionsHelpTexts1": "רשימה מופרדת באמצעות פסיקים של קבצים נוספים לייבוא (.nfo יובא כ- nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTexts2": "דוגמאות: '.sub, .nfo' או 'sub, nfo'",
|
||||
"FailedDownloadHandling": "הטיפול בהורדות נכשל",
|
||||
"FileDateHelpText": "שנה את תאריך הקובץ בעת הייבוא / סריקה מחדש",
|
||||
"FileManagement": "ניהול קבצים",
|
||||
@@ -656,5 +654,8 @@
|
||||
"Small": "קָטָן",
|
||||
"System": "מערכת",
|
||||
"Theme": "ערכת נושא",
|
||||
"TotalSpace": "השטח הכולל"
|
||||
"TotalSpace": "השטח הכולל",
|
||||
"Publisher": "מוציא לאור",
|
||||
"ExtraFileExtensionsHelpText": "רשימה מופרדת באמצעות פסיקים של קבצים נוספים לייבוא (.nfo יובא כ- nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "דוגמאות: '.sub, .nfo' או 'sub, nfo'"
|
||||
}
|
||||
|
||||
@@ -114,8 +114,6 @@
|
||||
"ErrorLoadingContents": "सामग्री लोड करने में त्रुटि",
|
||||
"ErrorLoadingPreviews": "पूर्वावलोकन लोड करने में त्रुटि",
|
||||
"Exception": "अपवाद",
|
||||
"ExtraFileExtensionsHelpTexts1": "आयात करने के लिए कोमा ने अतिरिक्त फ़ाइलों की सूची अलग कर दी (.nfo को .nfo- मूल के रूप में आयात किया जाएगा)",
|
||||
"ExtraFileExtensionsHelpTexts2": "उदाहरण: '.sub, .nfo' या 'सब, nfo'",
|
||||
"FailedDownloadHandling": "डाउनलोड हैंडलिंग विफल",
|
||||
"FileDateHelpText": "आयात / रेस्क्यू पर फ़ाइल तिथि बदलें",
|
||||
"FileManagement": "फाइल प्रबंधन",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"BackupFolderHelpText": "Az elérési útvonalak a Readarr AppData könyvtárában lesznek",
|
||||
"BackupNow": "Biztonsági Mentés Most",
|
||||
"BackupRetentionHelpText": "A megőrzési időnél régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek",
|
||||
"Backups": "Biztonsági Mentés",
|
||||
"Backups": "Biztonsági mentések",
|
||||
"BindAddress": "Kapcsolási Cím",
|
||||
"BindAddressHelpText": "Érvényes IPv4-cím, vagy „*” minden interfészhez",
|
||||
"BindAddressHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez",
|
||||
@@ -23,7 +23,7 @@
|
||||
"BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez",
|
||||
"Calendar": "Naptár",
|
||||
"CalendarWeekColumnHeaderHelpText": "Minden oszlop felett jelenjen meg, hogy melyik hét az aktuális",
|
||||
"Cancel": "Vissza",
|
||||
"Cancel": "Mégse",
|
||||
"CancelMessageText": "Biztosan törlöd ezt a függőben lévő feladatot?",
|
||||
"CertificateValidation": "Tanúsítvány érvényesítése",
|
||||
"CertificateValidationHelpText": "Módosítsa a HTTPS-tanúsítvány-ellenőrzés szigorúságát. Ne változtasson, hacsak nem érti a kockázatokat.",
|
||||
@@ -109,8 +109,6 @@
|
||||
"ErrorLoadingContents": "Hiba történt a tartalom betöltésekor",
|
||||
"ErrorLoadingPreviews": "Hiba történt az előnézetek betöltése közben",
|
||||
"Exception": "Kivétel",
|
||||
"ExtraFileExtensionsHelpTexts1": "Az importálandó extra fájlok vesszővel lesznek elválasztva (.nfo .nfo-orig néven lesz importálva)",
|
||||
"ExtraFileExtensionsHelpTexts2": "Például: '.sub, .nfo' vagy 'sub, nfo'",
|
||||
"FailedDownloadHandling": "Nem sikerült a letöltés kezelése",
|
||||
"FileDateHelpText": "A fájl dátumának módosítása az importáláskor / újrakereséskor",
|
||||
"FileManagement": "Fájlkezelő",
|
||||
@@ -857,7 +855,7 @@
|
||||
"LoadingEditionsFailed": "A kiadások betöltése nem sikerült",
|
||||
"ManualImportSelectEdition": "Kézi importálás – Válaszd ki a Kiadást",
|
||||
"Database": "Adatbázis",
|
||||
"ApplicationURL": "Alkalmazás URL-je",
|
||||
"ApplicationURL": "Alkalmazás URL",
|
||||
"ApplicationUrlHelpText": "Az alkalmazás külső URL-címe, beleértve a http(s)://-t, a portot és az URL-alapot",
|
||||
"ChooseImportMethod": "Importálási mód kiválasztása",
|
||||
"ClickToChangeReleaseGroup": "Kiadási csoport módosítása",
|
||||
@@ -976,5 +974,8 @@
|
||||
"Activity": "Aktivitás",
|
||||
"AddNew": "Új hozzáadása",
|
||||
"Backup": "Biztonsági Mentés",
|
||||
"Medium": "Közepes"
|
||||
"Medium": "Közepes",
|
||||
"AutoAdd": "Automatikus hozzáadás",
|
||||
"ExtraFileExtensionsHelpText": "Az importálandó extra fájlok vesszővel lesznek elválasztva (.nfo .nfo-orig néven lesz importálva)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Például: '.sub, .nfo' vagy 'sub, nfo'"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"Actions": "Tindakan",
|
||||
"AgeWhenGrabbed": "Usia (saat diperoleh)",
|
||||
"All": "Semua",
|
||||
"AlreadyInYourLibrary": "Sudah ada di pustaka kamu",
|
||||
"AlreadyInYourLibrary": "Sudah di pustakamu",
|
||||
"Analytics": "Analitik",
|
||||
"AnalyticsEnabledHelpText": "Kirimkan informasi penggunaan secara anonim ke server Radarr. Informasi tersebut mengandung browser kamu, halaman WebUI Radarr yang kamu gunakan, pelaporan masalah serta OS dan versi runtime. Kami akan memanfaatkan informasi ini untuk memprioritaskan fitur dan perbaikan bug.",
|
||||
"ApplicationURL": "URL Aplikasi",
|
||||
@@ -28,7 +28,7 @@
|
||||
"ClickToChangeQuality": "Klik untuk mengubah kualitas",
|
||||
"AlternateTitles": "Judul Lain",
|
||||
"AppDataDirectory": "Direktori AppData",
|
||||
"Connections": "Koleksi",
|
||||
"Connections": "Koneksi",
|
||||
"ExportCustomFormat": "Tambahkan Format Khusus",
|
||||
"AuthorClickToChangeBook": "Klik untuk mengubah film",
|
||||
"Automatic": "Otomatis",
|
||||
@@ -38,7 +38,7 @@
|
||||
"EnableRSS": "Aktifkan RSS",
|
||||
"MetadataSource": "Sumber Metadata",
|
||||
"Language": "Bahasa",
|
||||
"LogFiles": "Berkas Log",
|
||||
"LogFiles": "File Log",
|
||||
"MediaManagement": "Pengelolaan Media",
|
||||
"Metadata": "Metadata",
|
||||
"Queue": "Antrean",
|
||||
@@ -63,5 +63,27 @@
|
||||
"ProxyCheckFailedToTestMessage": "Gagal menguji proxy: {0}",
|
||||
"QualityProfiles": "Profil Kualitas",
|
||||
"StatusEndedEnded": "Berakhir",
|
||||
"UILanguageHelpText": "Bahasa yang digunakan UI Sonarr"
|
||||
"UILanguageHelpText": "Bahasa yang digunakan UI Sonarr",
|
||||
"Activity": "Aktivitas",
|
||||
"Backup": "Cadangan",
|
||||
"ConnectionLost": "Koneksi Terputus",
|
||||
"ConnectionLostReconnect": "{appName} akan mencoba untuk menghubungkan secara otomatis, atau silakan klik muat ulang di bawah.",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "Seluruh hasil disembunyikan karena penyaringan yang diterapkan",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Seluruh hasil disembunyikan karena penyaringan yang diterapkan",
|
||||
"Today": "Hari Ini",
|
||||
"TotalFileSize": "Jumlah Ukuran File",
|
||||
"Unmonitored": "Tidak Dimonitor",
|
||||
"ConnectSettings": "Pengaturan Koneksi",
|
||||
"Yesterday": "Kemarin",
|
||||
"ClickToChangeReleaseGroup": "Klik untuk mengubah rilis grup",
|
||||
"Connect": "Koneksi",
|
||||
"Continuing": "Berlanjut",
|
||||
"Edit": "Edit",
|
||||
"Files": "File",
|
||||
"AddNew": "Tambah",
|
||||
"Search": "Cari",
|
||||
"Refresh": "Muat Ulang",
|
||||
"ConnectionLostToBackend": "Koneksi {appName} telah terputus dari backend dan perlu dimuat ulang untuk dipulihkan.",
|
||||
"ApplyChanges": "Terapkan Perubahan",
|
||||
"History": "Riwayat"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user