mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-19 16:34:11 -04:00
Compare commits
91 Commits
v0.3.21.24
...
sonarr-pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa20047cd8 | ||
|
|
73979c416a | ||
|
|
348e8f9c27 | ||
|
|
38bdb5a75d | ||
|
|
5e4c51e2f7 | ||
|
|
99a65246a9 | ||
|
|
598ce9a9d2 | ||
|
|
42d6b9e703 | ||
|
|
8f595838aa | ||
|
|
3d9d7d3582 | ||
|
|
77cf28bd78 | ||
|
|
2fb1b8af20 | ||
|
|
af1f389f8e | ||
|
|
b5334da253 | ||
|
|
68b3904382 | ||
|
|
c8b09b9e29 | ||
|
|
d910fc42ab | ||
|
|
a6db8bfe0e | ||
|
|
2033d7e411 | ||
|
|
4a04e54ceb | ||
|
|
d57a9ab9b0 | ||
|
|
d333204194 | ||
|
|
c3676f8d33 | ||
|
|
932356be61 | ||
|
|
5b1b2a2d67 | ||
|
|
c362e8c467 | ||
|
|
67c00a8cc7 | ||
|
|
27a086dfff | ||
|
|
8ee0df9c65 | ||
|
|
da30b55902 | ||
|
|
c7226fc85f | ||
|
|
84f22dbadc | ||
|
|
06a53ef9ca | ||
|
|
b5ef0cda1e | ||
|
|
1b1290efac | ||
|
|
dcbc3ea3f8 | ||
|
|
9a7b2cb818 | ||
|
|
f9cba39f0a | ||
|
|
6b6ff4fe76 | ||
|
|
05d0fe2da6 | ||
|
|
7aab2b49e2 | ||
|
|
8887df92ed | ||
|
|
9ee651d6c0 | ||
|
|
5544e169a6 | ||
|
|
11d83165e5 | ||
|
|
9e6d1c581c | ||
|
|
66e20a0aec | ||
|
|
e639b36283 | ||
|
|
c9f4fb141f | ||
|
|
29a43fc2fd | ||
|
|
f9454b5b5a | ||
|
|
9aa6d47349 | ||
|
|
e09946d946 | ||
|
|
c9c5429120 | ||
|
|
ed7bd6c66d | ||
|
|
c88fe7cae8 | ||
|
|
68642579d0 | ||
|
|
f061d70d38 | ||
|
|
fd4a609f51 | ||
|
|
9957f734a5 | ||
|
|
695b8b2ae1 | ||
|
|
420824b279 | ||
|
|
badc2567c3 | ||
|
|
c8c81927d9 | ||
|
|
f9df843789 | ||
|
|
3cd39d4ee8 | ||
|
|
8a39ef4c56 | ||
|
|
ba1195fc1b | ||
|
|
7656142db4 | ||
|
|
74c3b45ef8 | ||
|
|
f7368d3d09 | ||
|
|
5d8e2300f2 | ||
|
|
1fb54c0da5 | ||
|
|
5a9a6e593b | ||
|
|
2d5fc655c0 | ||
|
|
cfcc9a5856 | ||
|
|
8c9555f82e | ||
|
|
ee20ba1811 | ||
|
|
4cf1215cfa | ||
|
|
a8ab099177 | ||
|
|
50af8a12d4 | ||
|
|
510c39c5d8 | ||
|
|
dd4a0121f2 | ||
|
|
4fb62c072a | ||
|
|
2b100d0f72 | ||
|
|
abfdc44f92 | ||
|
|
6e76f9966a | ||
|
|
2b6ceab9d4 | ||
|
|
b636729960 | ||
|
|
8af8366575 | ||
|
|
1d31e9b9d9 |
13
.devcontainer/Readarr.code-workspace
Normal file
13
.devcontainer/Readarr.code-workspace
Normal file
@@ -0,0 +1,13 @@
|
||||
// This file is used to open the backend and frontend in the same workspace, which is necessary as
|
||||
// the frontend has vscode settings that are distinct from the backend
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": ".."
|
||||
},
|
||||
{
|
||||
"path": "../frontend"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
19
.devcontainer/devcontainer.json
Normal file
19
.devcontainer/devcontainer.json
Normal file
@@ -0,0 +1,19 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
|
||||
{
|
||||
"name": "Readarr",
|
||||
"image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0",
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"nodeGypDependencies": true,
|
||||
"version": "16",
|
||||
"nvmVersion": "latest"
|
||||
}
|
||||
},
|
||||
"forwardPorts": [8787],
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": ["esbenp.prettier-vscode"]
|
||||
}
|
||||
}
|
||||
}
|
||||
12
.github/dependabot.yml
vendored
Normal file
12
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for more information:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
# https://containers.dev/guide/dependabot
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "devcontainers"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -125,6 +125,7 @@ coverage*.xml
|
||||
coverage*.json
|
||||
setup/Output/
|
||||
*.~is
|
||||
.mono
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
|
||||
7
.vscode/extensions.json
vendored
Normal file
7
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"esbenp.prettier-vscode",
|
||||
"ms-dotnettools.csdevkit",
|
||||
"ms-vscode-remote.remote-containers"
|
||||
]
|
||||
}
|
||||
26
.vscode/launch.json
vendored
Normal file
26
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||
// Use hover for the description of the existing attributes
|
||||
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md
|
||||
"name": "Run Readarr",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build dotnet",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/_output/net6.0/Readarr",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
|
||||
"console": "integratedTerminal",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Attach",
|
||||
"type": "coreclr",
|
||||
"request": "attach"
|
||||
}
|
||||
]
|
||||
}
|
||||
44
.vscode/tasks.json
vendored
Normal file
44
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build dotnet",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"msbuild",
|
||||
"-restore",
|
||||
"${workspaceFolder}/src/Readarr.sln",
|
||||
"-p:GenerateFullPaths=true",
|
||||
"-p:Configuration=Debug",
|
||||
"-p:Platform=Posix",
|
||||
"-consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "publish",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"publish",
|
||||
"${workspaceFolder}/src/Readarr.sln",
|
||||
"-property:GenerateFullPaths=true",
|
||||
"-consoleloggerparameters:NoSummary;ForceNoAlign"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "watch",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"watch",
|
||||
"run",
|
||||
"--project",
|
||||
"${workspaceFolder}/src/Readarr.sln"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -9,18 +9,18 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '0.3.21'
|
||||
majorVersion: '0.4.0'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
readarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
||||
sentryOrg: 'servarr'
|
||||
sentryUrl: 'https://sentry.servarr.com'
|
||||
dotnetVersion: '6.0.417'
|
||||
dotnetVersion: '6.0.424'
|
||||
nodeVersion: '20.X'
|
||||
innoVersion: '6.2.0'
|
||||
windowsImage: 'windows-2022'
|
||||
linuxImage: 'ubuntu-20.04'
|
||||
macImage: 'macOS-11'
|
||||
macImage: 'macOS-12'
|
||||
|
||||
trigger:
|
||||
branches:
|
||||
@@ -166,10 +166,10 @@ stages:
|
||||
pool:
|
||||
vmImage: $(imageName)
|
||||
steps:
|
||||
- task: NodeTool@0
|
||||
- task: UseNode@1
|
||||
displayName: Set Node.js version
|
||||
inputs:
|
||||
versionSpec: $(nodeVersion)
|
||||
version: $(nodeVersion)
|
||||
- checkout: self
|
||||
submodules: true
|
||||
fetchDepth: 1
|
||||
@@ -1075,10 +1075,10 @@ stages:
|
||||
pool:
|
||||
vmImage: $(imageName)
|
||||
steps:
|
||||
- task: NodeTool@0
|
||||
- task: UseNode@1
|
||||
displayName: Set Node.js version
|
||||
inputs:
|
||||
versionSpec: $(nodeVersion)
|
||||
version: $(nodeVersion)
|
||||
- checkout: self
|
||||
submodules: true
|
||||
fetchDepth: 1
|
||||
@@ -1102,7 +1102,7 @@ stages:
|
||||
vmImage: ${{ variables.windowsImage }}
|
||||
steps:
|
||||
- checkout: self # Need history for Sonar analysis
|
||||
- task: SonarCloudPrepare@1
|
||||
- task: SonarCloudPrepare@2
|
||||
env:
|
||||
SONAR_SCANNER_OPTS: ''
|
||||
inputs:
|
||||
@@ -1114,7 +1114,7 @@ stages:
|
||||
cliProjectName: 'ReadarrUI'
|
||||
cliProjectVersion: '$(readarrVersion)'
|
||||
cliSources: './frontend'
|
||||
- task: SonarCloudAnalyze@1
|
||||
- task: SonarCloudAnalyze@2
|
||||
|
||||
- job: Api_Docs
|
||||
displayName: API Docs
|
||||
@@ -1190,7 +1190,7 @@ stages:
|
||||
submodules: true
|
||||
- powershell: Set-Service SCardSvr -StartupType Manual
|
||||
displayName: Enable Windows Test Service
|
||||
- task: SonarCloudPrepare@1
|
||||
- task: SonarCloudPrepare@2
|
||||
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
||||
inputs:
|
||||
SonarCloud: 'SonarCloud'
|
||||
@@ -1208,21 +1208,16 @@ stages:
|
||||
./build.sh --backend -f net6.0 -r win-x64
|
||||
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage
|
||||
displayName: Coverage Unit Tests
|
||||
- task: SonarCloudAnalyze@1
|
||||
- task: SonarCloudAnalyze@2
|
||||
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
||||
displayName: Publish SonarCloud Results
|
||||
- task: reportgenerator@4
|
||||
- task: reportgenerator@5
|
||||
displayName: Generate Coverage Report
|
||||
inputs:
|
||||
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
|
||||
targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined'
|
||||
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
|
||||
- task: PublishCodeCoverageResults@1
|
||||
displayName: Publish Coverage Report
|
||||
inputs:
|
||||
codeCoverageTool: 'cobertura'
|
||||
summaryFileLocation: './CoverageResults/combined/Cobertura.xml'
|
||||
reportDirectory: './CoverageResults/combined/'
|
||||
publishCodeCoverageResults: true
|
||||
|
||||
- stage: Report_Out
|
||||
dependsOn:
|
||||
|
||||
14
docs.sh
14
docs.sh
@@ -1,3 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
FRAMEWORK="net6.0"
|
||||
PLATFORM=$1
|
||||
|
||||
if [ "$PLATFORM" = "Windows" ]; then
|
||||
@@ -21,15 +25,21 @@ slnFile=src/Readarr.sln
|
||||
|
||||
platform=Posix
|
||||
|
||||
if [ "$PLATFORM" = "Windows" ]; then
|
||||
application=Readarr.Console.dll
|
||||
else
|
||||
application=Readarr.dll
|
||||
fi
|
||||
|
||||
dotnet clean $slnFile -c Debug
|
||||
dotnet clean $slnFile -c Release
|
||||
|
||||
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
|
||||
|
||||
dotnet new tool-manifest
|
||||
dotnet tool install --version 6.5.0 Swashbuckle.AspNetCore.Cli
|
||||
dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli
|
||||
|
||||
dotnet tool run swagger tofile --output ./src/Readarr.Api.V1/openapi.json "$outputFolder/net6.0/$RUNTIME/Readarr.console.dll" v1 &
|
||||
dotnet tool run swagger tofile --output ./src/Readarr.Api.V1/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v1 &
|
||||
|
||||
sleep 45
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
.input {
|
||||
composes: input from '~Components/Form/TextInput.css';
|
||||
|
||||
font-family: $passwordFamily;
|
||||
}
|
||||
@@ -1,7 +1,5 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import TextInput from './TextInput';
|
||||
import styles from './PasswordInput.css';
|
||||
|
||||
// Prevent a user from copying (or cutting) the password from the input
|
||||
function onCopy(e) {
|
||||
@@ -13,17 +11,14 @@ function PasswordInput(props) {
|
||||
return (
|
||||
<TextInput
|
||||
{...props}
|
||||
type="password"
|
||||
onCopy={onCopy}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
PasswordInput.propTypes = {
|
||||
className: PropTypes.string.isRequired
|
||||
};
|
||||
|
||||
PasswordInput.defaultProps = {
|
||||
className: styles.input
|
||||
...TextInput.props
|
||||
};
|
||||
|
||||
export default PasswordInput;
|
||||
|
||||
@@ -4,6 +4,7 @@ import AppUpdatedModalConnector from 'App/AppUpdatedModalConnector';
|
||||
import ColorImpairedContext from 'App/ColorImpairedContext';
|
||||
import ConnectionLostModalConnector from 'App/ConnectionLostModalConnector';
|
||||
import SignalRConnector from 'Components/SignalRConnector';
|
||||
import AuthenticationRequiredModal from 'FirstRun/AuthenticationRequiredModal';
|
||||
import locationShape from 'Helpers/Props/Shapes/locationShape';
|
||||
import PageHeader from './Header/PageHeader';
|
||||
import PageSidebar from './Sidebar/PageSidebar';
|
||||
@@ -75,6 +76,7 @@ class Page extends Component {
|
||||
isSmallScreen,
|
||||
isSidebarVisible,
|
||||
enableColorImpairedMode,
|
||||
authenticationEnabled,
|
||||
onSidebarToggle,
|
||||
onSidebarVisibleChange
|
||||
} = this.props;
|
||||
@@ -108,6 +110,10 @@ class Page extends Component {
|
||||
isOpen={this.state.isConnectionLostModalOpen}
|
||||
onModalClose={this.onConnectionLostModalClose}
|
||||
/>
|
||||
|
||||
<AuthenticationRequiredModal
|
||||
isOpen={!authenticationEnabled}
|
||||
/>
|
||||
</div>
|
||||
</ColorImpairedContext.Provider>
|
||||
);
|
||||
@@ -123,6 +129,7 @@ Page.propTypes = {
|
||||
isUpdated: PropTypes.bool.isRequired,
|
||||
isDisconnected: PropTypes.bool.isRequired,
|
||||
enableColorImpairedMode: PropTypes.bool.isRequired,
|
||||
authenticationEnabled: PropTypes.bool.isRequired,
|
||||
onResize: PropTypes.func.isRequired,
|
||||
onSidebarToggle: PropTypes.func.isRequired,
|
||||
onSidebarVisibleChange: PropTypes.func.isRequired
|
||||
|
||||
@@ -18,6 +18,7 @@ import {
|
||||
import { fetchStatus } from 'Store/Actions/systemActions';
|
||||
import { fetchTags } from 'Store/Actions/tagActions';
|
||||
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
||||
import createSystemStatusSelector from 'Store/Selectors/createSystemStatusSelector';
|
||||
import ErrorPage from './ErrorPage';
|
||||
import LoadingPage from './LoadingPage';
|
||||
import Page from './Page';
|
||||
@@ -153,18 +154,21 @@ function createMapStateToProps() {
|
||||
selectErrors,
|
||||
selectAppProps,
|
||||
createDimensionsSelector(),
|
||||
createSystemStatusSelector(),
|
||||
(
|
||||
enableColorImpairedMode,
|
||||
isPopulated,
|
||||
errors,
|
||||
app,
|
||||
dimensions
|
||||
dimensions,
|
||||
systemStatus
|
||||
) => {
|
||||
return {
|
||||
...app,
|
||||
...errors,
|
||||
isPopulated,
|
||||
isSmallScreen: dimensions.isSmallScreen,
|
||||
authenticationEnabled: systemStatus.authentication !== 'none',
|
||||
enableColorImpairedMode
|
||||
};
|
||||
}
|
||||
|
||||
@@ -253,7 +253,7 @@ class SignalRConnector extends Component {
|
||||
handleWantedCutoff = (body) => {
|
||||
if (body.action === 'updated') {
|
||||
this.props.dispatchUpdateItem({
|
||||
section: 'cutoffUnmet',
|
||||
section: 'wanted.cutoffUnmet',
|
||||
updateOnly: true,
|
||||
...body.resource
|
||||
});
|
||||
@@ -263,7 +263,7 @@ class SignalRConnector extends Component {
|
||||
handleWantedMissing = (body) => {
|
||||
if (body.action === 'updated') {
|
||||
this.props.dispatchUpdateItem({
|
||||
section: 'missing',
|
||||
section: 'wanted.missing',
|
||||
updateOnly: true,
|
||||
...body.resource
|
||||
});
|
||||
|
||||
@@ -25,14 +25,3 @@
|
||||
font-family: 'Ubuntu Mono';
|
||||
src: url('UbuntuMono-Regular.eot?#iefix&v=1.3.0') format('embedded-opentype'), url('UbuntuMono-Regular.woff?v=1.3.0') format('woff'), url('UbuntuMono-Regular.ttf?v=1.3.0') format('truetype');
|
||||
}
|
||||
|
||||
/*
|
||||
* text-security-disc
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-family: 'text-security-disc';
|
||||
src: url('text-security-disc.woff?v=1.3.0') format('woff'), url('text-security-disc.ttf?v=1.3.0') format('truetype');
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -15,5 +15,5 @@
|
||||
"start_url": "../../../../",
|
||||
"theme_color": "#3a3f51",
|
||||
"background_color": "#3a3f51",
|
||||
"display": "minimal-ui"
|
||||
"display": "standalone"
|
||||
}
|
||||
|
||||
34
frontend/src/FirstRun/AuthenticationRequiredModal.js
Normal file
34
frontend/src/FirstRun/AuthenticationRequiredModal.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Modal from 'Components/Modal/Modal';
|
||||
import { sizes } from 'Helpers/Props';
|
||||
import AuthenticationRequiredModalContentConnector from './AuthenticationRequiredModalContentConnector';
|
||||
|
||||
function onModalClose() {
|
||||
// No-op
|
||||
}
|
||||
|
||||
function AuthenticationRequiredModal(props) {
|
||||
const {
|
||||
isOpen
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<Modal
|
||||
size={sizes.MEDIUM}
|
||||
isOpen={isOpen}
|
||||
closeOnBackgroundClick={false}
|
||||
onModalClose={onModalClose}
|
||||
>
|
||||
<AuthenticationRequiredModalContentConnector
|
||||
onModalClose={onModalClose}
|
||||
/>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
|
||||
AuthenticationRequiredModal.propTypes = {
|
||||
isOpen: PropTypes.bool.isRequired
|
||||
};
|
||||
|
||||
export default AuthenticationRequiredModal;
|
||||
@@ -0,0 +1,5 @@
|
||||
.authRequiredAlert {
|
||||
composes: alert from '~Components/Alert.css';
|
||||
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
// This file is automatically generated.
|
||||
// Please do not change this file!
|
||||
interface CssExports {
|
||||
'input': string;
|
||||
'authRequiredAlert': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
170
frontend/src/FirstRun/AuthenticationRequiredModalContent.js
Normal file
170
frontend/src/FirstRun/AuthenticationRequiredModalContent.js
Normal file
@@ -0,0 +1,170 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { useEffect, useRef } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import FormGroup from 'Components/Form/FormGroup';
|
||||
import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||
import FormLabel from 'Components/Form/FormLabel';
|
||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import ModalBody from 'Components/Modal/ModalBody';
|
||||
import ModalContent from 'Components/Modal/ModalContent';
|
||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||
import { inputTypes, kinds } from 'Helpers/Props';
|
||||
import { authenticationMethodOptions, authenticationRequiredOptions } from 'Settings/General/SecuritySettings';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './AuthenticationRequiredModalContent.css';
|
||||
|
||||
function onModalClose() {
|
||||
// No-op
|
||||
}
|
||||
|
||||
function AuthenticationRequiredModalContent(props) {
|
||||
const {
|
||||
isPopulated,
|
||||
error,
|
||||
isSaving,
|
||||
settings,
|
||||
onInputChange,
|
||||
onSavePress,
|
||||
dispatchFetchStatus
|
||||
} = props;
|
||||
|
||||
const {
|
||||
authenticationMethod,
|
||||
authenticationRequired,
|
||||
username,
|
||||
password,
|
||||
passwordConfirmation
|
||||
} = settings;
|
||||
|
||||
const authenticationEnabled = authenticationMethod && authenticationMethod.value !== 'none';
|
||||
|
||||
const didMount = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (!isSaving && didMount.current) {
|
||||
dispatchFetchStatus();
|
||||
}
|
||||
|
||||
didMount.current = true;
|
||||
}, [isSaving, dispatchFetchStatus]);
|
||||
|
||||
return (
|
||||
<ModalContent
|
||||
showCloseButton={false}
|
||||
onModalClose={onModalClose}
|
||||
>
|
||||
<ModalHeader>
|
||||
{translate('AuthenticationRequired')}
|
||||
</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
<Alert
|
||||
className={styles.authRequiredAlert}
|
||||
kind={kinds.WARNING}
|
||||
>
|
||||
{translate('AuthenticationRequiredWarning')}
|
||||
</Alert>
|
||||
|
||||
{
|
||||
isPopulated && !error ?
|
||||
<div>
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('AuthenticationMethod')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="authenticationMethod"
|
||||
values={authenticationMethodOptions}
|
||||
helpText={translate('AuthenticationMethodHelpText')}
|
||||
helpTextWarning={authenticationMethod.value === 'none' ? translate('AuthenticationMethodHelpTextWarning') : undefined}
|
||||
helpLink="https://wiki.servarr.com/readarr/faq#forced-authentication"
|
||||
onChange={onInputChange}
|
||||
{...authenticationMethod}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('AuthenticationRequired')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="authenticationRequired"
|
||||
values={authenticationRequiredOptions}
|
||||
helpText={translate('AuthenticationRequiredHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...authenticationRequired}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('Username')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
name="username"
|
||||
onChange={onInputChange}
|
||||
helpTextWarning={username?.value ? undefined : translate('AuthenticationRequiredUsernameHelpTextWarning')}
|
||||
{...username}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('Password')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.PASSWORD}
|
||||
name="password"
|
||||
onChange={onInputChange}
|
||||
helpTextWarning={password?.value ? undefined : translate('AuthenticationRequiredPasswordHelpTextWarning')}
|
||||
{...password}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('PasswordConfirmation')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.PASSWORD}
|
||||
name="passwordConfirmation"
|
||||
onChange={onInputChange}
|
||||
helpTextWarning={passwordConfirmation?.value ? undefined : translate('AuthenticationRequiredPasswordConfirmationHelpTextWarning')}
|
||||
{...passwordConfirmation}
|
||||
/>
|
||||
</FormGroup>
|
||||
</div> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
!isPopulated && !error ? <LoadingIndicator /> : null
|
||||
}
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
<SpinnerButton
|
||||
kind={kinds.PRIMARY}
|
||||
isSpinning={isSaving}
|
||||
isDisabled={!authenticationEnabled}
|
||||
onPress={onSavePress}
|
||||
>
|
||||
{translate('Save')}
|
||||
</SpinnerButton>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
);
|
||||
}
|
||||
|
||||
AuthenticationRequiredModalContent.propTypes = {
|
||||
isPopulated: PropTypes.bool.isRequired,
|
||||
error: PropTypes.object,
|
||||
isSaving: PropTypes.bool.isRequired,
|
||||
saveError: PropTypes.object,
|
||||
settings: PropTypes.object.isRequired,
|
||||
onInputChange: PropTypes.func.isRequired,
|
||||
onSavePress: PropTypes.func.isRequired,
|
||||
dispatchFetchStatus: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default AuthenticationRequiredModalContent;
|
||||
@@ -0,0 +1,86 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { clearPendingChanges } from 'Store/Actions/baseActions';
|
||||
import { fetchGeneralSettings, saveGeneralSettings, setGeneralSettingsValue } from 'Store/Actions/settingsActions';
|
||||
import { fetchStatus } from 'Store/Actions/systemActions';
|
||||
import createSettingsSectionSelector from 'Store/Selectors/createSettingsSectionSelector';
|
||||
import AuthenticationRequiredModalContent from './AuthenticationRequiredModalContent';
|
||||
|
||||
const SECTION = 'general';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createSettingsSectionSelector(SECTION),
|
||||
(sectionSettings) => {
|
||||
return {
|
||||
...sectionSettings
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
const mapDispatchToProps = {
|
||||
dispatchClearPendingChanges: clearPendingChanges,
|
||||
dispatchSetGeneralSettingsValue: setGeneralSettingsValue,
|
||||
dispatchSaveGeneralSettings: saveGeneralSettings,
|
||||
dispatchFetchGeneralSettings: fetchGeneralSettings,
|
||||
dispatchFetchStatus: fetchStatus
|
||||
};
|
||||
|
||||
class AuthenticationRequiredModalContentConnector extends Component {
|
||||
|
||||
//
|
||||
// Lifecycle
|
||||
|
||||
componentDidMount() {
|
||||
this.props.dispatchFetchGeneralSettings();
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.props.dispatchClearPendingChanges({ section: `settings.${SECTION}` });
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
onInputChange = ({ name, value }) => {
|
||||
this.props.dispatchSetGeneralSettingsValue({ name, value });
|
||||
};
|
||||
|
||||
onSavePress = () => {
|
||||
this.props.dispatchSaveGeneralSettings();
|
||||
};
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
const {
|
||||
dispatchClearPendingChanges,
|
||||
dispatchFetchGeneralSettings,
|
||||
dispatchSetGeneralSettingsValue,
|
||||
dispatchSaveGeneralSettings,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<AuthenticationRequiredModalContent
|
||||
{...otherProps}
|
||||
onInputChange={this.onInputChange}
|
||||
onSavePress={this.onSavePress}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
AuthenticationRequiredModalContentConnector.propTypes = {
|
||||
dispatchClearPendingChanges: PropTypes.func.isRequired,
|
||||
dispatchFetchGeneralSettings: PropTypes.func.isRequired,
|
||||
dispatchSetGeneralSettingsValue: PropTypes.func.isRequired,
|
||||
dispatchSaveGeneralSettings: PropTypes.func.isRequired,
|
||||
dispatchFetchStatus: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default connect(createMapStateToProps, mapDispatchToProps)(AuthenticationRequiredModalContentConnector);
|
||||
@@ -47,14 +47,16 @@ class InteractiveImportRow extends Component {
|
||||
author,
|
||||
book,
|
||||
foreignEditionId,
|
||||
quality
|
||||
quality,
|
||||
size
|
||||
} = this.props;
|
||||
|
||||
if (
|
||||
author &&
|
||||
book != null &&
|
||||
foreignEditionId &&
|
||||
quality
|
||||
quality &&
|
||||
size > 0
|
||||
) {
|
||||
this.props.onSelectedChange({ id, value: true });
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import TextInput from 'Components/Form/TextInput';
|
||||
import Icon from 'Components/Icon';
|
||||
import Button from 'Components/Link/Button';
|
||||
@@ -7,7 +8,7 @@ import Link from 'Components/Link/Link';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
import PageContent from 'Components/Page/PageContent';
|
||||
import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import getErrorMessage from 'Utilities/Object/getErrorMessage';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import AddNewAuthorSearchResultConnector from './Author/AddNewAuthorSearchResultConnector';
|
||||
@@ -127,9 +128,16 @@ class AddNewItem extends Component {
|
||||
!isFetching && !!error ?
|
||||
<div className={styles.message}>
|
||||
<div className={styles.helpText}>
|
||||
Failed to load search results, please try again.
|
||||
{translate('FailedLoadingSearchResults')}
|
||||
</div>
|
||||
|
||||
<Alert kind={kinds.WARNING}>{getErrorMessage(error)}</Alert>
|
||||
|
||||
<div>
|
||||
<Link to="https://wiki.servarr.com/readarr/troubleshooting#invalid-response-received-from-metadata-api">
|
||||
{translate('WhySearchesCouldBeFailing')}
|
||||
</Link>
|
||||
</div>
|
||||
<div>{getErrorMessage(error)}</div>
|
||||
</div> : null
|
||||
}
|
||||
|
||||
|
||||
@@ -25,3 +25,8 @@
|
||||
border-radius: 4px;
|
||||
background-color: var(--cardCenterBackgroundColor);
|
||||
}
|
||||
|
||||
.customFormats {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
interface CssExports {
|
||||
'addSpecification': string;
|
||||
'center': string;
|
||||
'customFormats': string;
|
||||
'deleteButton': string;
|
||||
'rightButtons': string;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Card from 'Components/Card';
|
||||
import FieldSet from 'Components/FieldSet';
|
||||
import Form from 'Components/Form/Form';
|
||||
@@ -150,6 +151,11 @@ class EditCustomFormatModalContent extends Component {
|
||||
</Form>
|
||||
|
||||
<FieldSet legend={translate('Conditions')}>
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{translate('CustomFormatsSettingsTriggerInfo')}
|
||||
</div>
|
||||
</Alert>
|
||||
<div className={styles.customFormats}>
|
||||
{
|
||||
specifications.map((tag) => {
|
||||
|
||||
@@ -15,6 +15,7 @@ import ModalContent from 'Components/Modal/ModalContent';
|
||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||
import { inputTypes, kinds, sizes } from 'Helpers/Props';
|
||||
import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './EditDownloadClientModalContent.css';
|
||||
|
||||
@@ -37,6 +38,7 @@ class EditDownloadClientModalContent extends Component {
|
||||
onModalClose,
|
||||
onSavePress,
|
||||
onTestPress,
|
||||
onAdvancedSettingsPress,
|
||||
onDeleteDownloadClientPress,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
@@ -205,6 +207,12 @@ class EditDownloadClientModalContent extends Component {
|
||||
</Button>
|
||||
}
|
||||
|
||||
<AdvancedSettingsButton
|
||||
advancedSettings={advancedSettings}
|
||||
onAdvancedSettingsPress={onAdvancedSettingsPress}
|
||||
showLabel={false}
|
||||
/>
|
||||
|
||||
<SpinnerErrorButton
|
||||
isSpinning={isTesting}
|
||||
error={saveError}
|
||||
@@ -245,6 +253,7 @@ EditDownloadClientModalContent.propTypes = {
|
||||
onModalClose: PropTypes.func.isRequired,
|
||||
onSavePress: PropTypes.func.isRequired,
|
||||
onTestPress: PropTypes.func.isRequired,
|
||||
onAdvancedSettingsPress: PropTypes.func.isRequired,
|
||||
onDeleteDownloadClientPress: PropTypes.func
|
||||
};
|
||||
|
||||
|
||||
@@ -2,7 +2,13 @@ import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { saveDownloadClient, setDownloadClientFieldValue, setDownloadClientValue, testDownloadClient } from 'Store/Actions/settingsActions';
|
||||
import {
|
||||
saveDownloadClient,
|
||||
setDownloadClientFieldValue,
|
||||
setDownloadClientValue,
|
||||
testDownloadClient,
|
||||
toggleAdvancedSettings
|
||||
} from 'Store/Actions/settingsActions';
|
||||
import createProviderSettingsSelector from 'Store/Selectors/createProviderSettingsSelector';
|
||||
import EditDownloadClientModalContent from './EditDownloadClientModalContent';
|
||||
|
||||
@@ -23,7 +29,8 @@ const mapDispatchToProps = {
|
||||
setDownloadClientValue,
|
||||
setDownloadClientFieldValue,
|
||||
saveDownloadClient,
|
||||
testDownloadClient
|
||||
testDownloadClient,
|
||||
toggleAdvancedSettings
|
||||
};
|
||||
|
||||
class EditDownloadClientModalContentConnector extends Component {
|
||||
@@ -56,6 +63,10 @@ class EditDownloadClientModalContentConnector extends Component {
|
||||
this.props.testDownloadClient({ id: this.props.id });
|
||||
};
|
||||
|
||||
onAdvancedSettingsPress = () => {
|
||||
this.props.toggleAdvancedSettings();
|
||||
};
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
@@ -65,6 +76,7 @@ class EditDownloadClientModalContentConnector extends Component {
|
||||
{...this.props}
|
||||
onSavePress={this.onSavePress}
|
||||
onTestPress={this.onTestPress}
|
||||
onAdvancedSettingsPress={this.onAdvancedSettingsPress}
|
||||
onInputChange={this.onInputChange}
|
||||
onFieldChange={this.onFieldChange}
|
||||
/>
|
||||
@@ -82,6 +94,7 @@ EditDownloadClientModalContentConnector.propTypes = {
|
||||
setDownloadClientFieldValue: PropTypes.func.isRequired,
|
||||
saveDownloadClient: PropTypes.func.isRequired,
|
||||
testDownloadClient: PropTypes.func.isRequired,
|
||||
toggleAdvancedSettings: PropTypes.func.isRequired,
|
||||
onModalClose: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -11,16 +11,69 @@ import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import { icons, inputTypes, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
const authenticationMethodOptions = [
|
||||
{ key: 'none', value: 'None' },
|
||||
{ key: 'basic', value: 'Basic (Browser Popup)' },
|
||||
{ key: 'forms', value: 'Forms (Login Page)' }
|
||||
export const authenticationMethodOptions = [
|
||||
{
|
||||
key: 'none',
|
||||
get value() {
|
||||
return translate('None');
|
||||
},
|
||||
isDisabled: true
|
||||
},
|
||||
{
|
||||
key: 'external',
|
||||
get value() {
|
||||
return translate('External');
|
||||
},
|
||||
isHidden: true
|
||||
},
|
||||
{
|
||||
key: 'basic',
|
||||
get value() {
|
||||
return translate('AuthBasic');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'forms',
|
||||
get value() {
|
||||
return translate('AuthForm');
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
export const authenticationRequiredOptions = [
|
||||
{
|
||||
key: 'enabled',
|
||||
get value() {
|
||||
return translate('Enabled');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'disabledForLocalAddresses',
|
||||
get value() {
|
||||
return translate('DisabledForLocalAddresses');
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
const certificateValidationOptions = [
|
||||
{ key: 'enabled', value: 'Enabled' },
|
||||
{ key: 'disabledForLocalAddresses', value: 'Disabled for Local Addresses' },
|
||||
{ key: 'disabled', value: 'Disabled' }
|
||||
{
|
||||
key: 'enabled',
|
||||
get value() {
|
||||
return translate('Enabled');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'disabledForLocalAddresses',
|
||||
get value() {
|
||||
return translate('DisabledForLocalAddresses');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'disabled',
|
||||
get value() {
|
||||
return translate('Disabled');
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
class SecuritySettings extends Component {
|
||||
@@ -68,8 +121,10 @@ class SecuritySettings extends Component {
|
||||
|
||||
const {
|
||||
authenticationMethod,
|
||||
authenticationRequired,
|
||||
username,
|
||||
password,
|
||||
passwordConfirmation,
|
||||
apiKey,
|
||||
certificateValidation
|
||||
} = settings;
|
||||
@@ -79,26 +134,40 @@ class SecuritySettings extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('Security')}>
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
{translate('Authentication')}
|
||||
</FormLabel>
|
||||
<FormLabel>{translate('Authentication')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="authenticationMethod"
|
||||
values={authenticationMethodOptions}
|
||||
helpText={translate('AuthenticationMethodHelpText')}
|
||||
helpTextWarning={translate('AuthenticationRequiredWarning')}
|
||||
onChange={onInputChange}
|
||||
{...authenticationMethod}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
authenticationEnabled &&
|
||||
authenticationEnabled ?
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
{translate('Username')}
|
||||
</FormLabel>
|
||||
<FormLabel>{translate('AuthenticationRequired')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="authenticationRequired"
|
||||
values={authenticationRequiredOptions}
|
||||
helpText={translate('AuthenticationRequiredHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...authenticationRequired}
|
||||
/>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
authenticationEnabled ?
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('Username')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
@@ -106,15 +175,14 @@ class SecuritySettings extends Component {
|
||||
onChange={onInputChange}
|
||||
{...username}
|
||||
/>
|
||||
</FormGroup>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
authenticationEnabled &&
|
||||
authenticationEnabled ?
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
{translate('Password')}
|
||||
</FormLabel>
|
||||
<FormLabel>{translate('Password')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.PASSWORD}
|
||||
@@ -122,19 +190,33 @@ class SecuritySettings extends Component {
|
||||
onChange={onInputChange}
|
||||
{...password}
|
||||
/>
|
||||
</FormGroup>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
authenticationEnabled ?
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('PasswordConfirmation')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.PASSWORD}
|
||||
name="passwordConfirmation"
|
||||
onChange={onInputChange}
|
||||
{...passwordConfirmation}
|
||||
/>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
{translate('APIKey')}
|
||||
</FormLabel>
|
||||
<FormLabel>{translate('ApiKey')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
name="apiKey"
|
||||
readOnly={true}
|
||||
helpTextWarning={translate('ApiKeyHelpTextWarning')}
|
||||
helpTextWarning={translate('RestartRequiredHelpTextWarning')}
|
||||
buttons={[
|
||||
<ClipboardButton
|
||||
key="copy"
|
||||
@@ -160,9 +242,7 @@ class SecuritySettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
{translate('CertificateValidation')}
|
||||
</FormLabel>
|
||||
<FormLabel>{translate('CertificateValidation')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
|
||||
@@ -20,6 +20,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
|
||||
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||
import Popover from 'Components/Tooltip/Popover';
|
||||
import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props';
|
||||
import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton';
|
||||
import formatShortTimeSpan from 'Utilities/Date/formatShortTimeSpan';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './EditImportListModalContent.css';
|
||||
@@ -66,6 +67,7 @@ function EditImportListModalContent(props) {
|
||||
onModalClose,
|
||||
onSavePress,
|
||||
onTestPress,
|
||||
onAdvancedSettingsPress,
|
||||
onDeleteImportListPress,
|
||||
showMetadataProfile,
|
||||
...otherProps
|
||||
@@ -332,6 +334,12 @@ function EditImportListModalContent(props) {
|
||||
</Button>
|
||||
}
|
||||
|
||||
<AdvancedSettingsButton
|
||||
advancedSettings={advancedSettings}
|
||||
onAdvancedSettingsPress={onAdvancedSettingsPress}
|
||||
showLabel={false}
|
||||
/>
|
||||
|
||||
<SpinnerErrorButton
|
||||
isSpinning={isTesting}
|
||||
error={saveError}
|
||||
@@ -372,6 +380,7 @@ EditImportListModalContent.propTypes = {
|
||||
onModalClose: PropTypes.func.isRequired,
|
||||
onSavePress: PropTypes.func.isRequired,
|
||||
onTestPress: PropTypes.func.isRequired,
|
||||
onAdvancedSettingsPress: PropTypes.func.isRequired,
|
||||
onDeleteImportListPress: PropTypes.func
|
||||
};
|
||||
|
||||
|
||||
@@ -2,7 +2,13 @@ import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { saveImportList, setImportListFieldValue, setImportListValue, testImportList } from 'Store/Actions/settingsActions';
|
||||
import {
|
||||
saveImportList,
|
||||
setImportListFieldValue,
|
||||
setImportListValue,
|
||||
testImportList,
|
||||
toggleAdvancedSettings
|
||||
} from 'Store/Actions/settingsActions';
|
||||
import createProviderSettingsSelector from 'Store/Selectors/createProviderSettingsSelector';
|
||||
import EditImportListModalContent from './EditImportListModalContent';
|
||||
|
||||
@@ -25,7 +31,8 @@ const mapDispatchToProps = {
|
||||
setImportListValue,
|
||||
setImportListFieldValue,
|
||||
saveImportList,
|
||||
testImportList
|
||||
testImportList,
|
||||
toggleAdvancedSettings
|
||||
};
|
||||
|
||||
class EditImportListModalContentConnector extends Component {
|
||||
@@ -58,6 +65,10 @@ class EditImportListModalContentConnector extends Component {
|
||||
this.props.testImportList({ id: this.props.id });
|
||||
};
|
||||
|
||||
onAdvancedSettingsPress = () => {
|
||||
this.props.toggleAdvancedSettings();
|
||||
};
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
@@ -67,6 +78,7 @@ class EditImportListModalContentConnector extends Component {
|
||||
{...this.props}
|
||||
onSavePress={this.onSavePress}
|
||||
onTestPress={this.onTestPress}
|
||||
onAdvancedSettingsPress={this.onAdvancedSettingsPress}
|
||||
onInputChange={this.onInputChange}
|
||||
onFieldChange={this.onFieldChange}
|
||||
/>
|
||||
@@ -84,6 +96,7 @@ EditImportListModalContentConnector.propTypes = {
|
||||
setImportListFieldValue: PropTypes.func.isRequired,
|
||||
saveImportList: PropTypes.func.isRequired,
|
||||
testImportList: PropTypes.func.isRequired,
|
||||
toggleAdvancedSettings: PropTypes.func.isRequired,
|
||||
onModalClose: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import TagListConnector from 'Components/TagListConnector';
|
||||
import { createMetadataProfileSelectorForHook } from 'Store/Selectors/createMetadataProfileSelector';
|
||||
import { createQualityProfileSelectorForHook } from 'Store/Selectors/createQualityProfileSelector';
|
||||
import { SelectStateInputProps } from 'typings/props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './ManageImportListsModalRow.css';
|
||||
|
||||
interface ManageImportListsModalRowProps {
|
||||
@@ -70,7 +71,7 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) {
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.qualityProfileId}>
|
||||
{qualityProfile?.name ?? 'None'}
|
||||
{qualityProfile?.name ?? translate('None')}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.metadataProfileId}>
|
||||
@@ -82,7 +83,7 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) {
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.enableAutomaticAdd}>
|
||||
{enableAutomaticAdd ? 'Yes' : 'No'}
|
||||
{enableAutomaticAdd ? translate('Yes') : translate('No')}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.tags}>
|
||||
|
||||
@@ -75,12 +75,12 @@ class RootFolder extends Component {
|
||||
{path}
|
||||
</Label>
|
||||
|
||||
<Label kind={kinds.SUCCESS}>
|
||||
{qualityProfile.name}
|
||||
<Label kind={qualityProfile?.name ? kinds.SUCCESS : kinds.DANGER}>
|
||||
{qualityProfile?.name || translate('None')}
|
||||
</Label>
|
||||
|
||||
<Label kind={kinds.SUCCESS}>
|
||||
{metadataProfile.name}
|
||||
<Label kind={metadataProfile?.name ? kinds.SUCCESS : kinds.DANGER}>
|
||||
{metadataProfile?.name || translate('None')}
|
||||
</Label>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ import ModalContent from 'Components/Modal/ModalContent';
|
||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||
import { inputTypes, kinds } from 'Helpers/Props';
|
||||
import AdvancedSettingsButton from 'Settings/AdvancedSettingsButton';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import NotificationEventItems from './NotificationEventItems';
|
||||
import styles from './EditNotificationModalContent.css';
|
||||
@@ -32,6 +33,7 @@ function EditNotificationModalContent(props) {
|
||||
onModalClose,
|
||||
onSavePress,
|
||||
onTestPress,
|
||||
onAdvancedSettingsPress,
|
||||
onDeleteNotificationPress,
|
||||
...otherProps
|
||||
} = props;
|
||||
@@ -140,6 +142,12 @@ function EditNotificationModalContent(props) {
|
||||
</Button>
|
||||
}
|
||||
|
||||
<AdvancedSettingsButton
|
||||
advancedSettings={advancedSettings}
|
||||
onAdvancedSettingsPress={onAdvancedSettingsPress}
|
||||
showLabel={false}
|
||||
/>
|
||||
|
||||
<SpinnerErrorButton
|
||||
isSpinning={isTesting}
|
||||
error={saveError}
|
||||
@@ -179,6 +187,7 @@ EditNotificationModalContent.propTypes = {
|
||||
onModalClose: PropTypes.func.isRequired,
|
||||
onSavePress: PropTypes.func.isRequired,
|
||||
onTestPress: PropTypes.func.isRequired,
|
||||
onAdvancedSettingsPress: PropTypes.func.isRequired,
|
||||
onDeleteNotificationPress: PropTypes.func
|
||||
};
|
||||
|
||||
|
||||
@@ -2,7 +2,13 @@ import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { saveNotification, setNotificationFieldValue, setNotificationValue, testNotification } from 'Store/Actions/settingsActions';
|
||||
import {
|
||||
saveNotification,
|
||||
setNotificationFieldValue,
|
||||
setNotificationValue,
|
||||
testNotification,
|
||||
toggleAdvancedSettings
|
||||
} from 'Store/Actions/settingsActions';
|
||||
import createProviderSettingsSelector from 'Store/Selectors/createProviderSettingsSelector';
|
||||
import EditNotificationModalContent from './EditNotificationModalContent';
|
||||
|
||||
@@ -23,7 +29,8 @@ const mapDispatchToProps = {
|
||||
setNotificationValue,
|
||||
setNotificationFieldValue,
|
||||
saveNotification,
|
||||
testNotification
|
||||
testNotification,
|
||||
toggleAdvancedSettings
|
||||
};
|
||||
|
||||
class EditNotificationModalContentConnector extends Component {
|
||||
@@ -56,6 +63,10 @@ class EditNotificationModalContentConnector extends Component {
|
||||
this.props.testNotification({ id: this.props.id });
|
||||
};
|
||||
|
||||
onAdvancedSettingsPress = () => {
|
||||
this.props.toggleAdvancedSettings();
|
||||
};
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
@@ -65,6 +76,7 @@ class EditNotificationModalContentConnector extends Component {
|
||||
{...this.props}
|
||||
onSavePress={this.onSavePress}
|
||||
onTestPress={this.onTestPress}
|
||||
onAdvancedSettingsPress={this.onAdvancedSettingsPress}
|
||||
onInputChange={this.onInputChange}
|
||||
onFieldChange={this.onFieldChange}
|
||||
/>
|
||||
@@ -82,6 +94,7 @@ EditNotificationModalContentConnector.propTypes = {
|
||||
setNotificationFieldValue: PropTypes.func.isRequired,
|
||||
saveNotification: PropTypes.func.isRequired,
|
||||
testNotification: PropTypes.func.isRequired,
|
||||
toggleAdvancedSettings: PropTypes.func.isRequired,
|
||||
onModalClose: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ function createRemoveItemHandler(section, url) {
|
||||
return function(getState, payload, dispatch) {
|
||||
const {
|
||||
id,
|
||||
...queryParams
|
||||
queryParams
|
||||
} = payload;
|
||||
|
||||
dispatch(set({ section, isDeleting: true }));
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
import $ from 'jquery';
|
||||
import _ from 'lodash';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
import getProviderState from 'Utilities/State/getProviderState';
|
||||
import { set } from '../baseActions';
|
||||
|
||||
const abortCurrentRequests = {};
|
||||
let lastTestData = null;
|
||||
|
||||
export function createCancelTestProviderHandler(section) {
|
||||
return function(getState, payload, dispatch) {
|
||||
@@ -17,10 +20,25 @@ function createTestProviderHandler(section, url) {
|
||||
return function(getState, payload, dispatch) {
|
||||
dispatch(set({ section, isTesting: true }));
|
||||
|
||||
const testData = getProviderState(payload, getState, section);
|
||||
const {
|
||||
queryParams = {},
|
||||
...otherPayload
|
||||
} = payload;
|
||||
|
||||
const testData = getProviderState({ ...otherPayload }, getState, section);
|
||||
const params = { ...queryParams };
|
||||
|
||||
// If the user is re-testing the same provider without changes
|
||||
// force it to be tested.
|
||||
|
||||
if (_.isEqual(testData, lastTestData)) {
|
||||
params.forceTest = true;
|
||||
}
|
||||
|
||||
lastTestData = testData;
|
||||
|
||||
const ajaxOptions = {
|
||||
url: `${url}/test`,
|
||||
url: `${url}/test?${$.param(params, true)}`,
|
||||
method: 'POST',
|
||||
contentType: 'application/json',
|
||||
dataType: 'json',
|
||||
@@ -32,6 +50,8 @@ function createTestProviderHandler(section, url) {
|
||||
abortCurrentRequests[section] = abortRequest;
|
||||
|
||||
request.done((data) => {
|
||||
lastTestData = null;
|
||||
|
||||
dispatch(set({
|
||||
section,
|
||||
isTesting: false,
|
||||
|
||||
@@ -1,12 +1,21 @@
|
||||
import { createSelector } from 'reselect';
|
||||
import AppState from 'App/State/AppState';
|
||||
import Author from 'Author/Author';
|
||||
|
||||
function createMultiAuthorsSelector(authorIds: number[]) {
|
||||
return createSelector(
|
||||
(state: AppState) => state.authors.itemMap,
|
||||
(state: AppState) => state.authors.items,
|
||||
(itemMap, allAuthors) => {
|
||||
return authorIds.map((authorId) => allAuthors[itemMap[authorId]]);
|
||||
return authorIds.reduce((acc: Author[], authorId) => {
|
||||
const author = allAuthors[itemMap[authorId]];
|
||||
|
||||
if (author) {
|
||||
acc.push(author);
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, []);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { createSelector } from 'reselect';
|
||||
import AppState from 'App/State/AppState';
|
||||
|
||||
function createTagsSelector() {
|
||||
return createSelector(
|
||||
(state) => state.tags.items,
|
||||
(state: AppState) => state.tags.items,
|
||||
(tags) => {
|
||||
return tags;
|
||||
}
|
||||
@@ -2,7 +2,6 @@ module.exports = {
|
||||
// Families
|
||||
defaultFontFamily: 'Roboto, "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif',
|
||||
monoSpaceFontFamily: '"Ubuntu Mono", Menlo, Monaco, Consolas, "Courier New", monospace;',
|
||||
passwordFamily: 'text-security-disc',
|
||||
|
||||
// Sizes
|
||||
extraSmallFontSize: '11px',
|
||||
|
||||
@@ -6,6 +6,22 @@ import createMultiAuthorsSelector from 'Store/Selectors/createMultiAuthorsSelect
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './QueuedTaskRowNameCell.css';
|
||||
|
||||
function formatTitles(titles: string[]) {
|
||||
if (!titles) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (titles.length > 11) {
|
||||
return (
|
||||
<span title={titles.join(', ')}>
|
||||
{titles.slice(0, 10).join(', ')}, {titles.length - 10} more
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
return <span>{titles.join(', ')}</span>;
|
||||
}
|
||||
|
||||
export interface QueuedTaskRowNameCellProps {
|
||||
commandName: string;
|
||||
body: CommandBody;
|
||||
@@ -32,7 +48,7 @@ export default function QueuedTaskRowNameCell(
|
||||
<span className={styles.commandName}>
|
||||
{commandName}
|
||||
{sortedAuthors.length ? (
|
||||
<span> - {sortedAuthors.map((a) => a.authorName).join(', ')}</span>
|
||||
<span> - {formatTitles(sortedAuthors.map((a) => a.authorName))}</span>
|
||||
) : null}
|
||||
</span>
|
||||
|
||||
|
||||
42
package.json
42
package.json
@@ -33,9 +33,9 @@
|
||||
"@microsoft/signalr": "6.0.25",
|
||||
"@sentry/browser": "7.51.2",
|
||||
"@sentry/integrations": "7.51.2",
|
||||
"@types/node": "18.16.16",
|
||||
"@types/react": "18.2.7",
|
||||
"@types/react-dom": "18.2.4",
|
||||
"@types/node": "18.19.31",
|
||||
"@types/react": "18.2.79",
|
||||
"@types/react-dom": "18.2.25",
|
||||
"ansi-colors": "4.1.3",
|
||||
"classnames": "2.3.2",
|
||||
"clipboard": "2.0.11",
|
||||
@@ -84,44 +84,44 @@
|
||||
"redux-thunk": "2.3.0",
|
||||
"reselect": "4.1.8",
|
||||
"stacktrace-js": "2.0.2",
|
||||
"typescript": "4.9.5"
|
||||
"typescript": "5.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "7.22.11",
|
||||
"@babel/eslint-parser": "7.22.11",
|
||||
"@babel/plugin-proposal-export-default-from": "7.22.5",
|
||||
"@babel/core": "7.24.4",
|
||||
"@babel/eslint-parser": "7.24.1",
|
||||
"@babel/plugin-proposal-export-default-from": "7.24.1",
|
||||
"@babel/plugin-syntax-dynamic-import": "7.8.3",
|
||||
"@babel/preset-env": "7.22.15",
|
||||
"@babel/preset-react": "7.22.5",
|
||||
"@babel/preset-typescript": "7.22.11",
|
||||
"@types/lodash": "4.14.197",
|
||||
"@types/react-lazyload": "3.2.1",
|
||||
"@babel/preset-env": "7.24.4",
|
||||
"@babel/preset-react": "7.24.1",
|
||||
"@babel/preset-typescript": "7.24.1",
|
||||
"@types/lodash": "4.14.195",
|
||||
"@types/react-lazyload": "3.2.0",
|
||||
"@types/redux-actions": "2.6.2",
|
||||
"@typescript-eslint/eslint-plugin": "6.5.0",
|
||||
"@typescript-eslint/parser": "6.5.0",
|
||||
"@typescript-eslint/eslint-plugin": "6.21.0",
|
||||
"@typescript-eslint/parser": "6.21.0",
|
||||
"autoprefixer": "10.4.14",
|
||||
"babel-loader": "9.1.3",
|
||||
"babel-plugin-inline-classnames": "2.0.1",
|
||||
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
|
||||
"core-js": "3.32.1",
|
||||
"core-js": "3.37.0",
|
||||
"css-loader": "6.8.1",
|
||||
"css-modules-typescript-loader": "4.0.1",
|
||||
"eslint": "8.44.0",
|
||||
"eslint-config-prettier": "8.8.0",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-config-prettier": "8.10.0",
|
||||
"eslint-plugin-filenames": "1.3.2",
|
||||
"eslint-plugin-import": "2.27.5",
|
||||
"eslint-plugin-import": "2.29.1",
|
||||
"eslint-plugin-json": "3.1.0",
|
||||
"eslint-plugin-prettier": "4.2.1",
|
||||
"eslint-plugin-react": "7.32.2",
|
||||
"eslint-plugin-react": "7.34.1",
|
||||
"eslint-plugin-react-hooks": "4.6.0",
|
||||
"eslint-plugin-simple-import-sort": "10.0.0",
|
||||
"eslint-plugin-simple-import-sort": "12.1.0",
|
||||
"file-loader": "6.2.0",
|
||||
"filemanager-webpack-plugin": "8.0.0",
|
||||
"fork-ts-checker-webpack-plugin": "8.0.0",
|
||||
"html-webpack-plugin": "5.5.3",
|
||||
"loader-utils": "^3.2.1",
|
||||
"mini-css-extract-plugin": "2.7.6",
|
||||
"postcss": "8.4.31",
|
||||
"postcss": "8.4.38",
|
||||
"postcss-color-function": "4.1.0",
|
||||
"postcss-loader": "7.3.0",
|
||||
"postcss-mixins": "9.0.4",
|
||||
|
||||
@@ -139,16 +139,46 @@
|
||||
</Otherwise>
|
||||
</Choose>
|
||||
|
||||
<!--
|
||||
Set architecture to RuntimeInformation.ProcessArchitecture if not specified -->
|
||||
<Choose>
|
||||
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'X64'">
|
||||
<PropertyGroup>
|
||||
<Architecture>x64</Architecture>
|
||||
</PropertyGroup>
|
||||
</When>
|
||||
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'X86'">
|
||||
<PropertyGroup>
|
||||
<Architecture>x86</Architecture>
|
||||
</PropertyGroup>
|
||||
</When>
|
||||
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'Arm64'">
|
||||
<PropertyGroup>
|
||||
<Architecture>arm64</Architecture>
|
||||
</PropertyGroup>
|
||||
</When>
|
||||
<When Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture)' == 'Arm'">
|
||||
<PropertyGroup>
|
||||
<Architecture>arm</Architecture>
|
||||
</PropertyGroup>
|
||||
</When>
|
||||
<Otherwise>
|
||||
<PropertyGroup>
|
||||
<Architecture></Architecture>
|
||||
</PropertyGroup>
|
||||
</Otherwise>
|
||||
</Choose>
|
||||
|
||||
<PropertyGroup Condition="'$(IsWindows)' == 'true' and
|
||||
'$(RuntimeIdentifier)' == ''">
|
||||
<_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<RuntimeIdentifier>win-$(Architecture)</RuntimeIdentifier>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(IsLinux)' == 'true' and
|
||||
'$(RuntimeIdentifier)' == ''">
|
||||
<_UsingDefaultRuntimeIdentifier>true</_UsingDefaultRuntimeIdentifier>
|
||||
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
|
||||
<RuntimeIdentifier>linux-$(Architecture)</RuntimeIdentifier>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(IsOSX)' == 'true' and
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
<ItemGroup>
|
||||
<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="Dapper" Version="2.0.151" />
|
||||
<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" />
|
||||
<PackageVersion Include="Polly" Version="8.3.1" />
|
||||
<PackageVersion Include="Polly" Version="8.4.1" />
|
||||
<PackageVersion Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />
|
||||
<PackageVersion Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
|
||||
<PackageVersion Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
|
||||
@@ -17,13 +17,13 @@
|
||||
<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.25" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.32" />
|
||||
<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.2" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
|
||||
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
||||
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr22" />
|
||||
<PackageVersion Include="Moq" Version="4.17.2" />
|
||||
@@ -33,9 +33,9 @@
|
||||
<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.6" />
|
||||
<PackageVersion Include="Npgsql" Version="7.0.7" />
|
||||
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageVersion Include="NUnit" Version="3.13.3" />
|
||||
<PackageVersion Include="NUnit" Version="3.14.0" />
|
||||
<PackageVersion Include="NunitXml.TestLogger" Version="3.0.117" />
|
||||
<PackageVersion Include="PdfSharpCore" Version="1.3.32" />
|
||||
<PackageVersion Include="RestSharp.Serializers.SystemTextJson" Version="106.15.0" />
|
||||
@@ -44,9 +44,10 @@
|
||||
<PackageVersion Include="Selenium.WebDriver.ChromeDriver" Version="91.0.4472.10100" />
|
||||
<PackageVersion Include="Sentry" Version="3.31.0" />
|
||||
<PackageVersion Include="SharpZipLib" Version="1.4.2" />
|
||||
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.3" />
|
||||
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.5" />
|
||||
<PackageVersion Include="StyleCop.Analyzers" Version="1.1.118" />
|
||||
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.5.0" />
|
||||
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.6.2" />
|
||||
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
|
||||
<PackageVersion Include="System.Buffers" Version="4.5.1" />
|
||||
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
|
||||
<PackageVersion Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
@@ -64,4 +65,4 @@
|
||||
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
|
||||
<PackageVersion Include="TagLibSharp-Lidarr" Version="2.2.0.19" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace NzbDrone.Automation.Test
|
||||
|
||||
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
|
||||
_runner.KillAll();
|
||||
_runner.Start();
|
||||
_runner.Start(true);
|
||||
|
||||
driver.Url = "http://localhost:8787";
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
using System.Collections.Generic;
|
||||
using FluentAssertions;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Options;
|
||||
using NzbDrone.Core.Authentication;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Test.Common;
|
||||
@@ -43,6 +45,26 @@ namespace NzbDrone.Common.Test
|
||||
Mocker.GetMock<IDiskProvider>()
|
||||
.Setup(v => v.WriteAllText(configFile, It.IsAny<string>()))
|
||||
.Callback<string, string>((p, t) => _configFileContents = t);
|
||||
|
||||
Mocker.GetMock<IOptions<AuthOptions>>()
|
||||
.Setup(v => v.Value)
|
||||
.Returns(new AuthOptions());
|
||||
|
||||
Mocker.GetMock<IOptions<AppOptions>>()
|
||||
.Setup(v => v.Value)
|
||||
.Returns(new AppOptions());
|
||||
|
||||
Mocker.GetMock<IOptions<ServerOptions>>()
|
||||
.Setup(v => v.Value)
|
||||
.Returns(new ServerOptions());
|
||||
|
||||
Mocker.GetMock<IOptions<LogOptions>>()
|
||||
.Setup(v => v.Value)
|
||||
.Returns(new LogOptions());
|
||||
|
||||
Mocker.GetMock<IOptions<UpdateOptions>>()
|
||||
.Setup(v => v.Value)
|
||||
.Returns(new UpdateOptions());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -19,6 +19,8 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
||||
[TestCase(@"https://baconbits.org/feeds.php?feed=torrents_tv&user=12345&auth=2b51db35e1910123321025a12b9933d2&passkey=mySecret&authkey=2b51db35e1910123321025a12b9933d2")]
|
||||
[TestCase(@"http://127.0.0.1:9117/dl/indexername?jackett_apikey=flwjiefewklfjacketmySecretsdfldskjfsdlk&path=we0re9f0sdfbase64sfdkfjsdlfjk&file=The+Torrent+File+Name.torrent")]
|
||||
[TestCase(@"http://nzb.su/getnzb/2b51db35e1912ffc138825a12b9933d2.nzb&i=37292&r=2b51db35e1910123321025a12b9933d2")]
|
||||
[TestCase(@"https://b-hd.me/torrent/download/auto.343756.is1t1pl127p1sfwur8h4kgyhg1wcsn05")]
|
||||
[TestCase(@"https://b-hd.me/torrent/download/a-slug-in-the-url.343756.is1t1pl127p1sfwur8h4kgyhg1wcsn05")]
|
||||
|
||||
// NzbGet
|
||||
[TestCase(@"{ ""Name"" : ""ControlUsername"", ""Value"" : ""mySecret"" }, { ""Name"" : ""ControlPassword"", ""Value"" : ""mySecret"" }, ")]
|
||||
|
||||
@@ -10,6 +10,7 @@ using NUnit.Framework;
|
||||
using NzbDrone.Common.Composition.Extensions;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Common.Options;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Datastore.Extensions;
|
||||
using NzbDrone.Core.Lifecycle;
|
||||
@@ -33,6 +34,11 @@ namespace NzbDrone.Common.Test
|
||||
|
||||
container.RegisterInstance(new Mock<IHostLifetime>().Object);
|
||||
container.RegisterInstance(new Mock<IOptions<PostgresOptions>>().Object);
|
||||
container.RegisterInstance(new Mock<IOptions<AppOptions>>().Object);
|
||||
container.RegisterInstance(new Mock<IOptions<AuthOptions>>().Object);
|
||||
container.RegisterInstance(new Mock<IOptions<ServerOptions>>().Object);
|
||||
container.RegisterInstance(new Mock<IOptions<LogOptions>>().Object);
|
||||
container.RegisterInstance(new Mock<IOptions<UpdateOptions>>().Object);
|
||||
|
||||
var serviceProvider = container.GetServiceProvider();
|
||||
serviceProvider.GetRequiredService<IAppFolderFactory>().Register();
|
||||
|
||||
@@ -10,6 +10,7 @@ using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http.Proxy;
|
||||
@@ -31,11 +32,14 @@ namespace NzbDrone.Common.Http.Dispatchers
|
||||
private readonly ICached<System.Net.Http.HttpClient> _httpClientCache;
|
||||
private readonly ICached<CredentialCache> _credentialCache;
|
||||
|
||||
private readonly Logger _logger;
|
||||
|
||||
public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider,
|
||||
ICreateManagedWebProxy createManagedWebProxy,
|
||||
ICertificateValidationService certificateValidationService,
|
||||
IUserAgentBuilder userAgentBuilder,
|
||||
ICacheManager cacheManager)
|
||||
ICacheManager cacheManager,
|
||||
Logger logger)
|
||||
{
|
||||
_proxySettingsProvider = proxySettingsProvider;
|
||||
_createManagedWebProxy = createManagedWebProxy;
|
||||
@@ -44,6 +48,8 @@ namespace NzbDrone.Common.Http.Dispatchers
|
||||
|
||||
_httpClientCache = cacheManager.GetCache<System.Net.Http.HttpClient>(typeof(ManagedHttpDispatcher), "httpclient");
|
||||
_credentialCache = cacheManager.GetCache<CredentialCache>(typeof(ManagedHttpDispatcher), "credentialcache");
|
||||
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<HttpResponse> GetResponseAsync(HttpRequest request, CookieContainer cookies)
|
||||
@@ -251,19 +257,27 @@ namespace NzbDrone.Common.Http.Dispatchers
|
||||
return _credentialCache.Get("credentialCache", () => new CredentialCache());
|
||||
}
|
||||
|
||||
private static bool HasRoutableIPv4Address()
|
||||
private bool HasRoutableIPv4Address()
|
||||
{
|
||||
// Get all IPv4 addresses from all interfaces and return true if there are any with non-loopback addresses
|
||||
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
|
||||
try
|
||||
{
|
||||
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
|
||||
|
||||
return networkInterfaces.Any(ni =>
|
||||
ni.OperationalStatus == OperationalStatus.Up &&
|
||||
ni.GetIPProperties().UnicastAddresses.Any(ip =>
|
||||
ip.Address.AddressFamily == AddressFamily.InterNetwork &&
|
||||
!IPAddress.IsLoopback(ip.Address)));
|
||||
return networkInterfaces.Any(ni =>
|
||||
ni.OperationalStatus == OperationalStatus.Up &&
|
||||
ni.GetIPProperties().UnicastAddresses.Any(ip =>
|
||||
ip.Address.AddressFamily == AddressFamily.InterNetwork &&
|
||||
!IPAddress.IsLoopback(ip.Address)));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Debug(e, "Caught exception while GetAllNetworkInterfaces assuming IPv4 connectivity: {0}", e.Message);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private static async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
|
||||
private async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
|
||||
{
|
||||
// Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way.
|
||||
// This issue is being tracked at https://github.com/dotnet/runtime/issues/26177 and expected to be fixed in .NET 6.
|
||||
@@ -287,7 +301,9 @@ namespace NzbDrone.Common.Http.Dispatchers
|
||||
catch
|
||||
{
|
||||
// Do not retry IPv6 if a routable IPv4 address is available, otherwise continue to attempt IPv6 connections.
|
||||
useIPv6 = !HasRoutableIPv4Address();
|
||||
var routableIPv4 = HasRoutableIPv4Address();
|
||||
_logger.Info("IPv4 is available: {0}, IPv6 will be {1}", routableIPv4, routableIPv4 ? "disabled" : "left enabled");
|
||||
useIPv6 = !routableIPv4;
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
new (@"/fetch/[a-z0-9]{32}/(?<secret>[a-z0-9]{32})", RegexOptions.Compiled),
|
||||
new (@"getnzb.*?(?<=\?|&)(r)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new (@"\b(\w*)?(_?(?<!use|get_)token|username|passwo?rd)=(?<secret>[^&=]+?)(?= |&|$|;)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new (@"-hd.me/torrent/[a-z0-9-]\.[0-9]+\.(?<secret>[0-9a-z]+)", 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", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
|
||||
8
src/NzbDrone.Common/Options/AppOptions.cs
Normal file
8
src/NzbDrone.Common/Options/AppOptions.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace NzbDrone.Common.Options;
|
||||
|
||||
public class AppOptions
|
||||
{
|
||||
public string InstanceName { get; set; }
|
||||
public string Theme { get; set; }
|
||||
public bool? LaunchBrowser { get; set; }
|
||||
}
|
||||
9
src/NzbDrone.Common/Options/AuthOptions.cs
Normal file
9
src/NzbDrone.Common/Options/AuthOptions.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace NzbDrone.Common.Options;
|
||||
|
||||
public class AuthOptions
|
||||
{
|
||||
public string ApiKey { get; set; }
|
||||
public bool? Enabled { get; set; }
|
||||
public string Method { get; set; }
|
||||
public string Required { get; set; }
|
||||
}
|
||||
14
src/NzbDrone.Common/Options/LogOptions.cs
Normal file
14
src/NzbDrone.Common/Options/LogOptions.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace NzbDrone.Common.Options;
|
||||
|
||||
public class LogOptions
|
||||
{
|
||||
public string Level { get; set; }
|
||||
public bool? FilterSentryEvents { get; set; }
|
||||
public int? Rotate { get; set; }
|
||||
public bool? Sql { get; set; }
|
||||
public string ConsoleLevel { get; set; }
|
||||
public bool? AnalyticsEnabled { get; set; }
|
||||
public string SyslogServer { get; set; }
|
||||
public int? SyslogPort { get; set; }
|
||||
public string SyslogLevel { get; set; }
|
||||
}
|
||||
12
src/NzbDrone.Common/Options/ServerOptions.cs
Normal file
12
src/NzbDrone.Common/Options/ServerOptions.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
namespace NzbDrone.Common.Options;
|
||||
|
||||
public class ServerOptions
|
||||
{
|
||||
public string UrlBase { get; set; }
|
||||
public string BindAddress { get; set; }
|
||||
public int? Port { get; set; }
|
||||
public bool? EnableSsl { get; set; }
|
||||
public int? SslPort { get; set; }
|
||||
public string SslCertPath { get; set; }
|
||||
public string SslCertPassword { get; set; }
|
||||
}
|
||||
9
src/NzbDrone.Common/Options/UpdateOptions.cs
Normal file
9
src/NzbDrone.Common/Options/UpdateOptions.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
namespace NzbDrone.Common.Options;
|
||||
|
||||
public class UpdateOptions
|
||||
{
|
||||
public string Mechanism { get; set; }
|
||||
public bool? Automatically { get; set; }
|
||||
public string ScriptPath { get; set; }
|
||||
public string Branch { get; set; }
|
||||
}
|
||||
@@ -108,7 +108,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
Subject.Definition.Settings.As<QBittorrentSettings>().RecentTvPriority = (int)QBittorrentPriority.First;
|
||||
}
|
||||
|
||||
protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause)
|
||||
protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, int maxInactiveSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause)
|
||||
{
|
||||
Mocker.GetMock<IQBittorrentProxy>()
|
||||
.Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>()))
|
||||
@@ -118,7 +118,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
MaxRatio = maxRatio,
|
||||
MaxRatioEnabled = maxRatio >= 0,
|
||||
MaxSeedingTime = maxSeedingTime,
|
||||
MaxSeedingTimeEnabled = maxSeedingTime >= 0
|
||||
MaxSeedingTimeEnabled = maxSeedingTime >= 0,
|
||||
MaxInactiveSeedingTime = maxInactiveSeedingTime,
|
||||
MaxInactiveSeedingTimeEnabled = maxInactiveSeedingTime >= 0
|
||||
});
|
||||
}
|
||||
|
||||
@@ -555,6 +557,34 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
result.OutputRootFolders.First().Should().Be(@"C:\Downloads\Finished\QBittorrent".AsOsAgnostic());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_correct_category_output_path()
|
||||
{
|
||||
var config = new QBittorrentPreferences
|
||||
{
|
||||
SavePath = @"C:\Downloads\Finished\QBittorrent".AsOsAgnostic()
|
||||
};
|
||||
|
||||
Mocker.GetMock<IQBittorrentProxy>()
|
||||
.Setup(v => v.GetConfig(It.IsAny<QBittorrentSettings>()))
|
||||
.Returns(config);
|
||||
|
||||
Mocker.GetMock<IQBittorrentProxy>()
|
||||
.Setup(v => v.GetApiVersion(It.IsAny<QBittorrentSettings>()))
|
||||
.Returns(new Version(2, 0));
|
||||
|
||||
Mocker.GetMock<IQBittorrentProxy>()
|
||||
.Setup(s => s.GetLabels(It.IsAny<QBittorrentSettings>()))
|
||||
.Returns(new Dictionary<string, QBittorrentLabel>
|
||||
{ { "music", new QBittorrentLabel { Name = "music", SavePath = "//server/store/downloads" } } });
|
||||
|
||||
var result = Subject.GetStatus();
|
||||
|
||||
result.IsLocalhost.Should().BeTrue();
|
||||
result.OutputRootFolders.Should().NotBeNull();
|
||||
result.OutputRootFolders.First().Should().Be(@"\\server\store\downloads");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Download_should_handle_http_redirect_to_magnet()
|
||||
{
|
||||
@@ -610,7 +640,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
float ratio = 0.1f,
|
||||
float ratioLimit = -2,
|
||||
int seedingTime = 1,
|
||||
int seedingTimeLimit = -2)
|
||||
int seedingTimeLimit = -2,
|
||||
int inactiveSeedingTimeLimit = -2,
|
||||
long lastActivity = -1)
|
||||
{
|
||||
var torrent = new QBittorrentTorrent
|
||||
{
|
||||
@@ -624,7 +656,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
SavePath = "",
|
||||
Ratio = ratio,
|
||||
RatioLimit = ratioLimit,
|
||||
SeedingTimeLimit = seedingTimeLimit
|
||||
SeedingTimeLimit = seedingTimeLimit,
|
||||
InactiveSeedingTimeLimit = inactiveSeedingTimeLimit,
|
||||
LastActivity = lastActivity == -1 ? DateTimeOffset.UtcNow.ToUnixTimeSeconds() : lastActivity
|
||||
};
|
||||
|
||||
GivenTorrents(new List<QBittorrentTorrent>() { torrent });
|
||||
@@ -738,6 +772,50 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
item.CanMoveFiles.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_be_removable_and_should_not_allow_move_files_if_max_inactive_seedingtime_reached_and_not_paused()
|
||||
{
|
||||
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
|
||||
GivenCompletedTorrent("uploading", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeFalse();
|
||||
item.CanMoveFiles.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused()
|
||||
{
|
||||
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
|
||||
GivenCompletedTorrent("pausedUP", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeTrue();
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused()
|
||||
{
|
||||
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 40);
|
||||
GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds());
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeTrue();
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused()
|
||||
{
|
||||
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
|
||||
GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds());
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeFalse();
|
||||
item.CanMoveFiles.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused()
|
||||
{
|
||||
@@ -749,6 +827,17 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused()
|
||||
{
|
||||
GivenGlobalSeedLimits(2.0f, maxInactiveSeedingTime: 20);
|
||||
GivenCompletedTorrent("pausedUP", ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
|
||||
|
||||
var item = Subject.GetItems().Single();
|
||||
item.CanBeRemoved.Should().BeTrue();
|
||||
item.CanMoveFiles.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_not_fetch_details_twice()
|
||||
{
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace NzbDrone.Core.Test.Framework
|
||||
Mocker.SetConstant<IHttpProxySettingsProvider>(new HttpProxySettingsProvider(Mocker.Resolve<ConfigService>()));
|
||||
Mocker.SetConstant<ICreateManagedWebProxy>(new ManagedWebProxyFactory(Mocker.Resolve<CacheManager>()));
|
||||
Mocker.SetConstant<ICertificateValidationService>(new X509CertificateValidationService(Mocker.Resolve<ConfigService>(), TestLogger));
|
||||
Mocker.SetConstant<IHttpDispatcher>(new ManagedHttpDispatcher(Mocker.Resolve<IHttpProxySettingsProvider>(), Mocker.Resolve<ICreateManagedWebProxy>(), Mocker.Resolve<ICertificateValidationService>(), Mocker.Resolve<UserAgentBuilder>(), Mocker.Resolve<CacheManager>()));
|
||||
Mocker.SetConstant<IHttpDispatcher>(new ManagedHttpDispatcher(Mocker.Resolve<IHttpProxySettingsProvider>(), Mocker.Resolve<ICreateManagedWebProxy>(), Mocker.Resolve<ICertificateValidationService>(), Mocker.Resolve<UserAgentBuilder>(), Mocker.Resolve<CacheManager>(), TestLogger));
|
||||
Mocker.SetConstant<IHttpClient>(new HttpClient(Array.Empty<IHttpRequestInterceptor>(), Mocker.Resolve<CacheManager>(), Mocker.Resolve<RateLimitService>(), Mocker.Resolve<IHttpDispatcher>(), TestLogger));
|
||||
Mocker.SetConstant<IReadarrCloudRequestBuilder>(new ReadarrCloudRequestBuilder());
|
||||
Mocker.SetConstant<IMetadataRequestBuilder>(Mocker.Resolve<MetadataRequestBuilder>());
|
||||
|
||||
@@ -13,7 +13,7 @@ using NzbDrone.Core.Test.Framework;
|
||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2024-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||
public class BookInfoProxyFixture : CoreTest<BookInfoProxy>
|
||||
{
|
||||
private MetadataProfile _metadataProfile;
|
||||
|
||||
@@ -15,7 +15,7 @@ using NzbDrone.Test.Common;
|
||||
namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||
{
|
||||
[TestFixture]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2024-05-15 00:00:00Z")]
|
||||
[Ignore("Waiting for metadata to be back again", Until = "2024-08-15 00:00:00Z")]
|
||||
public class BookInfoProxySearchFixture : CoreTest<BookInfoProxy>
|
||||
{
|
||||
[SetUp]
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace NzbDrone.Core.Test.MetadataSource.Goodreads
|
||||
ExceptionVerification.IgnoreWarns();
|
||||
}
|
||||
|
||||
[TestCase("Harry Potter and the sorcerer's stone a detailed summary", 61800696)]
|
||||
[TestCase("Harry Potter and the sorcerer's stone a detailed summary", 72245296)]
|
||||
[TestCase("B0192CTMYG", 61209488)]
|
||||
[TestCase("9780439554930", 48517161)]
|
||||
public void successful_book_search(string title, int expected)
|
||||
|
||||
@@ -46,6 +46,7 @@ namespace NzbDrone.Core.Test.QueueTests
|
||||
|
||||
_trackedDownloads = Builder<TrackedDownload>.CreateListOfSize(1)
|
||||
.All()
|
||||
.With(v => v.IsTrackable = true)
|
||||
.With(v => v.DownloadItem = downloadItem)
|
||||
.With(v => v.RemoteBook = remoteBook)
|
||||
.Build()
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace NzbDrone.Core.Authentication
|
||||
{
|
||||
public enum AuthenticationRequiredType
|
||||
{
|
||||
Enabled = 0,
|
||||
DisabledForLocalAddresses = 1
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
namespace NzbDrone.Core.Authentication
|
||||
namespace NzbDrone.Core.Authentication
|
||||
{
|
||||
public enum AuthenticationType
|
||||
{
|
||||
None = 0,
|
||||
Basic = 1,
|
||||
Forms = 2
|
||||
Forms = 2,
|
||||
External = 3
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,18 +15,18 @@ namespace NzbDrone.Core.Books
|
||||
public class BookCutoffService : IBookCutoffService
|
||||
{
|
||||
private readonly IBookRepository _bookRepository;
|
||||
private readonly IProfileService _profileService;
|
||||
private readonly IQualityProfileService _qualityProfileService;
|
||||
|
||||
public BookCutoffService(IBookRepository bookRepository, IProfileService profileService)
|
||||
public BookCutoffService(IBookRepository bookRepository, IQualityProfileService qualityProfileService)
|
||||
{
|
||||
_bookRepository = bookRepository;
|
||||
_profileService = profileService;
|
||||
_qualityProfileService = qualityProfileService;
|
||||
}
|
||||
|
||||
public PagingSpec<Book> BooksWhereCutoffUnmet(PagingSpec<Book> pagingSpec)
|
||||
{
|
||||
var qualitiesBelowCutoff = new List<QualitiesBelowCutoff>();
|
||||
var profiles = _profileService.All();
|
||||
var profiles = _qualityProfileService.All();
|
||||
|
||||
//Get all items less than the cutoff
|
||||
foreach (var profile in profiles)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.IO;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Core.Books.Commands;
|
||||
using NzbDrone.Core.Books.Events;
|
||||
@@ -55,6 +56,12 @@ namespace NzbDrone.Core.Books
|
||||
_logger.ProgressInfo("Moving {0} from '{1}' to '{2}'", author.Name, sourcePath, destinationPath);
|
||||
}
|
||||
|
||||
if (sourcePath.PathEquals(destinationPath))
|
||||
{
|
||||
_logger.ProgressInfo("{0} is already in the specified location '{1}'.", author, destinationPath);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_rootFolderWatchingService.ReportFileSystemChangeBeginning(sourcePath, destinationPath);
|
||||
|
||||
@@ -9,6 +9,7 @@ using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.Disk;
|
||||
using NzbDrone.Common.EnvironmentInfo;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Options;
|
||||
using NzbDrone.Core.Authentication;
|
||||
using NzbDrone.Core.Configuration.Events;
|
||||
using NzbDrone.Core.Datastore;
|
||||
@@ -32,6 +33,7 @@ namespace NzbDrone.Core.Configuration
|
||||
bool EnableSsl { get; }
|
||||
bool LaunchBrowser { get; }
|
||||
AuthenticationType AuthenticationMethod { get; }
|
||||
AuthenticationRequiredType AuthenticationRequired { get; }
|
||||
bool AnalyticsEnabled { get; }
|
||||
string LogLevel { get; }
|
||||
string ConsoleLogLevel { get; }
|
||||
@@ -69,6 +71,11 @@ namespace NzbDrone.Core.Configuration
|
||||
private readonly IDiskProvider _diskProvider;
|
||||
private readonly ICached<string> _cache;
|
||||
private readonly PostgresOptions _postgresOptions;
|
||||
private readonly AuthOptions _authOptions;
|
||||
private readonly AppOptions _appOptions;
|
||||
private readonly ServerOptions _serverOptions;
|
||||
private readonly UpdateOptions _updateOptions;
|
||||
private readonly LogOptions _logOptions;
|
||||
|
||||
private readonly string _configFile;
|
||||
|
||||
@@ -78,13 +85,23 @@ namespace NzbDrone.Core.Configuration
|
||||
ICacheManager cacheManager,
|
||||
IEventAggregator eventAggregator,
|
||||
IDiskProvider diskProvider,
|
||||
IOptions<PostgresOptions> postgresOptions)
|
||||
IOptions<PostgresOptions> postgresOptions,
|
||||
IOptions<AuthOptions> authOptions,
|
||||
IOptions<AppOptions> appOptions,
|
||||
IOptions<ServerOptions> serverOptions,
|
||||
IOptions<UpdateOptions> updateOptions,
|
||||
IOptions<LogOptions> logOptions)
|
||||
{
|
||||
_cache = cacheManager.GetCache<string>(GetType());
|
||||
_eventAggregator = eventAggregator;
|
||||
_diskProvider = diskProvider;
|
||||
_configFile = appFolderInfo.GetConfigPath();
|
||||
_postgresOptions = postgresOptions.Value;
|
||||
_authOptions = authOptions.Value;
|
||||
_appOptions = appOptions.Value;
|
||||
_serverOptions = serverOptions.Value;
|
||||
_updateOptions = updateOptions.Value;
|
||||
_logOptions = logOptions.Value;
|
||||
}
|
||||
|
||||
public Dictionary<string, object> GetConfigDictionary()
|
||||
@@ -140,7 +157,7 @@ namespace NzbDrone.Core.Configuration
|
||||
{
|
||||
const string defaultValue = "*";
|
||||
|
||||
var bindAddress = GetValue("BindAddress", defaultValue);
|
||||
var bindAddress = _serverOptions.BindAddress ?? GetValue("BindAddress", defaultValue);
|
||||
if (string.IsNullOrWhiteSpace(bindAddress))
|
||||
{
|
||||
return defaultValue;
|
||||
@@ -150,19 +167,19 @@ namespace NzbDrone.Core.Configuration
|
||||
}
|
||||
}
|
||||
|
||||
public int Port => GetValueInt("Port", 8787);
|
||||
public int Port => _serverOptions.Port ?? GetValueInt("Port", 8787);
|
||||
|
||||
public int SslPort => GetValueInt("SslPort", 6868);
|
||||
public int SslPort => _serverOptions.SslPort ?? GetValueInt("SslPort", 6868);
|
||||
|
||||
public bool EnableSsl => GetValueBoolean("EnableSsl", false);
|
||||
public bool EnableSsl => _serverOptions.EnableSsl ?? GetValueBoolean("EnableSsl", false);
|
||||
|
||||
public bool LaunchBrowser => GetValueBoolean("LaunchBrowser", true);
|
||||
public bool LaunchBrowser => _appOptions.LaunchBrowser ?? GetValueBoolean("LaunchBrowser", true);
|
||||
|
||||
public string ApiKey
|
||||
{
|
||||
get
|
||||
{
|
||||
var apiKey = GetValue("ApiKey", GenerateApiKey());
|
||||
var apiKey = _authOptions.ApiKey ?? GetValue("ApiKey", GenerateApiKey());
|
||||
|
||||
if (apiKey.IsNullOrWhiteSpace())
|
||||
{
|
||||
@@ -178,7 +195,7 @@ namespace NzbDrone.Core.Configuration
|
||||
{
|
||||
get
|
||||
{
|
||||
var enabled = GetValueBoolean("AuthenticationEnabled", false, false);
|
||||
var enabled = _authOptions.Enabled ?? GetValueBoolean("AuthenticationEnabled", false, false);
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
@@ -186,17 +203,24 @@ namespace NzbDrone.Core.Configuration
|
||||
return AuthenticationType.Basic;
|
||||
}
|
||||
|
||||
return GetValueEnum("AuthenticationMethod", AuthenticationType.None);
|
||||
return Enum.TryParse<AuthenticationType>(_authOptions.Method, out var enumValue)
|
||||
? enumValue
|
||||
: GetValueEnum("AuthenticationMethod", AuthenticationType.None);
|
||||
}
|
||||
}
|
||||
|
||||
public bool AnalyticsEnabled => GetValueBoolean("AnalyticsEnabled", true, persist: false);
|
||||
public AuthenticationRequiredType AuthenticationRequired =>
|
||||
Enum.TryParse<AuthenticationRequiredType>(_authOptions.Required, out var enumValue)
|
||||
? enumValue
|
||||
: GetValueEnum("AuthenticationRequired", AuthenticationRequiredType.Enabled);
|
||||
|
||||
public bool AnalyticsEnabled => _logOptions.AnalyticsEnabled ?? GetValueBoolean("AnalyticsEnabled", true, persist: false);
|
||||
|
||||
// TODO: Change back to "master" for the first stable release
|
||||
public string Branch => GetValue("Branch", "develop").ToLowerInvariant();
|
||||
public string Branch => _updateOptions.Branch ?? GetValue("Branch", "develop").ToLowerInvariant();
|
||||
|
||||
public string LogLevel => GetValue("LogLevel", "info");
|
||||
public string ConsoleLogLevel => GetValue("ConsoleLogLevel", string.Empty, persist: false);
|
||||
public string LogLevel => _logOptions.Level ?? GetValue("LogLevel", "info").ToLowerInvariant();
|
||||
public string ConsoleLogLevel => _logOptions.ConsoleLevel ?? GetValue("ConsoleLogLevel", string.Empty, persist: false);
|
||||
|
||||
public string PostgresHost => _postgresOptions?.Host ?? GetValue("PostgresHost", string.Empty, persist: false);
|
||||
public string PostgresUser => _postgresOptions?.User ?? GetValue("PostgresUser", string.Empty, persist: false);
|
||||
@@ -206,18 +230,18 @@ namespace NzbDrone.Core.Configuration
|
||||
public string PostgresCacheDb => _postgresOptions?.CacheDb ?? GetValue("PostgresCacheDb", "readarr-cache", persist: false);
|
||||
public int PostgresPort => (_postgresOptions?.Port ?? 0) != 0 ? _postgresOptions.Port : GetValueInt("PostgresPort", 5432, persist: false);
|
||||
|
||||
public string Theme => GetValue("Theme", "auto", persist: false);
|
||||
public bool LogSql => GetValueBoolean("LogSql", false, persist: false);
|
||||
public int LogRotate => GetValueInt("LogRotate", 50, persist: false);
|
||||
public bool FilterSentryEvents => GetValueBoolean("FilterSentryEvents", true, persist: false);
|
||||
public string SslCertPath => GetValue("SslCertPath", "");
|
||||
public string SslCertPassword => GetValue("SslCertPassword", "");
|
||||
public string Theme => _appOptions.Theme ?? GetValue("Theme", "auto", persist: false);
|
||||
public bool LogSql => _logOptions.Sql ?? GetValueBoolean("LogSql", false, persist: false);
|
||||
public int LogRotate => _logOptions.Rotate ?? GetValueInt("LogRotate", 50, persist: false);
|
||||
public bool FilterSentryEvents => _logOptions.FilterSentryEvents ?? GetValueBoolean("FilterSentryEvents", true, persist: false);
|
||||
public string SslCertPath => _serverOptions.SslCertPath ?? GetValue("SslCertPath", "");
|
||||
public string SslCertPassword => _serverOptions.SslCertPassword ?? GetValue("SslCertPassword", "");
|
||||
|
||||
public string UrlBase
|
||||
{
|
||||
get
|
||||
{
|
||||
var urlBase = GetValue("UrlBase", "").Trim('/');
|
||||
var urlBase = (_serverOptions.UrlBase ?? GetValue("UrlBase", "")).Trim('/');
|
||||
|
||||
if (urlBase.IsNullOrWhiteSpace())
|
||||
{
|
||||
@@ -229,19 +253,22 @@ namespace NzbDrone.Core.Configuration
|
||||
}
|
||||
|
||||
public string UiFolder => BuildInfo.IsDebug ? Path.Combine("..", "UI") : "UI";
|
||||
public string InstanceName => GetValue("InstanceName", BuildInfo.AppName);
|
||||
public string InstanceName => _appOptions.InstanceName ?? GetValue("InstanceName", BuildInfo.AppName);
|
||||
|
||||
public bool UpdateAutomatically => GetValueBoolean("UpdateAutomatically", false, false);
|
||||
public bool UpdateAutomatically => _updateOptions.Automatically ?? GetValueBoolean("UpdateAutomatically", false, false);
|
||||
|
||||
public UpdateMechanism UpdateMechanism => GetValueEnum("UpdateMechanism", UpdateMechanism.BuiltIn, false);
|
||||
public UpdateMechanism UpdateMechanism =>
|
||||
Enum.TryParse<UpdateMechanism>(_updateOptions.Mechanism, out var enumValue)
|
||||
? enumValue
|
||||
: GetValueEnum("UpdateMechanism", UpdateMechanism.BuiltIn, false);
|
||||
|
||||
public string UpdateScriptPath => GetValue("UpdateScriptPath", "", false);
|
||||
public string UpdateScriptPath => _updateOptions.ScriptPath ?? GetValue("UpdateScriptPath", "", false);
|
||||
|
||||
public string SyslogServer => GetValue("SyslogServer", "", persist: false);
|
||||
public string SyslogServer => _logOptions.SyslogServer ?? GetValue("SyslogServer", "", persist: false);
|
||||
|
||||
public int SyslogPort => GetValueInt("SyslogPort", 514, persist: false);
|
||||
public int SyslogPort => _logOptions.SyslogPort ?? GetValueInt("SyslogPort", 514, persist: false);
|
||||
|
||||
public string SyslogLevel => GetValue("SyslogLevel", LogLevel, false).ToLowerInvariant();
|
||||
public string SyslogLevel => _logOptions.SyslogLevel ?? GetValue("SyslogLevel", LogLevel, persist: false).ToLowerInvariant();
|
||||
|
||||
public int GetValueInt(string key, int defaultValue, bool persist = true)
|
||||
{
|
||||
@@ -377,13 +404,21 @@ namespace NzbDrone.Core.Configuration
|
||||
throw new InvalidConfigFileException($"{_configFile} is corrupt. Please delete the config file and Readarr will recreate it.");
|
||||
}
|
||||
|
||||
return XDocument.Parse(_diskProvider.ReadAllText(_configFile));
|
||||
var xDoc = XDocument.Parse(_diskProvider.ReadAllText(_configFile));
|
||||
var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).ToList();
|
||||
|
||||
if (config.Count != 1)
|
||||
{
|
||||
throw new InvalidConfigFileException($"{_configFile} is invalid. Please delete the config file and Readarr will recreate it.");
|
||||
}
|
||||
|
||||
return xDoc;
|
||||
}
|
||||
|
||||
var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
|
||||
xDoc.Add(new XElement(CONFIG_ELEMENT_NAME));
|
||||
var newXDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
|
||||
newXDoc.Add(new XElement(CONFIG_ELEMENT_NAME));
|
||||
|
||||
return xDoc;
|
||||
return newXDoc;
|
||||
}
|
||||
}
|
||||
catch (XmlException ex)
|
||||
|
||||
@@ -455,7 +455,7 @@ namespace NzbDrone.Core.Datastore
|
||||
var sortKey = TableMapping.Mapper.GetSortKey(pagingSpec.SortKey);
|
||||
var sortDirection = pagingSpec.SortDirection == SortDirection.Descending ? "DESC" : "ASC";
|
||||
var pagingOffset = Math.Max(pagingSpec.Page - 1, 0) * pagingSpec.PageSize;
|
||||
builder.OrderBy($"\"{sortKey}\" {sortDirection} LIMIT {pagingSpec.PageSize} OFFSET {pagingOffset}");
|
||||
builder.OrderBy($"\"{sortKey.Table ?? _table}\".\"{sortKey.Column}\" {sortDirection} LIMIT {pagingSpec.PageSize} OFFSET {pagingOffset}");
|
||||
|
||||
return queryFunc(builder).ToList();
|
||||
}
|
||||
|
||||
@@ -16,12 +16,12 @@ namespace NzbDrone.Core.Datastore
|
||||
}
|
||||
|
||||
public CorruptDatabaseException(string message, Exception innerException, params object[] args)
|
||||
: base(message, innerException, args)
|
||||
: base(innerException, message, args)
|
||||
{
|
||||
}
|
||||
|
||||
public CorruptDatabaseException(string message, Exception innerException)
|
||||
: base(message, innerException)
|
||||
: base(innerException, message)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,10 +327,6 @@ namespace NzbDrone.Core.Datastore.Migration
|
||||
.WithColumn("Label").AsString().NotNullable()
|
||||
.WithColumn("Filters").AsString().NotNullable();
|
||||
|
||||
IfDatabase("sqlite").Create.Index().OnTable("Books").OnColumn("AuthorId");
|
||||
IfDatabase("sqlite").Create.Index().OnTable("Books").OnColumn("AuthorId").Ascending()
|
||||
.OnColumn("ReleaseDate").Ascending();
|
||||
|
||||
Delete.Index().OnTable("History").OnColumn("BookId");
|
||||
Create.Index().OnTable("History").OnColumn("BookId").Ascending()
|
||||
.OnColumn("Date").Descending();
|
||||
|
||||
@@ -8,9 +8,6 @@ namespace NzbDrone.Core.Datastore.Migration
|
||||
{
|
||||
protected override void MainDbUpgrade()
|
||||
{
|
||||
IfDatabase("sqlite").Delete.Index().OnTable("Books").OnColumn("AuthorId");
|
||||
IfDatabase("sqlite").Delete.Index().OnTable("Books").OnColumns("AuthorId", "ReleaseDate");
|
||||
|
||||
Create.Index().OnTable("Editions").OnColumn("BookId");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,7 +219,7 @@ namespace NzbDrone.Core.Datastore.Migration.Framework
|
||||
|
||||
protected virtual IList<TableDefinition> ReadTables()
|
||||
{
|
||||
const string sqlCommand = @"SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name;";
|
||||
const string sqlCommand = @"SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_litestream_%' ORDER BY name;";
|
||||
var dtTable = Read(sqlCommand).Tables[0];
|
||||
|
||||
var tableDefinitionList = new List<TableDefinition>();
|
||||
|
||||
@@ -91,33 +91,28 @@ namespace NzbDrone.Core.Datastore
|
||||
return true;
|
||||
}
|
||||
|
||||
public string GetSortKey(string sortKey)
|
||||
public (string Table, string Column) GetSortKey(string sortKey)
|
||||
{
|
||||
string table = null;
|
||||
|
||||
if (sortKey.Contains('.'))
|
||||
{
|
||||
var split = sortKey.Split('.');
|
||||
if (split.Length != 2)
|
||||
if (split.Length == 2)
|
||||
{
|
||||
return sortKey;
|
||||
table = split[0];
|
||||
sortKey = split[1];
|
||||
}
|
||||
|
||||
table = split[0];
|
||||
sortKey = split[1];
|
||||
}
|
||||
|
||||
if (table != null && !TableMap.Values.Contains(table, StringComparer.OrdinalIgnoreCase))
|
||||
if (table != null)
|
||||
{
|
||||
return sortKey;
|
||||
table = TableMap.Values.FirstOrDefault(x => x.Equals(table, StringComparison.OrdinalIgnoreCase)) ?? table;
|
||||
}
|
||||
|
||||
if (!_allowedOrderBy.Contains(sortKey))
|
||||
{
|
||||
return sortKey;
|
||||
}
|
||||
sortKey = _allowedOrderBy.FirstOrDefault(x => x.Equals(sortKey, StringComparison.OrdinalIgnoreCase)) ?? sortKey;
|
||||
|
||||
return _allowedOrderBy.First(x => x.Equals(sortKey, StringComparison.OrdinalIgnoreCase));
|
||||
return (table, sortKey);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -122,14 +122,23 @@ namespace NzbDrone.Core.Download.Clients.Deluge
|
||||
}
|
||||
|
||||
var items = new List<DownloadClientItem>();
|
||||
var ignoredCount = 0;
|
||||
|
||||
foreach (var torrent in torrents)
|
||||
{
|
||||
if (torrent.Hash == null)
|
||||
// Silently ignore torrents with no hash
|
||||
if (torrent.Hash.IsNullOrWhiteSpace())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Ignore torrents without a name, but track to log a single warning for all invalid torrents.
|
||||
if (torrent.Name.IsNullOrWhiteSpace())
|
||||
{
|
||||
ignoredCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
var item = new DownloadClientItem();
|
||||
item.DownloadId = torrent.Hash.ToUpper();
|
||||
item.Title = torrent.Name;
|
||||
@@ -187,6 +196,11 @@ namespace NzbDrone.Core.Download.Clients.Deluge
|
||||
items.Add(item);
|
||||
}
|
||||
|
||||
if (ignoredCount > 0)
|
||||
{
|
||||
_logger.Warn("{0} torrent(s) were ignored becuase they did not have a title, check Deluge and remove any invalid torrents");
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
|
||||
@@ -279,6 +279,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
break;
|
||||
|
||||
case "metaDL": // torrent magnet is being downloaded
|
||||
case "forcedMetaDL": // torrent metadata is being forcibly downloaded
|
||||
if (config.DhtEnabled)
|
||||
{
|
||||
item.Status = DownloadItemStatus.Queued;
|
||||
@@ -293,7 +294,6 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
break;
|
||||
|
||||
case "forcedDL": // torrent is being downloaded, and was forced started
|
||||
case "forcedMetaDL": // torrent metadata is being forcibly downloaded
|
||||
case "moving": // torrent is being moved from a folder
|
||||
case "downloading": // torrent is being downloaded and data is being transferred
|
||||
item.Status = DownloadItemStatus.Downloading;
|
||||
@@ -375,7 +375,15 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
{
|
||||
if (Proxy.GetLabels(Settings).TryGetValue(Settings.MusicCategory, out var label) && label.SavePath.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
var labelDir = new OsPath(label.SavePath);
|
||||
var savePath = label.SavePath;
|
||||
|
||||
if (savePath.StartsWith("//"))
|
||||
{
|
||||
_logger.Trace("Replacing double forward slashes in path '{0}'. If this is not meant to be a Windows UNC path fix the 'Save Path' in qBittorrent's {1} category", savePath, Settings.MusicCategory);
|
||||
savePath = savePath.Replace('/', '\\');
|
||||
}
|
||||
|
||||
var labelDir = new OsPath(savePath);
|
||||
|
||||
if (labelDir.IsRooted)
|
||||
{
|
||||
@@ -388,16 +396,20 @@ 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.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles)
|
||||
RemovesCompletedDownloads = RemovesCompletedDownloads(config)
|
||||
};
|
||||
}
|
||||
|
||||
private bool RemovesCompletedDownloads(QBittorrentPreferences config)
|
||||
{
|
||||
var minimumRetention = 60 * 24 * 14; // 14 days in minutes
|
||||
return (config.MaxRatioEnabled || (config.MaxSeedingTimeEnabled && config.MaxSeedingTime < minimumRetention)) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles);
|
||||
}
|
||||
|
||||
protected override void Test(List<ValidationFailure> failures)
|
||||
{
|
||||
failures.AddIfNotNull(TestConnection());
|
||||
@@ -447,7 +459,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
|
||||
// Complain if qBittorrent is configured to remove torrents on max ratio
|
||||
var config = Proxy.GetConfig(Settings);
|
||||
if ((config.MaxRatioEnabled || config.MaxSeedingTimeEnabled) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles))
|
||||
if (RemovesCompletedDownloads(config))
|
||||
{
|
||||
return new NzbDroneValidationFailure(string.Empty, "qBittorrent is configured to remove torrents when they reach their Share Ratio Limit")
|
||||
{
|
||||
@@ -619,7 +631,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
}
|
||||
}
|
||||
|
||||
if (HasReachedSeedingTimeLimit(torrent, config))
|
||||
if (HasReachedSeedingTimeLimit(torrent, config) || HasReachedInactiveSeedingTimeLimit(torrent, config))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -691,6 +703,26 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
return false;
|
||||
}
|
||||
|
||||
protected bool HasReachedInactiveSeedingTimeLimit(QBittorrentTorrent torrent, QBittorrentPreferences config)
|
||||
{
|
||||
long inactiveSeedingTimeLimit;
|
||||
|
||||
if (torrent.InactiveSeedingTimeLimit >= 0)
|
||||
{
|
||||
inactiveSeedingTimeLimit = torrent.InactiveSeedingTimeLimit * 60;
|
||||
}
|
||||
else if (torrent.InactiveSeedingTimeLimit == -2 && config.MaxInactiveSeedingTimeEnabled)
|
||||
{
|
||||
inactiveSeedingTimeLimit = config.MaxInactiveSeedingTime * 60;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return DateTimeOffset.UtcNow.ToUnixTimeSeconds() - torrent.LastActivity > inactiveSeedingTimeLimit;
|
||||
}
|
||||
|
||||
protected void FetchTorrentDetails(QBittorrentTorrent torrent)
|
||||
{
|
||||
var torrentProperties = Proxy.GetTorrentProperties(torrent.Hash, Settings);
|
||||
|
||||
@@ -28,6 +28,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
[JsonProperty(PropertyName = "max_seeding_time")]
|
||||
public long MaxSeedingTime { get; set; } // Get the global share time limit in minutes
|
||||
|
||||
[JsonProperty(PropertyName = "max_inactive_seeding_time_enabled")]
|
||||
public bool MaxInactiveSeedingTimeEnabled { get; set; } // True if share inactive time limit is enabled
|
||||
|
||||
[JsonProperty(PropertyName = "max_inactive_seeding_time")]
|
||||
public long MaxInactiveSeedingTime { get; set; } // Get the global share inactive time limit in minutes
|
||||
|
||||
[JsonProperty(PropertyName = "max_ratio_act")]
|
||||
public QBittorrentMaxRatioAction MaxRatioAction { get; set; } // Action performed when a torrent reaches the maximum share ratio.
|
||||
|
||||
|
||||
@@ -37,6 +37,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
|
||||
[JsonProperty(PropertyName = "seeding_time_limit")] // Per torrent seeding time limit (-2 = use global, -1 = unlimited)
|
||||
public long SeedingTimeLimit { get; set; } = -2;
|
||||
|
||||
[JsonProperty(PropertyName = "inactive_seeding_time_limit")] // Per torrent inactive seeding time limit (-2 = use global, -1 = unlimited)
|
||||
public long InactiveSeedingTimeLimit { get; set; } = -2;
|
||||
|
||||
[JsonProperty(PropertyName = "last_activity")] // Timestamp in unix seconds when a chunk was last downloaded/uploaded
|
||||
public long LastActivity { get; set; }
|
||||
}
|
||||
|
||||
public class QBittorrentTorrentProperties
|
||||
|
||||
@@ -11,8 +11,8 @@ namespace NzbDrone.Core.Download.Clients.Transmission
|
||||
public bool IsFinished { get; set; }
|
||||
public long Eta { get; set; }
|
||||
public TransmissionTorrentStatus Status { get; set; }
|
||||
public int SecondsDownloading { get; set; }
|
||||
public int SecondsSeeding { get; set; }
|
||||
public long SecondsDownloading { get; set; }
|
||||
public long SecondsSeeding { get; set; }
|
||||
public string ErrorString { get; set; }
|
||||
public long DownloadedEver { get; set; }
|
||||
public long UploadedEver { get; set; }
|
||||
|
||||
@@ -137,12 +137,14 @@ namespace NzbDrone.Core.Download.Clients.RTorrent
|
||||
// Ignore torrents with an empty path
|
||||
if (torrent.Path.IsNullOrWhiteSpace())
|
||||
{
|
||||
_logger.Warn("Torrent '{0}' has an empty download path and will not be processed. Adjust this to an absolute path in rTorrent", torrent.Name);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (torrent.Path.StartsWith("."))
|
||||
{
|
||||
throw new DownloadClientException("Download paths must be absolute. Please specify variable \"directory\" in rTorrent.");
|
||||
_logger.Warn("Torrent '{0}' has a download path starting with '.' and will not be processed. Adjust this to an absolute path in rTorrent", torrent.Name);
|
||||
continue;
|
||||
}
|
||||
|
||||
var item = new DownloadClientItem();
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace NzbDrone.Core.Download
|
||||
{
|
||||
{ Result.HasHttpServerError: true } => PredicateResult.True(),
|
||||
{ Result.StatusCode: HttpStatusCode.RequestTimeout } => PredicateResult.True(),
|
||||
{ Exception: HttpException { Response.HasHttpServerError: true } } => PredicateResult.True(),
|
||||
_ => PredicateResult.False()
|
||||
},
|
||||
Delay = TimeSpan.FromSeconds(3),
|
||||
|
||||
@@ -68,16 +68,17 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
protected override bool PostProcess(IndexerResponse indexerResponse, List<XElement> items, List<ReleaseInfo> releases)
|
||||
{
|
||||
var enclosureTypes = items.SelectMany(GetEnclosures).Select(v => v.Type).Distinct().ToArray();
|
||||
|
||||
if (enclosureTypes.Any() && enclosureTypes.Intersect(PreferredEnclosureMimeTypes).Empty())
|
||||
{
|
||||
if (enclosureTypes.Intersect(TorrentEnclosureMimeTypes).Any())
|
||||
{
|
||||
_logger.Warn("{0} does not contain {1}, found {2}, did you intend to add a Torznab indexer?", indexerResponse.Request.Url, NzbEnclosureMimeType, enclosureTypes[0]);
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Warn("{1} does not contain {1}, found {2}.", indexerResponse.Request.Url, NzbEnclosureMimeType, enclosureTypes[0]);
|
||||
}
|
||||
|
||||
_logger.Warn("{0} does not contain {1}, found {2}.", indexerResponse.Request.Url, NzbEnclosureMimeType, enclosureTypes[0]);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -268,26 +268,26 @@ namespace NzbDrone.Core.Indexers
|
||||
protected virtual RssEnclosure[] GetEnclosures(XElement item)
|
||||
{
|
||||
var enclosures = item.Elements("enclosure")
|
||||
.Select(v =>
|
||||
{
|
||||
try
|
||||
{
|
||||
return new RssEnclosure
|
||||
{
|
||||
Url = v.Attribute("url")?.Value,
|
||||
Type = v.Attribute("type")?.Value,
|
||||
Length = v.Attribute("length")?.Value?.ParseInt64() ?? 0
|
||||
};
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Warn(e, "Failed to get enclosure for: {0}", item.Title());
|
||||
}
|
||||
.Select(v =>
|
||||
{
|
||||
try
|
||||
{
|
||||
return new RssEnclosure
|
||||
{
|
||||
Url = v.Attribute("url")?.Value,
|
||||
Type = v.Attribute("type")?.Value,
|
||||
Length = v.Attribute("length")?.Value?.ParseInt64() ?? 0
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Warn(ex, "Failed to get enclosure for: {0}", item.Title());
|
||||
}
|
||||
|
||||
return null;
|
||||
})
|
||||
.Where(v => v != null)
|
||||
.ToArray();
|
||||
return null;
|
||||
})
|
||||
.Where(v => v != null)
|
||||
.ToArray();
|
||||
|
||||
return enclosures;
|
||||
}
|
||||
|
||||
@@ -48,10 +48,10 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
public class SeedCriteriaSettings
|
||||
{
|
||||
[FieldDefinition(0, Type = FieldType.Textbox, Label = "Seed Ratio", HelpText = "The ratio a torrent should reach before stopping, empty is download client's default. Ratio should be at least 1.0 and follow the indexers rules")]
|
||||
[FieldDefinition(0, Type = FieldType.Number, Label = "IndexerSettingsSeedRatio", HelpText = "IndexerSettingsSeedRatioHelpText")]
|
||||
public double? SeedRatio { get; set; }
|
||||
|
||||
[FieldDefinition(1, Type = FieldType.Textbox, Label = "Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)]
|
||||
[FieldDefinition(1, Type = FieldType.Number, Label = "IndexerSettingsSeedTime", Unit = "minutes", HelpText = "IndexerSettingsSeedTimeHelpText", Advanced = true)]
|
||||
public int? SeedTime { get; set; }
|
||||
|
||||
[FieldDefinition(2, Type = FieldType.Textbox, Label = "Discography Seed Time", Unit = "minutes", HelpText = "The time a torrent should be seeded before stopping, empty is download client's default", Advanced = true)]
|
||||
|
||||
@@ -59,16 +59,17 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
protected override bool PostProcess(IndexerResponse indexerResponse, List<XElement> items, List<ReleaseInfo> releases)
|
||||
{
|
||||
var enclosureTypes = items.SelectMany(GetEnclosures).Select(v => v.Type).Distinct().ToArray();
|
||||
|
||||
if (enclosureTypes.Any() && enclosureTypes.Intersect(PreferredEnclosureMimeTypes).Empty())
|
||||
{
|
||||
if (enclosureTypes.Intersect(UsenetEnclosureMimeTypes).Any())
|
||||
{
|
||||
_logger.Warn("{0} does not contain {1}, found {2}, did you intend to add a Newznab indexer?", indexerResponse.Request.Url, TorrentEnclosureMimeType, enclosureTypes[0]);
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.Warn("{1} does not contain {1}, found {2}.", indexerResponse.Request.Url, TorrentEnclosureMimeType, enclosureTypes[0]);
|
||||
}
|
||||
|
||||
_logger.Warn("{0} does not contain {1}, found {2}.", indexerResponse.Request.Url, TorrentEnclosureMimeType, enclosureTypes[0]);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -332,7 +332,6 @@
|
||||
"AddingTag": "مضيفا العلامة",
|
||||
"AddListExclusion": "إضافة استبعاد قائمة",
|
||||
"About": "نبدة عن",
|
||||
"APIKey": "مفتاح API",
|
||||
"60MinutesSixty": "60 دقيقة: {0}",
|
||||
"45MinutesFourtyFive": "90 دقيقة: {0}",
|
||||
"20MinutesTwenty": "120 دقيقة: {0}",
|
||||
@@ -430,7 +429,6 @@
|
||||
"HasPendingChangesNoChanges": "لا تغيرات",
|
||||
"Group": "مجموعة",
|
||||
"GrabSelected": "انتزاع المحدد",
|
||||
"ApiKeyHelpTextWarning": "يتطلب إعادة التشغيل ليصبح ساري المفعول",
|
||||
"DeleteRootFolderMessageText": "هل أنت متأكد أنك تريد حذف المفهرس \"{0}\"؟",
|
||||
"LoadingBooksFailed": "فشل تحميل ملفات الفيلم",
|
||||
"ProxyUsernameHelpText": "ما عليك سوى إدخال اسم مستخدم وكلمة مرور إذا كان أحدهما مطلوبًا. اتركها فارغة وإلا.",
|
||||
@@ -636,5 +634,13 @@
|
||||
"ListsSettingsSummary": "القوائم",
|
||||
"SelectDropdown": "'تحديد...",
|
||||
"SelectQuality": "حدد الجودة",
|
||||
"CustomFilter": "مرشحات مخصصة"
|
||||
"CustomFilter": "مرشحات مخصصة",
|
||||
"IndexerFlags": "أعلام المفهرس",
|
||||
"InteractiveSearchModalHeader": "بحث تفاعلي",
|
||||
"ApiKey": "مفتاح API",
|
||||
"AuthBasic": "أساسي (المتصفح المنبثق)",
|
||||
"AuthForm": "النماذج (صفحة تسجيل الدخول)",
|
||||
"Enabled": "ممكن",
|
||||
"FailedLoadingSearchResults": "فشل تحميل نتائج البحث ، يرجى المحاولة مرة أخرى.",
|
||||
"DisabledForLocalAddresses": "معطل بسبب العناوين المحلية"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"ApiKeyHelpTextWarning": "Изисква рестартиране, за да влезе в сила",
|
||||
"Enable": "Активиране",
|
||||
"MIA": "МВР",
|
||||
"Size": " Размер",
|
||||
@@ -7,7 +6,6 @@
|
||||
"20MinutesTwenty": "120 минути: {0}",
|
||||
"45MinutesFourtyFive": "90 минути: {0}",
|
||||
"60MinutesSixty": "60 минути: {0}",
|
||||
"APIKey": "API ключ",
|
||||
"About": "относно",
|
||||
"AddListExclusion": "Добавяне на изключване от списъка",
|
||||
"AddingTag": "Добавяне на таг",
|
||||
@@ -636,5 +634,13 @@
|
||||
"SelectDropdown": "„Изберете ...",
|
||||
"SelectQuality": "Изберете Качество",
|
||||
"CustomFilter": "Персонализирани филтри",
|
||||
"RemoveQueueItemConfirmation": "Наистина ли искате да премахнете {0} елемент {1} от опашката?"
|
||||
"RemoveQueueItemConfirmation": "Наистина ли искате да премахнете {0} елемент {1} от опашката?",
|
||||
"IndexerFlags": "Индексиращи знамена",
|
||||
"InteractiveSearchModalHeader": "Интерактивно търсене",
|
||||
"FailedLoadingSearchResults": "Неуспешно зареждане на резултатите от търсенето, моля, опитайте отново.",
|
||||
"ApiKey": "API ключ",
|
||||
"AuthBasic": "Основно (изскачащ прозорец на браузъра)",
|
||||
"AuthForm": "Формуляри (Страница за вход)",
|
||||
"DisabledForLocalAddresses": "Забранено за местни адреси",
|
||||
"Enabled": "Активирано"
|
||||
}
|
||||
|
||||
@@ -432,7 +432,7 @@
|
||||
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS no és compatible amb aquest indexador",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "S'utilitzarà quan es realitzin cerques automàtiques mitjançant la interfície d'usuari o per Radarr",
|
||||
"CutoffHelpText": "Un cop s'assoleixi aquesta qualitat, Radarr ja no baixarà pel·lícules",
|
||||
"ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?",
|
||||
"ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau API?",
|
||||
"PropersAndRepacks": "Propietats i Repacks",
|
||||
"RemotePathMappingCheckFolderPermissions": "Radarr pot veure però no accedir al directori de descàrregues {0}. Error de permisos probable.",
|
||||
"RescanAuthorFolderAfterRefresh": "Torna a escanejar la carpeta de pel·lícules després de l'actualització",
|
||||
@@ -443,7 +443,7 @@
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "La carpeta de pel·lícules '{0}' i tot el seu contingut es suprimiran.",
|
||||
"UrlBaseHelpTextWarning": "Cal reiniciar perquè tingui efecte",
|
||||
"ApplicationURL": "URL de l'aplicació",
|
||||
"ApplicationUrlHelpText": "URL extern d'aquesta aplicació, inclòs http(s)://, port i URL base",
|
||||
"ApplicationUrlHelpText": "URL extern de l'aplicació, inclòs http(s)://, port i URL base",
|
||||
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del Radarr",
|
||||
"CancelMessageText": "Esteu segur que voleu cancel·lar aquesta tasca pendent?",
|
||||
"ChownGroupHelpTextWarning": "Això només funciona si l'usuari que executa Radarr és el propietari del fitxer. És millor assegurar-se que el client de descàrrega utilitza el mateix grup que Radarr.",
|
||||
@@ -505,8 +505,6 @@
|
||||
"GrabReleaseMessageText": "Lidarr no ha pogut determinar per a quina pel·lícula era aquest llançament. És possible que Lidarr no pugui importar automàticament aquesta versió. Voleu capturar \"{0}\"?",
|
||||
"IsCutoffCutoff": "Requisit",
|
||||
"MountCheckMessage": "El muntatge que conté una ruta de pel·lícula es munta com a només de lectura: ",
|
||||
"APIKey": "Clau API",
|
||||
"ApiKeyHelpTextWarning": "Cal reiniciar perquè tingui efecte",
|
||||
"RescanAfterRefreshHelpTextWarning": "Radarr no detectarà automàticament els canvis als fitxers quan no estigui configurat com a \"Sempre\"",
|
||||
"ShowUnknownAuthorItems": "Mostra elements de pel·lícula desconeguda",
|
||||
"Size": " Mida",
|
||||
@@ -564,13 +562,13 @@
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "La cerca no és compatible amb aquest indexador",
|
||||
"UnableToAddANewMetadataProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.",
|
||||
"RequiredPlaceHolder": "Afegeix una nova restricció",
|
||||
"20MinutesTwenty": "60 minuts: {0}",
|
||||
"20MinutesTwenty": "20 minuts: {0}",
|
||||
"AlternateTitles": "Títols alternatius",
|
||||
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de Radarr. Això inclou informació sobre el vostre navegador, quines pàgines Radarr WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió del temps d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.",
|
||||
"AnalyticsEnabledHelpTextWarning": "Cal reiniciar perquè tingui efecte",
|
||||
"AuthenticationMethodHelpText": "Requereix nom d'usuari i contrasenya per accedir al radar",
|
||||
"CalendarWeekColumnHeaderHelpText": "Es mostra a sobre de cada columna quan la setmana és la visualització activa",
|
||||
"45MinutesFourtyFive": "60 minuts: {0}",
|
||||
"45MinutesFourtyFive": "45 minuts: {0}",
|
||||
"60MinutesSixty": "60 minuts: {0}",
|
||||
"BindAddressHelpTextWarning": "Cal reiniciar perquè tingui efecte",
|
||||
"BookIsDownloading": "La pel·lícula s'està baixant",
|
||||
@@ -658,11 +656,11 @@
|
||||
"Activity": "Activitat",
|
||||
"AddNew": "Afegeix nou",
|
||||
"ApplyTagsHelpTextReplace": "Substitució: substituïu les etiquetes per les etiquetes introduïdes (no introduïu cap etiqueta per a esborrar totes les etiquetes)",
|
||||
"ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes",
|
||||
"ApplyTagsHelpTextRemove": "Eliminació: elimina les etiquetes introduïdes",
|
||||
"BlocklistReleases": "Llista de llançaments bloquejats",
|
||||
"AutoAdd": "Afegeix automàticament",
|
||||
"Backup": "Còpia de seguretat",
|
||||
"ApplyTagsHelpTextAdd": "Afegeix: afegeix les etiquetes a la llista d'etiquetes existent",
|
||||
"ApplyTagsHelpTextAdd": "Afegiment: afegeix les etiquetes a la llista d'etiquetes existent",
|
||||
"DeleteSelectedIndexersMessageText": "Esteu segur que voleu suprimir {count} indexador(s) seleccionat(s)?",
|
||||
"DeleteSelectedIndexers": "Suprimeix l'indexador(s)",
|
||||
"DeleteRemotePathMappingMessageText": "Esteu segur que voleu suprimir aquesta assignació de camins remots?",
|
||||
@@ -691,5 +689,100 @@
|
||||
"Ui": "Interfície",
|
||||
"Other": "Altres",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "Tornar a baixar baixades fallades des de la cerca interactiva",
|
||||
"AutoRedownloadFailed": "Tornar a baixar les baixades fallades"
|
||||
"AutoRedownloadFailed": "Tornar a baixar les baixades fallades",
|
||||
"BlocklistAndSearch": "Llista de bloqueig i cerca",
|
||||
"BlocklistAndSearchHint": "Comença una cerca per reemplaçar després d'haver bloquejat",
|
||||
"ClickToChangeIndexerFlags": "Feu clic per canviar els indicadors de l'indexador",
|
||||
"CustomFormatsSpecificationFlag": "Bandera",
|
||||
"CustomFormatsSpecificationRegularExpression": "Expressió regular",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "El format personalitzat RegEx no distingeix entre majúscules i minúscules",
|
||||
"BlocklistAndSearchMultipleHint": "Comença una cerca per reemplaçar després d'haver bloquejat",
|
||||
"BlocklistMultipleOnlyHint": "Afegeix a la llista de bloqueig sense cercar substituts",
|
||||
"BlocklistOnlyHint": "Afegir a la llista de bloqueig sense cercar substituts",
|
||||
"BlocklistOnly": "Sols afegir a la llista de bloqueig",
|
||||
"ChangeCategory": "Canvia categoria",
|
||||
"ChangeCategoryMultipleHint": "Canvia les baixades a la \"Categoria post-importació\" des del client de descàrrega",
|
||||
"ChangeCategoryHint": "Canvia la baixada a la \"Categoria post-importació\" des del client de descàrrega",
|
||||
"CustomFilter": "Filtres personalitzats",
|
||||
"DoNotBlocklist": "No afegiu a la llista de bloqueig",
|
||||
"DoNotBlocklistHint": "Elimina sense afegir a la llista de bloqueig",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Afegeix un prefix a l'URL {connectionName}, com ara {url}",
|
||||
"DownloadClientDelugeSettingsDirectory": "Directori de baixada",
|
||||
"DownloadClientDelugeSettingsDirectoryCompleted": "Directori al qual es mou quan s'hagi completat",
|
||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge",
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Ubicació opcional de les baixades completades, deixeu-lo en blanc per utilitzar la ubicació predeterminada de Deluge",
|
||||
"WhatsNew": "Novetats",
|
||||
"SelectDropdown": "Seleccioneu...",
|
||||
"NoCutoffUnmetItems": "No hi ha elements de tall no assolits",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Com aplicar etiquetes a les pel·lícules seleccionades",
|
||||
"DeleteConditionMessageText": "Esteu segur que voleu suprimir la condició '{name}'?",
|
||||
"NoChange": "Cap canvi",
|
||||
"SetTags": "Estableix etiquetes",
|
||||
"NoResultsFound": "Sense resultats",
|
||||
"Author": "Autor",
|
||||
"ResetQualityDefinitions": "Restableix les definicions de qualitat",
|
||||
"Small": "Petita",
|
||||
"TotalSpace": "Espai total",
|
||||
"BlocklistReleaseHelpText": "Impedeix que {appName} torni a capturar aquesta versió automàticament",
|
||||
"CatalogNumber": "número de catàleg",
|
||||
"LastWriteTime": "La darrera hora d'escriptura",
|
||||
"NextExecution": "Propera execució",
|
||||
"RemoveCompleted": "S'ha eliminat",
|
||||
"SelectReleaseGroup": "Seleccioneu grup de llançament",
|
||||
"CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)",
|
||||
"Authors": "Autor",
|
||||
"FreeSpace": "Espai lliure",
|
||||
"ExtraFileExtensionsHelpText": "Llista separada per comes de fitxers addicionals per importar (.nfo s'importarà com a .nfo-orig)",
|
||||
"BypassIfAboveCustomFormatScore": "Ometre si està per sobre de la puntuació de format personalitzada",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "Habiliteu l'omissió quan la versió tingui una puntuació superior a la puntuació mínima per al format personalitzat",
|
||||
"RedownloadFailed": "Tornar a baixar les baixades fallades",
|
||||
"ExistingTag": "Etiqueta existent",
|
||||
"RemoveFailed": "Ha fallat l'eliminació",
|
||||
"ImportLists": "llista d'importació",
|
||||
"RemovingTag": "S'està eliminant l'etiqueta",
|
||||
"ApiKeyValidationHealthCheckMessage": "Actualitzeu la vostra clau de l'API perquè tingui almenys {length} caràcters. Podeu fer-ho mitjançant la configuració o el fitxer de configuració",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Exemples: '.sub, .nfo' o 'sub,nfo'",
|
||||
"SourceTitle": "Títol de la font",
|
||||
"NoEventsFound": "No s'han trobat esdeveniments",
|
||||
"InteractiveSearchModalHeader": "Cerca interactiva",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}",
|
||||
"Medium": "Suport",
|
||||
"RecentChanges": "Canvis recents",
|
||||
"Rejections": "Rebutjats",
|
||||
"StatusEndedContinuing": "Continua",
|
||||
"DeleteBookFileMessageText": "Esteu segur que voleu suprimir '{path}'?",
|
||||
"DownloadClientTagHelpText": "Utilitzeu aquest indexador només per a pel·lícules amb almenys una etiqueta coincident. Deixeu-ho en blanc per utilitzar-ho amb totes les pel·lícules.",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El client de baixada {downloadClientName} està configurat per eliminar les baixades completades. Això pot provocar que les baixades s'eliminin del vostre client abans que {1} pugui importar-les.",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Cerqueu i intenteu baixar automàticament una versió diferent quan es trobi una versió fallida a la cerca interactiva",
|
||||
"FailedLoadingSearchResults": "No s'han pogut carregar els resultats de la cerca, torneu-ho a provar.",
|
||||
"IndexerFlags": "Indicadors de l'indexador",
|
||||
"Large": "Gran",
|
||||
"LastDuration": "Darrera durada",
|
||||
"LastExecution": "Darrere execució",
|
||||
"Library": "Biblioteca",
|
||||
"ListsSettingsSummary": "llista d'importació",
|
||||
"Loading": "Carregant",
|
||||
"MinimumCustomFormatScoreHelpText": "Puntuació mínima de format personalitzada necessaria per a evitar el retard del protocol preferit",
|
||||
"ProfilesSettingsSummary": "Perfils de qualitat, idioma, retard i llançament",
|
||||
"RemoveDownloadsAlert": "La configuració d'eliminació s'ha mogut a la configuració del client de baixada a la taula anterior.",
|
||||
"RemoveQueueItemConfirmation": "Esteu segur que voleu eliminar '{sourceTitle}' de la cua?",
|
||||
"RemoveSelectedItem": "Elimina l'element seleccionat",
|
||||
"RemoveSelectedItems": "Elimina els elements seleccionats",
|
||||
"RemoveSelectedItemsQueueMessageText": "Esteu segur que voleu eliminar {0} de la cua?",
|
||||
"SelectQuality": "Seleccioneu Qualitat",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "Alguns resultats estan ocults pel filtre aplicat",
|
||||
"AuthBasic": "Basic (finestra emergent del navegador)",
|
||||
"AuthForm": "Formularis (pàgina d'inici de sessió)",
|
||||
"AuthenticationMethod": "Mètode d'autenticació",
|
||||
"AuthenticationMethodHelpTextWarning": "Seleccioneu un mètode d'autenticació vàlid",
|
||||
"AuthenticationRequired": "Autenticació necessària",
|
||||
"AuthenticationRequiredHelpText": "Canvia per a quines sol·licituds cal autenticar. No canvieu tret que entengueu els riscos.",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmeu la nova contrasenya",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Introduïu una contrasenya nova",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou",
|
||||
"AuthenticationRequiredWarning": "Per a evitar l'accés remot sense autenticació, ara {appName} requereix que l'autenticació estigui activada. Opcionalment, podeu desactivar l'autenticació des d'adreces locals.",
|
||||
"DisabledForLocalAddresses": "Desactivat per a adreces locals",
|
||||
"Enabled": "Habilitat",
|
||||
"External": "Extern",
|
||||
"ApiKey": "Clau API"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{
|
||||
"ApiKeyHelpTextWarning": "Vyžaduje restart, aby se projevilo",
|
||||
"AnalyticsEnabledHelpTextWarning": "Vyžaduje restart, aby se projevilo",
|
||||
"DeleteRootFolderMessageText": "Opravdu chcete odstranit indexer „{0}“?",
|
||||
"Group": "Skupina",
|
||||
@@ -12,7 +11,6 @@
|
||||
"20MinutesTwenty": "120 minut: {0}",
|
||||
"45MinutesFourtyFive": "90 minut: {0}",
|
||||
"60MinutesSixty": "60 minut: {0}",
|
||||
"APIKey": "Klíč API",
|
||||
"About": "O aplikaci",
|
||||
"AddListExclusion": "Přidat vyloučení seznamu",
|
||||
"AddingTag": "Přidání značky",
|
||||
@@ -68,7 +66,7 @@
|
||||
"CreateEmptyAuthorFoldersHelpText": "Během skenování disku vytvářejte chybějící složky filmů",
|
||||
"CreateGroup": "Vytvořit skupinu",
|
||||
"CutoffHelpText": "Jakmile je této kvality dosaženo, Radarr již nebude stahovat filmy",
|
||||
"CutoffUnmet": "Vynechat nevyhovující",
|
||||
"CutoffUnmet": "Mezní hodnota nesplněna",
|
||||
"DatabaseMigration": "Migrace databáze",
|
||||
"Dates": "Termíny",
|
||||
"DelayProfile": "Profil zpoždění",
|
||||
@@ -691,5 +689,15 @@
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Automaticky vyhledat a pokusit se o stažení jiného vydání, pokud bylo neúspěšné vydání zachyceno z interaktivního vyhledávání",
|
||||
"SelectDropdown": "'Vybrat...",
|
||||
"CustomFilter": "Vlastní filtry",
|
||||
"SelectQuality": "Vyberte kvalitu"
|
||||
"SelectQuality": "Vyberte kvalitu",
|
||||
"IndexerFlags": "Příznaky indexeru",
|
||||
"InteractiveSearchModalHeader": "Interaktivní vyhledávání",
|
||||
"FailedLoadingSearchResults": "Výsledky vyhledávání se nepodařilo načíst, zkuste to prosím znovu.",
|
||||
"CustomFormatsSpecificationFlag": "Vlajka",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Vlastní formát RegEx nerozlišuje velká a malá písmena",
|
||||
"BlocklistAndSearch": "Seznam blokovaných a vyhledávání",
|
||||
"ChangeCategory": "Změnit kategorii",
|
||||
"BlocklistMultipleOnlyHint": "Blokovat a nehledat náhradu",
|
||||
"CustomFormatsSettingsTriggerInfo": "Vlastní formát se použije na vydání nebo soubor, pokud odpovídá alespoň jednomu z různých typů zvolených podmínek.",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Přidá předponu do {connectionName} url, jako např. {url}"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"20MinutesTwenty": "20 minutter: {0}",
|
||||
"45MinutesFourtyFive": "45 minutter: {0}",
|
||||
"60MinutesSixty": "60 minutter: {0}",
|
||||
"APIKey": "API-nøgle",
|
||||
"About": "Om",
|
||||
"AddListExclusion": "Tilføj ekskludering af liste",
|
||||
"AddingTag": "Tilføjer tag",
|
||||
@@ -431,7 +430,6 @@
|
||||
"WeekColumnHeader": "Ugens kolonneoverskrift",
|
||||
"Year": "År",
|
||||
"YesCancel": "Ja, Annuller",
|
||||
"ApiKeyHelpTextWarning": "Kræver genstart for at træde i kraft",
|
||||
"DeleteRootFolderMessageText": "Er du sikker på, at du vil slette indeksøren '{0}'?",
|
||||
"LoadingBooksFailed": "Indlæsning af filmfiler mislykkedes",
|
||||
"ProxyPasswordHelpText": "Du skal kun indtaste et brugernavn og en adgangskode, hvis der kræves et. Lad dem være tomme ellers.",
|
||||
@@ -644,5 +642,17 @@
|
||||
"CustomFilter": "Bruger Tilpassede Filtere",
|
||||
"SelectDropdown": "'Vælg...",
|
||||
"SelectQuality": "Vælg Kvalitet",
|
||||
"ApplyChanges": "Anvend ændringer"
|
||||
"ApplyChanges": "Anvend ændringer",
|
||||
"Series": "Serie",
|
||||
"IndexerFlags": "Indexer Flag",
|
||||
"InteractiveSearchModalHeader": "Interaktiv søgning",
|
||||
"Theme": "Tema",
|
||||
"Publisher": "Udgiver",
|
||||
"CatalogNumber": "katalognummer",
|
||||
"FailedLoadingSearchResults": "Kunne ikke indlæse søgeresultater. Prøv igen.",
|
||||
"AuthBasic": "Grundlæggende (pop op-browser)",
|
||||
"AuthForm": "Formularer (login-side)",
|
||||
"DisabledForLocalAddresses": "Deaktiveret for lokale adresser",
|
||||
"Enabled": "Aktiveret",
|
||||
"ApiKey": "API-nøgle"
|
||||
}
|
||||
|
||||
@@ -5,11 +5,10 @@
|
||||
"20MinutesTwenty": "20 Minuten: {0}",
|
||||
"45MinutesFourtyFive": "45 Minuten: {0}",
|
||||
"60MinutesSixty": "60 Minuten: {0}",
|
||||
"APIKey": "API-Schlüssel",
|
||||
"About": "Über",
|
||||
"AddListExclusion": "Listenausschluss hinzufügen",
|
||||
"AddingTag": "Tag hinzufügen",
|
||||
"AgeWhenGrabbed": "Alter (zum Zeitpunkt der Entführung)",
|
||||
"AgeWhenGrabbed": "Alter (bei Erfassung)",
|
||||
"AlreadyInYourLibrary": "Bereits in Ihrer Bibliothek",
|
||||
"AlternateTitles": "Alternative Titel",
|
||||
"Analytics": "Analysen",
|
||||
@@ -61,7 +60,7 @@
|
||||
"CreateEmptyAuthorFoldersHelpText": "Leere Filmordner für fehlende Filme beim Scan erstellen",
|
||||
"CreateGroup": "Gruppe erstellen",
|
||||
"CutoffHelpText": "Sobald diese Qualität erreicht wird, werden keine neuen Releases erfasst",
|
||||
"CutoffUnmet": "› Schwelle nicht erreicht",
|
||||
"CutoffUnmet": "Schwelle nicht erreicht",
|
||||
"DatabaseMigration": "DB Migration",
|
||||
"Dates": "Termine",
|
||||
"DelayProfile": "Verzögerungsprofil",
|
||||
@@ -69,24 +68,24 @@
|
||||
"DelayingDownloadUntilInterp": "Download verzögern bis {0} um {1}",
|
||||
"Delete": "Löschen",
|
||||
"DeleteBackup": "Sicherung löschen",
|
||||
"DeleteBackupMessageText": "Sind Sie sicher, dass Sie die Sicherung „{name}“ löschen möchten?",
|
||||
"DeleteBackupMessageText": "Soll das Backup '{name}' wirklich gelöscht werden?",
|
||||
"DeleteDelayProfile": "Verzögerungsprofil löschen",
|
||||
"DeleteDelayProfileMessageText": "Sind Sie sicher, dass Sie dieses Verzögerungsprofil löschen möchten?",
|
||||
"DeleteDownloadClient": "Download-Client löschen",
|
||||
"DeleteDownloadClientMessageText": "Sind Sie sicher, dass Sie den Download-Client „{name}“ löschen möchten?",
|
||||
"DeleteDownloadClientMessageText": "Bist du sicher, dass du den Download Client '{name}' wirklich löschen willst?",
|
||||
"DeleteEmptyFolders": "Leere Ordner löschen",
|
||||
"DeleteEmptyFoldersHelpText": "Lösche leere Autorordner während des Scans oder wenn Buchdateien gelöscht werden",
|
||||
"DeleteImportListMessageText": "Sind Sie sicher, dass Sie die Liste „{name}“ löschen möchten?",
|
||||
"DeleteImportListMessageText": "Bist du sicher, dass du die Liste '{name}' wirklich löschen willst?",
|
||||
"DeleteIndexer": "Indexer löschen",
|
||||
"DeleteIndexerMessageText": "Sind Sie sicher, dass Sie den Indexer „{name}“ löschen möchten?",
|
||||
"DeleteMetadataProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?",
|
||||
"DeleteIndexerMessageText": "Bist du sicher, dass du den Indexer '{name}' wirklich löschen willst?",
|
||||
"DeleteMetadataProfileMessageText": "Bist du sicher, dass du das Qualitätsprofil '{name}' wirklich löschen willst?",
|
||||
"DeleteNotification": "Benachrichtigung löschen",
|
||||
"DeleteNotificationMessageText": "Sind Sie sicher, dass Sie die Benachrichtigung „{name}“ löschen möchten?",
|
||||
"DeleteNotificationMessageText": "Bist du sicher, dass du die Benachrichtigung '{name}' wirklich löschen willst?",
|
||||
"DeleteQualityProfile": "Qualitätsprofil löschen",
|
||||
"DeleteQualityProfileMessageText": "Sind Sie sicher, dass Sie das Qualitätsprofil „{name}“ löschen möchten?",
|
||||
"DeleteQualityProfileMessageText": "Bist du sicher, dass du das Qualitätsprofil '{name}' wirklich löschen willst?",
|
||||
"DeleteReleaseProfile": "Release-Profil löschen",
|
||||
"DeleteReleaseProfileMessageText": "Bist du sicher, dass du dieses Release-Profil löschen willst?",
|
||||
"DeleteRootFolderMessageText": "Indexer '{0}' wirklich löschen?",
|
||||
"DeleteRootFolderMessageText": "Bist du sicher, dass du den Root-Ordner '{name}' wirklich löschen willst?",
|
||||
"DeleteSelectedBookFiles": "Ausgewählte Filmdateien löschen",
|
||||
"DeleteSelectedBookFilesMessageText": "Ausgewählte Filme wirklich löschen?",
|
||||
"DeleteTag": "Tag löschen",
|
||||
@@ -274,7 +273,7 @@
|
||||
"RemoveCompletedDownloadsHelpText": "Importierte Downloads aus dem Downloader Verlauf entfernen",
|
||||
"RemoveFailedDownloadsHelpText": "Fehlgeschlagene Downloads aus dem Downloader Verlauf entfernen",
|
||||
"RemoveFilter": "Filter entfernen",
|
||||
"RemoveFromDownloadClient": "Vom Download-Client entfernen",
|
||||
"RemoveFromDownloadClient": "Aus dem Download Client entfernen",
|
||||
"RemoveFromQueue": "Aus der Warteschlage entfernen",
|
||||
"RemoveHelpTextWarning": "Dies wird den Download und alle bereits heruntergeladenen Dateien aus dem Downloader entfernen.",
|
||||
"RemoveSelected": "Auswahl entfernen",
|
||||
@@ -427,7 +426,6 @@
|
||||
"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",
|
||||
"Book": "Buch",
|
||||
"Authors": "Autoren",
|
||||
"AuthorFolderFormat": "Autor Orderformat",
|
||||
@@ -464,7 +462,7 @@
|
||||
"DownloadClientCheckDownloadingToRoot": "Download-Client {0} legt Downloads im Stammordner {1} ab. Sie sollten nicht in einen Stammordner herunterladen.",
|
||||
"Series": "Serien",
|
||||
"Publisher": "Herausgeber",
|
||||
"MaintenanceRelease": "Wartung: Fehlerbehebung und andere Verbesserungen. Siehe Github Commit History für weitere Details",
|
||||
"MaintenanceRelease": "Maintenance Release: Fehlerbehebungen und andere Verbesserungen. Siehe Github Commit Verlauf für weitere Details",
|
||||
"LogRotation": "Logrotation",
|
||||
"LogRotateHelpText": "Max. Anzahl der zu behaltenden Logdateien",
|
||||
"Label": "Label",
|
||||
@@ -606,7 +604,7 @@
|
||||
"OnImportFailureHelpText": "Bei fehlgeschlagenem Import",
|
||||
"OnReleaseImport": "Bei Veröffentlichungsimport",
|
||||
"OnReleaseImportHelpText": "Bei Veröffentlichungsimport",
|
||||
"OnRename": "Bei Umbenennen",
|
||||
"OnRename": "Bei Umbenennung",
|
||||
"PastDaysHelpText": "Tage für iCal-Feed, um in die Vergangenheit zu schauen",
|
||||
"PathHelpTextWarning": "Dies muss ein anderes Verzeichnis sein als das, in dem der Download Client die Dateien ablegt",
|
||||
"ReleaseProfiles": "Veröffentlichungsprofile",
|
||||
@@ -705,7 +703,7 @@
|
||||
"SelectedCountAuthorsSelectedInterp": "{0} Künstler ausgewählt",
|
||||
"SizeLimit": "Grössenlimit",
|
||||
"TheBooksFilesWillBeDeleted": "Die Dateien des Albums werden gelöscht.",
|
||||
"MediaManagement": "Medien",
|
||||
"MediaManagement": "Medienverwaltung",
|
||||
"Metadata": "Metadaten",
|
||||
"MountCheckMessage": "Der Einhängepunkt, welcher einen Filmpfad enthält, ist schreibgeschützt eingehängt: ",
|
||||
"OnBookFileDelete": "Bei Filmdatei löschen",
|
||||
@@ -875,7 +873,7 @@
|
||||
"CustomFormatSettings": "Einstellungen für eigene Formate",
|
||||
"DataFutureBooks": "Überwachung von Alben die noch nicht veröffentlicht wurden",
|
||||
"DeleteCustomFormat": "Benutzerdefiniertes Format löschen",
|
||||
"DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{0}' löschen willst?",
|
||||
"DeleteCustomFormatMessageText": "Bist du sicher, dass du das benutzerdefinierte Format '{name}' wirklich löschen willst?",
|
||||
"IncludeCustomFormatWhenRenamingHelpText": "In {Custom Formats} umbennenungs Format",
|
||||
"ResetTitles": "Titel zurücksetzen",
|
||||
"UnableToLoadCustomFormats": "Eigene Formate konnten nicht geladen werden",
|
||||
@@ -931,13 +929,13 @@
|
||||
"RemoveFailed": "Fehlgeschlagene entfernen",
|
||||
"RemoveCompleted": "Abgeschlossene entfernen",
|
||||
"ApplyChanges": "Änderungen anwenden",
|
||||
"ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "So wenden Sie Tags auf die ausgewählten Importlisten an",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an",
|
||||
"ApplyTagsHelpTextAdd": "Hinzufügen: Füge Tags zu den bestehenden Tags hinzu",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Wie Tags den selektierten Importlisten hinzugefügt werden können",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Wie Tags zu den selektierten Indexern hinzugefügt werden können",
|
||||
"AutomaticAdd": "Automatisch hinzufügen",
|
||||
"ApplyTagsHelpTextRemove": "Entfernen: Die eingegebenen Tags entfernen",
|
||||
"ApplyTagsHelpTextReplace": "Ersetzen: Ersetzen Sie die Tags durch die eingegebenen Tags (geben Sie keine Tags ein, um alle Tags zu löschen).",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "So wenden Sie Tags auf die ausgewählten Download-Clients an",
|
||||
"ApplyTagsHelpTextRemove": "Entfernen: Entferne die hinterlegten Tags",
|
||||
"ApplyTagsHelpTextReplace": "Ersetzen: Ersetze die Tags mit den eingegebenen Tags (keine Tags eingeben um alle Tags zu löschen)",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Wie Tags zu den selektierten Downloadclients hinzugefügt werden können",
|
||||
"CountIndexersSelected": "{0} Indexer ausgewählt",
|
||||
"DeleteSelectedDownloadClients": "Lösche Download Client(s)",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?",
|
||||
@@ -988,7 +986,7 @@
|
||||
"Clone": "Klonen",
|
||||
"AutomaticUpdatesDisabledDocker": "Automatische Updates werden bei Verwendung des Docker-Update-Mechanismus nicht direkt unterstützt. Sie müssen das Container-Image außerhalb von {appName} aktualisieren oder ein Skript verwenden",
|
||||
"AutoAdd": "Automatisch hinzufügen",
|
||||
"WouldYouLikeToRestoreBackup": "Möchten Sie die Sicherung „{name}“ wiederherstellen?",
|
||||
"WouldYouLikeToRestoreBackup": "Willst du das Backup '{name}' wiederherstellen?",
|
||||
"Unmonitored": "Nicht beobachtet",
|
||||
"Retention": "Aufbewahrung ( Retention )",
|
||||
"ClickToChangeIndexerFlags": "Klicken, um Indexer-Flags zu ändern",
|
||||
@@ -998,5 +996,72 @@
|
||||
"BlocklistMultipleOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternativen zu suchen",
|
||||
"BlocklistOnly": "Nur der Sperrliste hinzufügen",
|
||||
"BlocklistOnlyHint": "Der Sperrliste hinzufügen, ohne nach Alternative zu suchen",
|
||||
"ChangeCategory": "Kategorie wechseln"
|
||||
"ChangeCategory": "Kategorie wechseln",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Tag wird nicht benutzt und kann gelöscht werden",
|
||||
"ExtraFileExtensionsHelpText": "Kommaseparierte Liste von Dateiendungen die als Extra Dateien importiert werden sollen ( .nfo wird in .nfo-orig umbenannt )",
|
||||
"DeleteImportListExclusion": "Importlisten Ausschluss löschen",
|
||||
"IndexerFlags": "Indexer-Flags",
|
||||
"CountAuthorsSelected": "{selectedCount} Künstler ausgewählt",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Vorschläge: sub, nfo, srt, jpg",
|
||||
"DownloadClient": "Downloader",
|
||||
"ShowMonitoredHelpText": "Beobachtungsstatus unter dem Plakat anzeigen",
|
||||
"CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt",
|
||||
"CountImportListsSelected": "{selectedCount} Künstler ausgewählt",
|
||||
"CustomFormatsSpecificationRegularExpression": "Regulären Ausdruck",
|
||||
"DeleteImportListExclusionMessageText": "Bist du sicher, dass du diesen Importlisten Ausschluss löschen willst?",
|
||||
"CustomFilter": "Benutzerdefinierter Filter",
|
||||
"AutoRedownloadFailed": "Erneuter Download fehlgeschlagen",
|
||||
"SourceTitle": "Quellentitel",
|
||||
"Tags": "Tags",
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Optionaler Speicherort für Downloads. Lassen Sie das Feld leer, um den standardmäßigen rTorrent-Speicherort zu verwenden",
|
||||
"ErrorLoadingContent": "Beim Laden des Eintrags ist ein Fehler aufgetreten",
|
||||
"BypassIfAboveCustomFormatScore": "Umgehen, wenn über dem Wert des benutzerdefinierten Formats liegt",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "Aktivieren Sie die Umgehung, wenn die Veröffentlichung einen Wert hat, der höher ist als der konfigurierte Mindestwert für das benutzerdefinierte Format",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Der Download-Client {downloadClientName} ist so eingestellt, dass abgeschlossene Downloads entfernt werden. Dies kann dazu führen, dass Downloads von Ihrem Client entfernt werden, bevor {appName} sie importieren kann.",
|
||||
"AutoRedownloadFailedFromInteractiveSearch": "Erneuter Download aus Interaktiver Suche fehlgeschlagen",
|
||||
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Suchen Sie automatisch nach einer anderen Version und versuchen Sie, sie herunterzuladen, wenn eine fehlerhafte Version aus der interaktiven Suche ausgewählt wurde",
|
||||
"FailedLoadingSearchResults": "Die Suchergebnisse konnten nicht geladen werden. Bitte versuchen Sie es erneut.",
|
||||
"InteractiveSearchModalHeader": "Interaktive Suche",
|
||||
"MinimumCustomFormatScoreHelpText": "Mindestwert für benutzerdefiniertes Format, der erforderlich ist, um Verzögerungen für das bevorzugte Protokoll zu umgehen",
|
||||
"Rejections": "Ablehnungen",
|
||||
"RemoveQueueItemConfirmation": "Bist du sicher, dass du {0} Einträge aus der Warteschlange entfernen willst?",
|
||||
"SelectDropdown": "Auswählen...",
|
||||
"SelectQuality": "Qualität auswählen",
|
||||
"SelectReleaseGroup": "Wähle Release-Gruppe",
|
||||
"ShowMonitored": "Beobachtete anzeigen",
|
||||
"DeleteSelected": "Markierte löschen",
|
||||
"Bookshelf": "Bücherregal",
|
||||
"BypassIfHighestQualityHelpText": "Umgehen der Verzögerung, wenn die Freigabe die höchste aktivierte Qualität im Qualitätsprofil hat",
|
||||
"CustomFormatsSpecificationFlag": "Markierung",
|
||||
"DeleteFormat": "Formatierung löschen",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Benutzerdefiniertes Format RegEx ist nicht groß-/kleinschreibungssensitiv",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexer mit ungültigen Downloader: {0}.",
|
||||
"AuthorProgressBarText": "{availableBookCount} / {bookCount} (Gesamt: {totalBookCount}, Dateien: {bookFileCount})",
|
||||
"BookProgressBarText": "{bookCount} / {totalBookCount} (Dateien: {bookFileCount})",
|
||||
"ChangeCategoryHint": "Änderung des Downloads in die 'Post-Import-Kategorie' vom Download-Client",
|
||||
"ChangeCategoryMultipleHint": "Änderung der Downloads in die 'Post-Import-Kategorie' vom Download-Client",
|
||||
"DoNotBlocklist": "Nicht Sperren",
|
||||
"DoNotBlocklistHint": "Entfernen ohne Sperren",
|
||||
"CustomFormatsSettingsTriggerInfo": "Ein Eigenes Format wird auf eine Veröffentlichung oder Datei angewandt, wenn sie mindestens einer der verschiedenen ausgewählten Bedingungen entspricht.",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Fügt ein Präfix zur {connectionName} URL hinzu, z. B. {url}",
|
||||
"DownloadClientDelugeSettingsDirectory": "Download Verzeichnis",
|
||||
"DownloadClientDelugeSettingsDirectoryCompleted": "Verschieben, wenn Verzeichnis abgeschlossen",
|
||||
"IgnoreDownloadHint": "Hält {appName} von der weiteren Verarbeitung dieses Downloads ab",
|
||||
"IgnoreDownloads": "Downloads ignorieren",
|
||||
"IgnoreDownload": "Download ignorieren",
|
||||
"IgnoreDownloadsHint": "Hindert {appName}, diese Downloads weiter zu verarbeiten",
|
||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Optionaler Speicherort für Downloads. Lassen Sie das Feld leer, um den standardmäßigen rTorrent-Speicherort zu verwenden",
|
||||
"ApiKey": "API-Schlüssel",
|
||||
"AuthBasic": "Basis (Browser-Popup)",
|
||||
"AuthForm": "Formulare (Anmeldeseite)",
|
||||
"AuthenticationMethod": "Authentifizierungsmethode",
|
||||
"AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus",
|
||||
"AuthenticationRequired": "Authentifizierung benötigt",
|
||||
"AuthenticationRequiredHelpText": "Ändern, welche anfragen Authentifizierung benötigen. Ändere nichts wenn du dir nicht des Risikos bewusst bist.",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Gib einen neuen Benutzernamen ein",
|
||||
"AuthenticationRequiredWarning": "Um unberechtigte Fernzugriffe zu vermeiden benötigt {appName} jetzt , dass Authentifizierung eingeschaltet ist. Du kannst Authentifizierung optional für lokale Adressen ausschalten.",
|
||||
"DisabledForLocalAddresses": "Für lokale Adressen deaktiviert",
|
||||
"Enabled": "Aktiviert"
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
"20MinutesTwenty": "20 λεπτά: {0}",
|
||||
"45MinutesFourtyFive": "45 λεπτά: {0}",
|
||||
"60MinutesSixty": "60 λεπτά: {0}",
|
||||
"APIKey": "Κλειδί API",
|
||||
"About": "Σχετικά",
|
||||
"AddListExclusion": "Προσθήκη εξαίρεσης λίστας",
|
||||
"AddingTag": "Προσθήκη ετικέτας",
|
||||
@@ -431,7 +430,6 @@
|
||||
"WeekColumnHeader": "Κεφαλίδα στήλης εβδομάδας",
|
||||
"Year": "Ετος",
|
||||
"YesCancel": "Ναι, Ακύρωση",
|
||||
"ApiKeyHelpTextWarning": "Απαιτείται επανεκκίνηση για να τεθεί σε ισχύ",
|
||||
"LoadingBooksFailed": "Η φόρτωση αρχείων ταινίας απέτυχε",
|
||||
"ProxyUsernameHelpText": "Πρέπει να εισαγάγετε ένα όνομα χρήστη και έναν κωδικό πρόσβασης μόνο εάν απαιτείται. Αφήστε τα κενά διαφορετικά.",
|
||||
"SslCertPathHelpTextWarning": "Απαιτείται επανεκκίνηση για να τεθεί σε ισχύ",
|
||||
@@ -993,5 +991,26 @@
|
||||
"AppUpdated": "{appName} Ενημερώθηκε",
|
||||
"AppUpdatedVersion": "ξαναφορτωθεί",
|
||||
"AutoAdd": "Προσθήκη",
|
||||
"ErrorLoadingContent": "Υπήρξε ένα σφάλμα κατά τη φόρτωση του αρχείου"
|
||||
"ErrorLoadingContent": "Υπήρξε ένα σφάλμα κατά τη φόρτωση του αρχείου",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Παραδείγματα: «.sub, .nfo» ή «sub, nfo»",
|
||||
"IndexerFlags": "Σημαίες ευρετηρίου",
|
||||
"InteractiveSearchModalHeader": "Διαδραστική αναζήτηση",
|
||||
"ExtraFileExtensionsHelpText": "Λίστα πρόσθετων αρχείων που διαχωρίζονται με κόμμα για εισαγωγή (το .nfo θα εισαχθεί ως .nfo-orig)",
|
||||
"CustomFilter": "Custom Φιλτρα",
|
||||
"DeleteSelected": "Διαγραφή επιλεγμένων",
|
||||
"SourceTitle": "Τίτλος πηγής",
|
||||
"AutoRedownloadFailed": "Η λήψη απέτυχε",
|
||||
"FailedLoadingSearchResults": "Αποτυχία φόρτωσης αποτελεσμάτων αναζήτησης, δοκιμάστε ξανά.",
|
||||
"RemoveQueueItemConfirmation": "Είστε σίγουροι πως θέλετε να διαγράψετε {0} αντικείμενα από την ουρά;",
|
||||
"SelectDropdown": "'Επιλέγω...",
|
||||
"SelectQuality": "Επιλέξτε Ποιότητα",
|
||||
"SelectReleaseGroup": "Επιλέξτε Ομάδα έκδοσης",
|
||||
"AuthBasic": "Βασικό (Αναδυόμενο παράθυρο προγράμματος περιήγησης)",
|
||||
"AuthForm": "Φόρμες (σελίδα σύνδεσης)",
|
||||
"AuthenticationRequired": "Απαιτείται πιστοποίηση",
|
||||
"AuthenticationRequiredHelpText": "Αλλαγή για τα οποία απαιτείται έλεγχος ταυτότητας. Μην αλλάζετε αν δεν κατανοήσετε τους κινδύνους.",
|
||||
"AuthenticationRequiredWarning": "Για να αποτρέψει την απομακρυσμένη πρόσβαση χωρίς έλεγχο ταυτότητας, το {appName} απαιτεί τώρα να ενεργοποιηθεί ο έλεγχος ταυτότητας. Διαμορφώστε τη μέθοδο ελέγχου ταυτότητας και τα διαπιστευτήριά σας. Μπορείτε προαιρετικά να απενεργοποιήσετε τον έλεγχο ταυτότητας από τοπικές διευθύνσεις. Ανατρέξτε στις Συχνές Ερωτήσεις για πρόσθετες πληροφορίες.",
|
||||
"Enabled": "Ενεργοποιήθηκε",
|
||||
"ApiKey": "Κλειδί API",
|
||||
"DisabledForLocalAddresses": "Απενεργοποιήθηκε για τοπικές διευθύνσεις"
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
"20MinutesTwenty": "20 Minutes: {0}",
|
||||
"45MinutesFourtyFive": "45 Minutes: {0}",
|
||||
"60MinutesSixty": "60 Minutes: {0}",
|
||||
"APIKey": "API Key",
|
||||
"ASIN": "ASIN",
|
||||
"About": "About",
|
||||
"Actions": "Actions",
|
||||
@@ -33,7 +32,7 @@
|
||||
"AnalyticsEnabledHelpText": "Send anonymous usage and error information to Readarr's servers. This includes information on your browser, which Readarr WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes.",
|
||||
"AnalyticsEnabledHelpTextWarning": "Requires restart to take effect",
|
||||
"AnyEditionOkHelpText": "Readarr will automatically switch to the edition best matching downloaded files",
|
||||
"ApiKeyHelpTextWarning": "Requires restart to take effect",
|
||||
"ApiKey": "API Key",
|
||||
"ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file",
|
||||
"AppDataDirectory": "AppData Directory",
|
||||
"AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update",
|
||||
@@ -51,8 +50,18 @@
|
||||
"ApplyTagsHelpTextRemove": "Remove: Remove the entered tags",
|
||||
"ApplyTagsHelpTextReplace": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)",
|
||||
"AudioFileMetadata": "Write Metadata to Audio Files",
|
||||
"AuthBasic": "Basic (Browser Popup)",
|
||||
"AuthForm": "Forms (Login Page)",
|
||||
"Authentication": "Authentication",
|
||||
"AuthenticationMethodHelpText": "Require Username and Password to access Readarr",
|
||||
"AuthenticationMethod": "Authentication Method",
|
||||
"AuthenticationMethodHelpText": "Require Username and Password to access {appName}",
|
||||
"AuthenticationMethodHelpTextWarning": "Please select a valid authentication method",
|
||||
"AuthenticationRequired": "Authentication Required",
|
||||
"AuthenticationRequiredHelpText": "Change which requests authentication is required for. Do not change unless you understand the risks.",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirm new password",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Enter a new password",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Enter a new username",
|
||||
"AuthenticationRequiredWarning": "To prevent remote access without authentication, {appName} now requires authentication to be enabled. You can optionally disable authentication from local addresses.",
|
||||
"Author": "Author",
|
||||
"AuthorClickToChangeBook": "Click to change book",
|
||||
"AuthorEditor": "Author Editor",
|
||||
@@ -193,6 +202,7 @@
|
||||
"CustomFormatScore": "Custom Format Score",
|
||||
"CustomFormatSettings": "Custom Format Settings",
|
||||
"CustomFormats": "Custom Formats",
|
||||
"CustomFormatsSettingsTriggerInfo": "A Custom Format will be applied to a release or file when it matches at least one of each of the different condition types chosen.",
|
||||
"CustomFormatsSpecificationFlag": "Flag",
|
||||
"CustomFormatsSpecificationRegularExpression": "Regular Expression",
|
||||
"CustomFormatsSpecificationRegularExpressionHelpText": "Custom Format RegEx is Case Insensitive",
|
||||
@@ -276,6 +286,7 @@
|
||||
"DetailedProgressBarHelpText": "Show text on progress bar",
|
||||
"Development": "Development",
|
||||
"Disabled": "Disabled",
|
||||
"DisabledForLocalAddresses": "Disabled for Local Addresses",
|
||||
"DiscCount": "Disc Count",
|
||||
"DiscNumber": "Disc Number",
|
||||
"DiskSpace": "Disk Space",
|
||||
@@ -330,6 +341,7 @@
|
||||
"EnableRssHelpText": "Will be used when Readarr periodically looks for releases via RSS Sync",
|
||||
"EnableSSL": "Enable SSL",
|
||||
"EnableSslHelpText": " Requires restart running as administrator to take effect",
|
||||
"Enabled": "Enabled",
|
||||
"EnabledHelpText": "Check to enable release profile",
|
||||
"Ended": "Ended",
|
||||
"EndedAllBooksDownloaded": "Ended (All books downloaded)",
|
||||
@@ -344,9 +356,11 @@
|
||||
"ExistingTag": "Existing tag",
|
||||
"ExistingTagsScrubbed": "Existing tags scrubbed",
|
||||
"ExportCustomFormat": "Export Custom Format",
|
||||
"External": "External",
|
||||
"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",
|
||||
"FailedLoadingSearchResults": "Failed to load search results, please try again.",
|
||||
"FailedToLoadQueue": "Failed to load Queue",
|
||||
"FileDateHelpText": "Change file date on import/rescan",
|
||||
"FileDetails": "File Details",
|
||||
@@ -455,6 +469,10 @@
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "All search-capable indexers are temporarily unavailable due to recent indexer errors",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "No indexers available with Interactive Search enabled, Readarr will not provide any interactive search results",
|
||||
"IndexerSettings": "Indexer Settings",
|
||||
"IndexerSettingsSeedRatio": "Seed Ratio",
|
||||
"IndexerSettingsSeedRatioHelpText": "The ratio a torrent should reach before stopping, empty uses the download client's default. Ratio should be at least 1.0 and follow the indexers rules",
|
||||
"IndexerSettingsSeedTime": "Seed Time",
|
||||
"IndexerSettingsSeedTimeHelpText": "The time a torrent should be seeded before stopping, empty uses the download client's default",
|
||||
"IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}",
|
||||
"IndexerTagsHelpText": "Only use this indexer for authors with at least one matching tag. Leave blank to use with all authors.",
|
||||
@@ -673,6 +691,7 @@
|
||||
"PageSize": "Page Size",
|
||||
"PageSizeHelpText": "Number of items to show on each page",
|
||||
"Password": "Password",
|
||||
"PasswordConfirmation": "Password Confirmation",
|
||||
"PasswordHelpText": "Calibre content server password",
|
||||
"PastDays": "Past Days",
|
||||
"PastDaysHelpText": "Days for iCal feed to look into the past",
|
||||
@@ -1068,6 +1087,7 @@
|
||||
"WatchRootFoldersForFileChanges": "Watch Root Folders for file changes",
|
||||
"WeekColumnHeader": "Week Column Header",
|
||||
"WhatsNew": "What's New?",
|
||||
"WhySearchesCouldBeFailing": "Click here to find out why searches could be failing",
|
||||
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?",
|
||||
"WriteAudioTags": "Tag Audio Files with Metadata",
|
||||
"WriteAudioTagsScrub": "Scrub Existing Tags",
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"ApiKeyHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
||||
"DeleteRootFolderMessageText": "¿Está seguro de querer eliminar la carpeta raíz '{0}'?",
|
||||
"DeleteRootFolderMessageText": "¿Estás seguro que quieres eliminar la carpeta raíz '{name}'?",
|
||||
"LoadingBooksFailed": "La carga de los archivos ha fallado",
|
||||
"ProxyUsernameHelpText": "Solo necesitas introducir un usuario y contraseña si se requiere alguno. De otra forma déjalos en blanco.",
|
||||
"SslPortHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
||||
@@ -12,30 +11,29 @@
|
||||
"ShowDateAdded": "Mostrar fecha de adición",
|
||||
"Tags": "Etiquetas",
|
||||
"60MinutesSixty": "60 Minutos: {0}",
|
||||
"APIKey": "Clave API",
|
||||
"About": "Acerca de",
|
||||
"AddListExclusion": "Agregar Lista de Exclusión",
|
||||
"AddListExclusion": "Añadir lista de exclusión",
|
||||
"AddingTag": "Añadir etiqueta",
|
||||
"AgeWhenGrabbed": "Antigüedad (cuando se añadió)",
|
||||
"AlreadyInYourLibrary": "Ya en tu biblioteca",
|
||||
"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.",
|
||||
"AnalyticsEnabledHelpText": "Envía información anónima de uso y error a los servidores de Readarr. Esto incluye información sobre tu navegador, qué páginas de la interfaz web de Readarr utilizas, 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",
|
||||
"AppDataDirectory": "Directorio AppData",
|
||||
"ApplyTags": "Aplicar Etiquetas",
|
||||
"45MinutesFourtyFive": "45 Minutos: {0}",
|
||||
"Authentication": "Autenticación",
|
||||
"AuthenticationMethodHelpText": "Requerir nombre de usuario y contraseña para acceder Radarr",
|
||||
"AuthenticationMethodHelpText": "Requiere usuario y contraseña para acceder a {appName}",
|
||||
"AuthorClickToChangeBook": "Clic para cambiar la película",
|
||||
"AutoRedownloadFailedHelpText": "Buscar e intentar descargar automáticamente una versión diferente",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Las películas eliminadas del disco son automáticamente desmonitorizadas en Radarr",
|
||||
"AutoRedownloadFailedHelpText": "Busca e intenta descargar automáticamente una versión diferente",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Los libros eliminados del disco se dejan de monitorizar automáticamente en Readarr",
|
||||
"Automatic": "Automático",
|
||||
"BackupFolderHelpText": "Las rutas relativas estarán en el directorio AppData de Radarr",
|
||||
"BackupFolderHelpText": "Las rutas relativas estarán bajo el directorio AppData de Readarr",
|
||||
"BackupNow": "Hacer copia de seguridad ahora",
|
||||
"BackupRetentionHelpText": "Las copias de seguridad automáticas anteriores al período de retención serán borradas automáticamente",
|
||||
"Backups": "Copias de seguridad",
|
||||
"BindAddress": "Dirección de Ligado",
|
||||
"BindAddress": "Dirección de enlace",
|
||||
"BindAddressHelpText": "Dirección IP4 válida, localhost o '*' para todas las interfaces",
|
||||
"BindAddressHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
||||
"BookIsDownloadingInterp": "La película está descargando - {0}% {1}",
|
||||
@@ -46,25 +44,25 @@
|
||||
"Cancel": "Cancelar",
|
||||
"CancelMessageText": "Seguro que quieres cancelar esta tarea pendiente?",
|
||||
"CertificateValidation": "Validacion de certificado",
|
||||
"CertificateValidationHelpText": "Cambiar como es la validacion de la certificacion estricta de HTTPS. No cambiar a menos que entiendas las consecuencias.",
|
||||
"CertificateValidationHelpText": "Cambia cómo de estricta es la validación de certificación de HTTPS. No cambiar a menos que entiendas los riesgos.",
|
||||
"ChangeFileDate": "Cambiar fecha de archivo",
|
||||
"ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado",
|
||||
"ChmodFolder": "Carpeta chmod",
|
||||
"ChmodFolder": "chmod de la carpeta",
|
||||
"ChmodFolderHelpText": "Octal, aplicado durante la importación / cambio de nombre a carpetas y archivos multimedia (sin bits de ejecución)",
|
||||
"ChmodFolderHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Radarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga establezca los permisos correctamente.",
|
||||
"ChmodFolderHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Readarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga establezca los permisos correctamente.",
|
||||
"ChownGroupHelpText": "Nombre del grupo o gid. Utilice gid para sistemas de archivos remotos.",
|
||||
"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.",
|
||||
"ChownGroupHelpTextWarning": "Esto solo funciona si el usuario que ejecuta Readarr es el propietario del archivo. Es mejor asegurarse de que el cliente de descarga use el mismo grupo que Readarr.",
|
||||
"Clear": "Borrar",
|
||||
"ClickToChangeQuality": "Clic para cambiar la calidad",
|
||||
"Columns": "Columnas",
|
||||
"ConnectSettings": "Conectar Ajustes",
|
||||
"Connections": "Conexiones",
|
||||
"CopyUsingHardlinksHelpText": "Usar Hardlinks al intentar copiar ficheros de los torrents que siguen seedeando",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, los archivos blqoueados impiden renombrar los archivos que siguen seedeando. Puedes desactivar el seedeo temporalmete y usar la función de renombrado de Radarr como alternativa.",
|
||||
"CopyUsingHardlinksHelpText": "Los enlaces duros permiten a Readarr importar los torrents que están sembrando a las carpetas de series sin tomar espacio de disco adicional o copiar los contenidos enteros del archivo. Los enlaces duros solo funcionarán si el origen y el destino están en el mismo volumen",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, los archivos bloqueados impiden renombrar los archivos que están siendo sembrados. Puedes deshabilitar temporalmente la siembra y usar la función de renombrado de Readarr como alternativa.",
|
||||
"CreateEmptyAuthorFoldersHelpText": "Crear carpetas de películas que faltan durante la exploración del disco",
|
||||
"CreateGroup": "Crear grupo",
|
||||
"CutoffHelpText": "Una vez que se alcanze esta calidad, Radarr no descargará películas",
|
||||
"CutoffUnmet": "Umbrales no alcanzados",
|
||||
"CutoffHelpText": "Una vez que se alcance esta calidad, Readarr dejará de descargar libros",
|
||||
"CutoffUnmet": "Límite no alcanzado",
|
||||
"DatabaseMigration": "Migración de la base de datos",
|
||||
"Dates": "Fechas",
|
||||
"DelayProfile": "Perfil de retardo",
|
||||
@@ -82,15 +80,15 @@
|
||||
"DeleteImportListExclusion": "Eliminar exclusión de listas de importación",
|
||||
"DeleteImportListExclusionMessageText": "¿Está seguro de que desea eliminar esta exclusión de la lista de importación?",
|
||||
"DeleteImportListMessageText": "Seguro que quieres eliminar la lista '{name}'?",
|
||||
"DeleteIndexer": "Borrar Indexer",
|
||||
"DeleteIndexerMessageText": "Seguro que quieres eliminar el indexer '{name}'?",
|
||||
"DeleteIndexer": "Borrar indexador",
|
||||
"DeleteIndexerMessageText": "¿Estás seguro que quieres eliminar el indexador '{name}'?",
|
||||
"DeleteMetadataProfileMessageText": "¿Seguro que quieres eliminar el perfil de metadatos '{name}'?",
|
||||
"DeleteNotification": "Borrar Notificacion",
|
||||
"DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?",
|
||||
"DeleteQualityProfile": "Borrar perfil de calidad",
|
||||
"DeleteQualityProfileMessageText": "¿Seguro que quieres eliminar el perfil de calidad {name}?",
|
||||
"DeleteReleaseProfile": "Borrar perfil de estreno",
|
||||
"DeleteReleaseProfileMessageText": "Está seguro que quieres borrar este perfil de retraso?",
|
||||
"DeleteReleaseProfile": "Eliminar perfil de lanzamiento",
|
||||
"DeleteReleaseProfileMessageText": "¿Estás seguro que quieres eliminar este perfil de lanzamiento?",
|
||||
"DeleteSelectedBookFiles": "Borrar Archivos Seleccionados",
|
||||
"DeleteSelectedBookFilesMessageText": "Seguro que quieres eliminar el archivo de la película seleccionada?",
|
||||
"DeleteTag": "Eliminar Etiqueta",
|
||||
@@ -114,7 +112,7 @@
|
||||
"EnableAutomaticSearch": "Habilitar Búsqueda Automática",
|
||||
"EnableColorImpairedMode": "Habilitar Modo de dificultad con los colores",
|
||||
"EnableColorImpairedModeHelpText": "Estilo modificado para permitir que usuarios con problemas de color distingan mejor la información codificada por colores",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importar automáticamente las descargas completas del gestor de descargas",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importa automáticamente las descargas completas del gestor de descargas",
|
||||
"EnableHelpText": "Habilitar la creación de un fichero de metadatos para este tipo de metadato",
|
||||
"EnableInteractiveSearch": "Habilitar Búsqueda Interactiva",
|
||||
"EnableRSS": "Habilitar RSS",
|
||||
@@ -134,8 +132,8 @@
|
||||
"Fixed": "Arreglado",
|
||||
"Folder": "Carpeta",
|
||||
"Folders": "Carpetas",
|
||||
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Para más información individual de los gestores de descarga, haz clic en los botones de información.",
|
||||
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para más información individual sobre los indexers, haz clic en los botones de información.",
|
||||
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "Para más información en los clientes de descarga individuales, pulsa en los botones de información.",
|
||||
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "Para obtener más información sobre indexadores individuales, pulsa en los botones de información.",
|
||||
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "Para más información individual sobre las listas de importación, haz clic en los botones de información.",
|
||||
"GeneralSettings": "Opciones generales",
|
||||
"Global": "Global",
|
||||
@@ -143,17 +141,17 @@
|
||||
"Grab": "Capturar",
|
||||
"GrabID": "Capturar ID",
|
||||
"GrabRelease": "Capturar lanzamiento",
|
||||
"GrabReleaseMessageText": "Radarr no pudo determinar para qué película es este lanzamiento. Radarr no podrá importar este lanzamiento automáticamente. Quieres descargar {0}?",
|
||||
"GrabReleaseMessageText": "Readarr no pudo determinar para qué autor y libro era este lanzamiento. Readarr tal vez no pueda importar automáticamente este lanzamiento . ¿Quieres capturar '{0}'?",
|
||||
"GrabSelected": "Capturar seleccionado",
|
||||
"HasPendingChangesNoChanges": "Sin Cambios",
|
||||
"HasPendingChangesSaveChanges": "Guardar Cambios",
|
||||
"History": "Historial",
|
||||
"Host": "Host",
|
||||
"Hostname": "Nombre de host",
|
||||
"ICalFeed": "Feed de iCal",
|
||||
"ICalFeed": "Canal de iCal",
|
||||
"ICalHttpUrlHelpText": "Copia esta URL a tu gestor(es) o haz click en subscribir si tu navegador soporta webcal",
|
||||
"ICalLink": "Enlace de iCal",
|
||||
"IconForCutoffUnmet": "Icono para Umbrales no alcanzados",
|
||||
"IconForCutoffUnmet": "Icono de límite no alcanzado",
|
||||
"IconTooltip": "Programado",
|
||||
"IgnoredAddresses": "Ignorar direcciones",
|
||||
"IgnoredHelpText": "Este lanzamiento será rechazado si contiene uno ó más de estos términos (mayúsculas ó minúsculas)",
|
||||
@@ -165,18 +163,18 @@
|
||||
"ImportedTo": "Importar a",
|
||||
"Importing": "Importando",
|
||||
"IncludeHealthWarningsHelpText": "Incluir Alertas de Salud",
|
||||
"IncludeUnknownAuthorItemsHelpText": "Mostrar items sin ninguna película en la cola, esto incluye películas renombradas o cualquier otra cosa en la categoría de Radarr",
|
||||
"IncludeUnmonitored": "Incluir sin monitorizar",
|
||||
"IncludeUnknownAuthorItemsHelpText": "Mostrar elementos sin un autor en la cola. Esto podría incluir autores eliminados, libros o cualquier otra cosa en la categoría de Readarr",
|
||||
"IncludeUnmonitored": "Incluir no monitorizadas",
|
||||
"Indexer": "Indexador",
|
||||
"IndexerPriority": "Prioridad del indexador",
|
||||
"IndexerSettings": "Ajustes de Indexador",
|
||||
"IndexerSettings": "Opciones del indexador",
|
||||
"Indexers": "Indexadores",
|
||||
"Interval": "Intervalo",
|
||||
"IsCutoffCutoff": "Corte",
|
||||
"IsCutoffCutoff": "Límite",
|
||||
"IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Actualizar hasta que se alcance o supere esta calidad",
|
||||
"IsTagUsedCannotBeDeletedWhileInUse": "No se puede eliminar estando en uso",
|
||||
"Language": "Idioma",
|
||||
"LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de Radarr al arrancar la app.",
|
||||
"LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de Readarr al iniciar la aplicación.",
|
||||
"LoadingBookFilesFailed": "La carga de los archivos ha fallado",
|
||||
"Local": "Local",
|
||||
"LogFiles": "Archivos de Registro",
|
||||
@@ -190,7 +188,7 @@
|
||||
"MarkAsFailedMessageText": "Seguro que quieres marcar '{0}' como fallida?",
|
||||
"MaximumLimits": "Límites máximos",
|
||||
"MaximumSize": "Tamaño máximo",
|
||||
"MaximumSizeHelpText": "Tamaño máximo de un lanzamiento para ser importado en MB. Ajustar a cero para ilimitado",
|
||||
"MaximumSizeHelpText": "Tamaño máximo para que un lanzamiento sea capturado en MB. Establecer a cero para establecerlo a ilimitado.",
|
||||
"Mechanism": "Mecanismo",
|
||||
"MediaInfo": "Información de medios",
|
||||
"MediaManagementSettings": "Opciones de gestión de medios",
|
||||
@@ -211,7 +209,7 @@
|
||||
"NamingSettings": "Opciones de nombrado",
|
||||
"New": "Nuevo",
|
||||
"NoBackupsAreAvailable": "No hay copias de seguridad disponibles",
|
||||
"NoHistory": "Sin historia",
|
||||
"NoHistory": "Sin historial.",
|
||||
"NoLeaveIt": "No, déjalo",
|
||||
"NoLimitForAnyRuntime": "No hay límites para ningún tiempo de ejecución",
|
||||
"NoLogFiles": "No hay archivos de registro",
|
||||
@@ -257,8 +255,8 @@
|
||||
"RSSSync": "Sincronizar RSS",
|
||||
"RSSSyncInterval": "Intervalo de Sincronización de RSS",
|
||||
"ReadTheWikiForMoreInformation": "Lee la Wiki para más información",
|
||||
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Radarr soporta cualquier indexer que utilice el estandar Newznab, como también cualquiera de los indexers listados debajo.",
|
||||
"ReadarrTags": "Etiquetas de Radarr",
|
||||
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Readarr soporta cualquier indexador que utilice el estándar Newznab, así como los otros indexadores listados debajo.",
|
||||
"ReadarrTags": "Etiquetas de Readarr",
|
||||
"Real": "Real",
|
||||
"Reason": "Razón",
|
||||
"RecycleBinCleanupDaysHelpText": "Ajustar a 0 para desactivar la limpieza automática",
|
||||
@@ -286,19 +284,19 @@
|
||||
"RemoveTagExistingTag": "Etiqueta existente",
|
||||
"RemoveTagRemovingTag": "Eliminando etiqueta",
|
||||
"RemovedFromTaskQueue": "Eliminar de la cola de tareas",
|
||||
"RenameBooksHelpText": "Radarr usará el nombre del archivo si el renombrado está deshabilitado",
|
||||
"RenameBooksHelpText": "Readarr usará el nombre de archivo existente si el renombrado está deshabilitado",
|
||||
"Reorder": "Reordenar",
|
||||
"ReplaceIllegalCharacters": "Reemplazar caracteres ilegales",
|
||||
"RequiredHelpText": "El comunicado debe contener al menos uno de estos términos (no distingue entre mayúsculas y minúsculas)",
|
||||
"RequiredHelpText": "Esta condición {0} debe coincidir con el formato personalizado para aplicarse. De otro modo una simple coincidencia {0} es suficiente.",
|
||||
"RequiredPlaceHolder": "Añadir nueva restricción",
|
||||
"RescanAfterRefreshHelpTextWarning": "Radarr no detectará los cambios automáticamente en los ficheros si no se ajusta a 'Siempre'",
|
||||
"RescanAuthorFolderAfterRefresh": "Reescanear la Carpeta de Películas después de Actualizar",
|
||||
"RescanAfterRefreshHelpTextWarning": "Readarr no detectará automáticamente los cambios de archivos cuando no se establezca en 'Siempre'",
|
||||
"RescanAuthorFolderAfterRefresh": "Volver a escanear la carpeta de autor después de refrescar",
|
||||
"Reset": "Reiniciar",
|
||||
"ResetAPIKey": "Restablecer clave API",
|
||||
"ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?",
|
||||
"Restart": "Reiniciar",
|
||||
"RestartNow": "Reiniciar ahora",
|
||||
"RestartReadarr": "Reiniciar Radarr",
|
||||
"RestartReadarr": "Reiniciar Readarr",
|
||||
"Restore": "Restaurar",
|
||||
"RestoreBackup": "Restaurar copia de seguridad",
|
||||
"Result": "Resultado",
|
||||
@@ -315,7 +313,7 @@
|
||||
"ScriptPath": "Ruta del script",
|
||||
"Search": "Buscar",
|
||||
"SearchAll": "Buscar todo",
|
||||
"SearchForMissing": "Buscar perdidos",
|
||||
"SearchForMissing": "Buscar faltantes",
|
||||
"SearchSelected": "Buscar seleccionados",
|
||||
"Security": "Seguridad",
|
||||
"SendAnonymousUsageData": "Enviar datos de uso anónimos",
|
||||
@@ -324,7 +322,7 @@
|
||||
"SetPermissionsLinuxHelpTextWarning": "Si no estás seguro qué configuraciones hacer, no las cambies.",
|
||||
"Settings": "Ajustes",
|
||||
"ShortDateFormat": "Formato de fecha breve",
|
||||
"ShowCutoffUnmetIconHelpText": "Mostrar el icono para los ficheros cuando no se ha alcanzado el corte",
|
||||
"ShowCutoffUnmetIconHelpText": "Muestra un icono para archivos cuando el límite no haya sido alcanzado",
|
||||
"ShowMonitored": "Mostrar monitorizado",
|
||||
"ShowMonitoredHelpText": "Muestra el estado monitorizado bajo el póster",
|
||||
"ShowPath": "Mostrar ruta",
|
||||
@@ -338,14 +336,14 @@
|
||||
"ShownAboveEachColumnWhenWeekIsTheActiveView": "Mostrado sobre cada columna cuando la vista activa es semana",
|
||||
"Size": " Tamaño",
|
||||
"SkipFreeSpaceCheck": "Saltar comprobación de espacio libre",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Usar cuando Radarr no pueda detectar el espacio disponible en la carpeta de películas",
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "Se usa cuando Readarr no pueda detectar el espacio disponible en tu carpeta raíz de autores",
|
||||
"SorryThatAuthorCannotBeFound": "Lo siento, no he encontrado esa película.",
|
||||
"SorryThatBookCannotBeFound": "Lo siento, no he encontrado esa película.",
|
||||
"Source": "Fuente",
|
||||
"SourcePath": "Ruta de la fuente",
|
||||
"SslCertPasswordHelpText": "Contraseña para el archivo pfx",
|
||||
"SslCertPasswordHelpText": "Contraseña para archivo pfx",
|
||||
"SslCertPasswordHelpTextWarning": "Requiere reiniciar para que surta efecto",
|
||||
"SslCertPathHelpText": "Ruta al archivo pfx",
|
||||
"SslCertPathHelpText": "Ruta del archivo pfx",
|
||||
"StandardBookFormat": "Formato de Película Estándar",
|
||||
"StartTypingOrSelectAPathBelow": "Comienza a escribir o selecciona una ruta debajo",
|
||||
"StartupDirectory": "Directorio de Arranque",
|
||||
@@ -354,9 +352,9 @@
|
||||
"Style": "Estilo",
|
||||
"SuccessMyWorkIsDoneNoFilesToRename": "Éxito! Mi trabajo está hecho, no hay archivos pendientes de renombrar.",
|
||||
"SuccessMyWorkIsDoneNoFilesToRetag": "Éxito! Mi trabajo está hecho, no hay archivos pendientes de renombrar.",
|
||||
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS no son soportadas por este indexer",
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Buscar no está soportado por este indexer",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Se usará cuando las búsquedas automáticas se realicen desde el UI o por Radarr",
|
||||
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "No se soporta RSS con este indexador",
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "No se soporta la búsqueda con este indexador",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Se usará cuando las búsquedas automáticas se realicen desde la interfaz o por Readarr",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Se usará cuando se utilice la búsqueda interactiva",
|
||||
"TagIsNotUsedAndCanBeDeleted": "La etiqueta no se usa y puede ser borrada",
|
||||
"Tasks": "Tareas",
|
||||
@@ -364,7 +362,7 @@
|
||||
"TestAllClients": "Probar todos los clientes",
|
||||
"TestAllIndexers": "Probar todos los indexadores",
|
||||
"TestAllLists": "Probar todas las listas",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Se aplicará a todos los indexers, por favor sigue las reglas de los mismos",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Se aplicará a todos los indexadores, por favor sigue las reglas de los mismos",
|
||||
"TimeFormat": "Formato de hora",
|
||||
"Title": "Título",
|
||||
"TorrentDelay": "Retraso de torrent",
|
||||
@@ -372,13 +370,13 @@
|
||||
"Torrents": "Torrents",
|
||||
"TotalFileSize": "Tamaño total de archivo",
|
||||
"UILanguage": "Lenguaje de UI",
|
||||
"UILanguageHelpText": "Lenguaje que Radarr usara para el UI",
|
||||
"UILanguageHelpText": "Idioma que Readarr usará para la interfaz",
|
||||
"UILanguageHelpTextWarning": "Recargar el Navegador",
|
||||
"UISettings": "Ajustes del UI",
|
||||
"URLBase": "URL Base",
|
||||
"URLBase": "URL base",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "No se ha podido añadir un nuevo gestor de descargas, prueba otra vez.",
|
||||
"UnableToAddANewImportListExclusionPleaseTryAgain": "No se ha podido añadir una nueva lista de exclusión, prueba otra vez.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "No se ha podido añadir un nuevo indexer, prueba otra vez.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "No se pudo añadir un nuevo indexador, por favor inténtalo de nuevo.",
|
||||
"UnableToAddANewListPleaseTryAgain": "No se ha podido añadir una nueva lista, prueba otra vez.",
|
||||
"UnableToAddANewMetadataProfilePleaseTryAgain": "No se ha podido añadir un nuevo perfil de calidad, prueba otra vez.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "No se ha podido añadir una nueva notificación, prueba otra vez.",
|
||||
@@ -390,9 +388,9 @@
|
||||
"UnableToLoadDownloadClientOptions": "No se han podido cargar las opciones del gestor de descargas",
|
||||
"UnableToLoadDownloadClients": "No se puden cargar los gestores de descargas",
|
||||
"UnableToLoadGeneralSettings": "No se han podido cargar los ajustes Generales",
|
||||
"UnableToLoadHistory": "No se ha podido cargar la historia",
|
||||
"UnableToLoadHistory": "No se ha podido cargar el historial.",
|
||||
"UnableToLoadImportListExclusions": "No se pueden cargas las Excluidas de la Lista",
|
||||
"UnableToLoadIndexerOptions": "No se han podido cargar las opciones del indexer",
|
||||
"UnableToLoadIndexerOptions": "No se pudo cargar las opciones del indexador",
|
||||
"UnableToLoadIndexers": "No se pueden cargar los indexadores",
|
||||
"UnableToLoadLists": "No se pueden cargar las Listas",
|
||||
"UnableToLoadMediaManagementSettings": "No se han podido cargar los ajustes de Manipulación multimedia",
|
||||
@@ -410,10 +408,10 @@
|
||||
"UnableToLoadUISettings": "No se han podido cargar los ajustes de UI",
|
||||
"Ungroup": "Sin agrupar",
|
||||
"Unmonitored": "Sin monitorizar",
|
||||
"UnmonitoredHelpText": "Incluir las peliculas no monitoreadas en el feed de iCal",
|
||||
"UnmonitoredHelpText": "Incluir los libros sin monitorizar en el canal de iCal",
|
||||
"UpdateAll": "Actualizar Todo",
|
||||
"UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones",
|
||||
"UpdateMechanismHelpText": "Usar el actualizador de Radarr o un script",
|
||||
"UpdateAutomaticallyHelpText": "Descarga e instala actualizaciones automáticamente. Podrás seguir instalándolas desde Sistema: Actualizaciones",
|
||||
"UpdateMechanismHelpText": "Usar el actualizador integrado de Readarr o un script",
|
||||
"UpdateScriptPathHelpText": "Ruta a un script personalizado que toma un paquete de actualización extraído y gestiona el resto del proceso de actualización",
|
||||
"Updates": "Actualizaciones",
|
||||
"UpgradeAllowedHelpText": "Si está desactivado las calidades no serán actualizadas",
|
||||
@@ -425,7 +423,7 @@
|
||||
"UsenetDelay": "Retraso de usenet",
|
||||
"UsenetDelayHelpText": "Retraso en minutos a esperar antes de capturar un lanzamiento desde usenet",
|
||||
"Username": "Usuario",
|
||||
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Qué rama usar para actualizar Radarr",
|
||||
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Rama a utilizar para actualizar Readarr",
|
||||
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Rama usada por el mecanismo de actualización externo",
|
||||
"Version": "Versión",
|
||||
"WeekColumnHeader": "Cabecera de columna de semana",
|
||||
@@ -434,7 +432,7 @@
|
||||
"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: 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",
|
||||
"ReplaceIllegalCharactersHelpText": "Reemplaza caracteres ilegales. Si está desactivado, en su lugar Readarr los eliminará",
|
||||
"Actions": "Acciones",
|
||||
"Today": "Hoy",
|
||||
"ReleaseTitle": "Título de lanzamiento",
|
||||
@@ -453,7 +451,7 @@
|
||||
"Time": "Tiempo",
|
||||
"UnableToLoadBlocklist": "No se han podido cargar las bloqueadas",
|
||||
"Level": "Nivel",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de Radarr, no recibirás actualizaciones",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "La rama {0} no es una rama de lanzamiento de Readarr válida, no recibirás actualizaciones",
|
||||
"Blocklist": "Lista de bloqueos",
|
||||
"BlocklistRelease": "Lista de bloqueos de lanzamiento",
|
||||
"CreateEmptyAuthorFolders": "Crear carpetas de películas vacías",
|
||||
@@ -464,7 +462,7 @@
|
||||
"RescanAfterRefreshHelpText": "Reescanear la carpeta de películas después de actualizar la película",
|
||||
"ShowUnknownAuthorItems": "Mostrar Elementos Desconocidos",
|
||||
"UnselectAll": "Desmarcar todo",
|
||||
"UpdateSelected": "Actualizar Seleccionadas",
|
||||
"UpdateSelected": "Actualizar seleccionados",
|
||||
"Wanted": "Buscado",
|
||||
"AllAuthorBooks": "Todos los libros del autor",
|
||||
"AllExpandedCollapseAll": "Cerrar todo",
|
||||
@@ -508,16 +506,16 @@
|
||||
"MetadataProfile": "perfil de metadatos",
|
||||
"MetadataProfiles": "perfil de metadatos",
|
||||
"Publisher": "Editor",
|
||||
"ReadarrSupportsAnyDownloadClient": "Radarr es compatible con muchos clientes de descarga de Torrent y Usenet populares.",
|
||||
"ReadarrSupportsAnyDownloadClient": "Readarr soporta muchos clientes populares de descarga torrent y usenet.",
|
||||
"RootFolderCheckMultipleMessage": "Varias carpetas de origen no existen: {0}",
|
||||
"Save": "Guardar",
|
||||
"Series": "Series",
|
||||
"SettingsRemotePathMappingLocalPath": "Ruta Local",
|
||||
"SettingsRemotePathMappingLocalPathHelpText": "La ruta que Radarr tiene que usar para acceder a la ruta remota localmente",
|
||||
"SettingsRemotePathMappingLocalPathHelpText": "La ruta que Readarr debería usar para acceder localmente a la ruta remota",
|
||||
"SettingsRemotePathMappingRemotePath": "Ruta Remota",
|
||||
"SettingsRemotePathMappingRemotePathHelpText": "Ruta de origen al directorio al que accede el Gestor de Descargas",
|
||||
"TimeLeft": "Tiempo restante",
|
||||
"DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicarse con {0}.",
|
||||
"DownloadClientCheckUnableToCommunicateMessage": "No se pudo comunicar con {0}.",
|
||||
"IndexerPriorityHelpText": "Prioridad del Indexador de 1 (la más alta) a 50 (la más baja). Por defecto: 25. Usada para desempatar lanzamientos iguales cuando se capturan, Readarr seguirá usando todos los indexadores habilitados para Sincronización de RSS y Búsqueda.",
|
||||
"Monitor": "Monitorizar",
|
||||
"MountCheckMessage": "El punto de montaje que contiene la ruta de una película es de read-only: ",
|
||||
@@ -527,13 +525,13 @@
|
||||
"UpdateCheckStartupTranslocationMessage": "No se puede instalar la actualización porque la carpeta de arranque '{0}' está en una carpeta de \"App Translocation\".",
|
||||
"UpdateCheckUINotWritableMessage": "No se puede instalar la actualización porque la carpeta UI '{0}' no tiene permisos de escritura para el usuario '{1}'.",
|
||||
"Disabled": "Deshabilitado",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Clientes de descargas no disponibles debido a errores: {0}",
|
||||
"ImportMechanismHealthCheckMessage": "Activar Manipulación de Descargas Completadas",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}",
|
||||
"IndexerRssHealthCheckNoAvailableIndexers": "Todos los indexers capaces de RSS están temporalmente desactivados debido a errores recientes con el indexer",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "No hay Indexers con Búsqueda Interactiva activada, Readarr no obtendrá ningún resultado en las búsquedas",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {indexerNames}",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Ningún indexador está disponible debido a errores durante más de 6 horas",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Ningún indexador disponible debido a errores durante más de 6 horas: {0}",
|
||||
"IndexerRssHealthCheckNoAvailableIndexers": "Todos los indexadores con capacidad de RSS no están disponibles temporalmente debido a errores recientes con el indexador",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Ningún indexador disponible con búsqueda interactiva habilitada, Readarr no proporcionará ningún resultado de búsqueda interactivo",
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexadores no disponibles debido a errores: {0}",
|
||||
"OnBookFileDeleteForUpgrade": "En archivo de película Eliminar para actualizar",
|
||||
"OnBookFileDeleteForUpgradeHelpText": "En archivo de película Eliminar para actualizar",
|
||||
"OnBookFileDeleteHelpText": "Al eliminar archivo de película",
|
||||
@@ -546,10 +544,10 @@
|
||||
"Queued": "Encolado",
|
||||
"QueueIsEmpty": "La cola está vacía",
|
||||
"RefreshAndScan": "Actualizar y Escanear",
|
||||
"RestartReloadNote": "Nota: Radarr se reiniciará y recargará automáticamente la IU durante el proceso de restauración.",
|
||||
"RestartReloadNote": "Nota: Readarr se reiniciará automáticamente y recargará la interfaz durante el proceso de restauración.",
|
||||
"RootFolderCheckSingleMessage": "La carpeta de origen no existe: {0}",
|
||||
"SearchFiltered": "Buscar Filtradas",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Los clientes de descargas no están disponibles debido a errores",
|
||||
"FailedToLoadQueue": "No se pudo cargar la cola",
|
||||
"GeneralSettingsSummary": "Puerto, SSL, usuario/contraseña, proxy, analíticas y actualizaciones",
|
||||
"ProxyCheckResolveIpMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {0}",
|
||||
@@ -557,20 +555,20 @@
|
||||
"Connect": "Conectar",
|
||||
"ConnectSettingsSummary": "Notificaciones, conexiones a servidores/reproductores y scripts personalizados",
|
||||
"CouldntFindAnyResultsForTerm": "No se pudieron encontrar resultados para '{0}'",
|
||||
"DownloadClientCheckNoneAvailableMessage": "Ningún gestor de descargas disponible",
|
||||
"DownloadClientCheckNoneAvailableMessage": "Ningún cliente de descarga disponible",
|
||||
"General": "General",
|
||||
"IndexerRssHealthCheckNoIndexers": "No hay indexers disponibles con sincronización RSS activada, Radarr no capturará nuevos estrenos automáticamente",
|
||||
"IndexerSearchCheckNoAutomaticMessage": "No hay indexers con Búsqueda Automática disponibles, Radarr no dará ningún resultado de búsquedas automáticas",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Todos los indexers están temporalmente inactivos debido a errores recientes con ellos",
|
||||
"IndexerRssHealthCheckNoIndexers": "No hay indexadores disponibles con sincronización RSS habilitada, Readarr no capturará nuevos lanzamientos automáticamente",
|
||||
"IndexerSearchCheckNoAutomaticMessage": "No hay indexadores disponibles con búsqueda automática habilitada, Readarr no proporcionará ningún resultado de búsqueda automática",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "Todos los indexadores con capacidad de búsqueda no están disponibles temporalmente debido a errores recientes de indexador",
|
||||
"IndexerStatusCheckAllClientMessage": "Todos los indexadores no están disponibles debido a errores",
|
||||
"Label": "Etiqueta",
|
||||
"MissingFromDisk": "Radarr no pudo encontrar el archivo en el disco, por lo que el archivo fue desvinculado de la película en la base de datos",
|
||||
"RemotePathMappingCheckDownloadPermissions": "Radarr puede ver pero no acceder a la película descargada {0}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckFolderPermissions": "Radarr puede ver pero no acceder al directorio de descarga {0}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero Radarr no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.",
|
||||
"RemotePathMappingCheckGenericPermissions": "El cliente de descarga {0} coloca las descargas en {1} pero Radarr no puede ver este directorio. Es posible que tenga que ajustar los permisos de la carpeta.",
|
||||
"RemotePathMappingCheckImportFailed": "Radarr no pudo importar una película. Comprueba los detalles en tus registros.",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API",
|
||||
"MissingFromDisk": "Readarr no pudo encontrar el archivo en el disco, por lo que el archivo fue desvinculado del libro en la base de datos",
|
||||
"RemotePathMappingCheckDownloadPermissions": "Readarr puede ver pero no acceder al libro descargado {0}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckFolderPermissions": "Readarr puede ver pero no acceder al directorio de descarga {0}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckFilesGenericPermissions": "El cliente de descarga {0} informó de la existencia de archivos en {1} pero Readarr no puede ver este directorio. Puede que tengas que ajustar los permisos de la carpeta.",
|
||||
"RemotePathMappingCheckGenericPermissions": "El cliente de descarga {0} coloca las descargas en {1} pero Readarr no puede ver este directorio. Puede que tengas que ajustar los permisos de la carpeta.",
|
||||
"RemotePathMappingCheckImportFailed": "Readarr falló al importar un libro. Comprueba tus registros para más detalles.",
|
||||
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación que llamó a la API",
|
||||
"WriteTagsNo": "Nunca",
|
||||
"FileWasDeletedByUpgrade": "Se eliminó el archivo para importar una actualización",
|
||||
"IndexersSettingsSummary": "Indexadores y restricciones de lanzamiento",
|
||||
@@ -583,21 +581,21 @@
|
||||
"Database": "Base de datos",
|
||||
"ManualImportSelectEdition": "Importar Manualmente - Seleccionar Película",
|
||||
"ImportListExclusions": "Importar lista de exclusiones",
|
||||
"ChooseImportMethod": "Elegir Modo de Importación",
|
||||
"ClickToChangeReleaseGroup": "Clic para cambiar el grupo de lanzamiento",
|
||||
"ChooseImportMethod": "Elegir método de importación",
|
||||
"ClickToChangeReleaseGroup": "Pulsa para cambiar el grupo de lanzamiento",
|
||||
"HardlinkCopyFiles": "Enlace permanente/Copiar archivos",
|
||||
"MoveFiles": "Mover archivos",
|
||||
"OnApplicationUpdate": "Al actualizar la aplicación",
|
||||
"OnApplicationUpdateHelpText": "Al Actualizar La Aplicación",
|
||||
"BypassIfHighestQuality": "Pasar sí es la calidad más alta",
|
||||
"CustomFormatScore": "Puntuación de Formato personalizado",
|
||||
"BypassIfHighestQuality": "Ignorar si es la calidad más alta",
|
||||
"CustomFormatScore": "Puntuación de formato personalizado",
|
||||
"MinimumCustomFormatScore": "Puntuación mínima de formato personalizado",
|
||||
"Conditions": "Condiciones",
|
||||
"CopyToClipboard": "Copiar al portapapeles",
|
||||
"CustomFormat": "Formatos Personalizados",
|
||||
"CustomFormat": "Formato personalizado",
|
||||
"CustomFormats": "Formatos personalizados",
|
||||
"DeleteCustomFormat": "Eliminar Formato Personalizado",
|
||||
"DeleteFormatMessageText": "¿Está seguro de que desea eliminar la etiqueta de formato {0}?",
|
||||
"DeleteCustomFormat": "Eliminar formato personalizado",
|
||||
"DeleteFormatMessageText": "¿Estás seguro que quieres eliminar la etiqueta de formato '{0}'?",
|
||||
"Formats": "Formatos",
|
||||
"IncludeCustomFormatWhenRenamingHelpText": "Incluir en el formato de renombrado {Formatos Propios}",
|
||||
"MinFormatScoreHelpText": "Puntuación mínima del formato propio permitida para descargar",
|
||||
@@ -606,19 +604,19 @@
|
||||
"ResetDefinitions": "Restablecer definiciones",
|
||||
"UnableToLoadCustomFormats": "No se pueden cargar los Formatos Propios",
|
||||
"Theme": "Tema",
|
||||
"ThemeHelpText": "Cambiar el tema de la interfaz de la aplicación, el tema 'Auto' usará el tema de tu sistema para establecer el modo luminoso u oscuro. Inspirado por Theme.Park",
|
||||
"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 '{name}'?",
|
||||
"ThemeHelpText": "Cambia el tema de la interfaz de la aplicación, el tema 'Auto' usará el tema de tu sistema para establecer el modo luminoso u oscuro. Inspirado por Theme.Park",
|
||||
"CustomFormatSettings": "Ajustes de formato personalizado",
|
||||
"CutoffFormatScoreHelpText": "Una vez alcanzada la puntuación del formato personalizado Readarr dejará de capturar lanzamientos de libros",
|
||||
"DeleteCustomFormatMessageText": "¿Estás seguro que quieres eliminar el formato personalizado '{name}'?",
|
||||
"ExportCustomFormat": "Exportar formato personalizado",
|
||||
"ResetTitles": "Restablecer títulos",
|
||||
"UpgradesAllowed": "Actualizaciones permitidas",
|
||||
"EnableRssHelpText": "Se utilizará cuando Radarr busque periódicamente publicaciones a través de RSS Sync",
|
||||
"EnableRssHelpText": "Se utilizará cuando Readarr busque periódicamente lanzamientos a través de la sincronización RSS",
|
||||
"IndexerTagsHelpText": "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.",
|
||||
"ImportListMissingRoot": "Falta la capeta raíz para las listas: {0}",
|
||||
"ImportListMultipleMissingRoots": "Múltiples carpetas raíz faltan para las listas de importación: {0}",
|
||||
"IndexerDownloadClientHelpText": "Especifica qué cliente de descarga es usado para capturas desde este indexador",
|
||||
"HiddenClickToShow": "Oculto, click para mostrar",
|
||||
"HiddenClickToShow": "Oculto, pulsa para mostrar",
|
||||
"HideAdvanced": "Ocultar avanzado",
|
||||
"ShowAdvanced": "Mostrar avanzado",
|
||||
"ShownClickToHide": "Mostrado, haz clic para ocultar",
|
||||
@@ -627,7 +625,7 @@
|
||||
"ReplaceWithSpaceDashSpace": "Reemplazar por espacio en la barra espaciadora",
|
||||
"DeleteRemotePathMapping": "Borrar mapeo de ruta remota",
|
||||
"BlocklistReleases": "Lista de bloqueos de lanzamientos",
|
||||
"DeleteConditionMessageText": "Seguro que quieres eliminar la etiqueta '{0}'?",
|
||||
"DeleteConditionMessageText": "¿Estás seguro que quieres eliminar la condición '{name}'?",
|
||||
"Negated": "Anulado",
|
||||
"RemoveSelectedItem": "Eliminar elemento seleccionado",
|
||||
"RemoveSelectedItemBlocklistMessageText": "¿Está seguro de que desea eliminar los elementos seleccionados de la lista negra?",
|
||||
@@ -637,14 +635,14 @@
|
||||
"Required": "Solicitado",
|
||||
"ResetQualityDefinitions": "Restablecer definiciones de calidad",
|
||||
"ResetQualityDefinitionsMessageText": "¿Estás seguro que quieres restablecer las definiciones de calidad?",
|
||||
"BlocklistReleaseHelpText": "Evita que Radarr vuelva a capturar esta película automáticamente",
|
||||
"BlocklistReleaseHelpText": "Evita que Readarr vuelva a capturar automáticamente estos archivos de nuevo",
|
||||
"NoEventsFound": "Ningún evento encontrado",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Cómo añadir etiquetas a las películas seleccionadas",
|
||||
"DeleteSelectedIndexersMessageText": "¿Está seguro de querer eliminar {count} indexador(es) seleccionado(s)?",
|
||||
"DeleteSelectedIndexersMessageText": "¿Estás seguro que quieres eliminar {count} indexador(es) seleccionado(s)?",
|
||||
"Yes": "Sí",
|
||||
"RedownloadFailed": "La descarga ha fallado",
|
||||
"RemoveCompleted": "Eliminar completado",
|
||||
"RemoveDownloadsAlert": "Las opciones de Eliminar fueron movidas a las opciones del cliente de descarga individual en la table anterior.",
|
||||
"RemoveDownloadsAlert": "Las opciones de eliminación fueron trasladadas a las opciones del cliente de descarga individual en la tabla anterior.",
|
||||
"RemoveFailed": "Fallo al eliminar",
|
||||
"ApplyTagsHelpTextAdd": "Añadir: Añade las etiquetas a la lista de etiquetas existente",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Cómo añadir etiquetas a los clientes de descargas seleccionados",
|
||||
@@ -652,11 +650,11 @@
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Cómo aplicar etiquetas a los indexadores seleccionados",
|
||||
"ApplyTagsHelpTextRemove": "Eliminar: Elimina las etiquetas introducidas",
|
||||
"ApplyTagsHelpTextReplace": "Reemplazar: Sustituye las etiquetas por las introducidas (introduce \"no tags\" para borrar todas las etiquetas)",
|
||||
"DeleteSelectedDownloadClients": "Borrar Cliente de Descarga(s)",
|
||||
"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(s)",
|
||||
"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.",
|
||||
"DeleteSelectedDownloadClients": "Borrar cliente(s) de descarga",
|
||||
"DeleteSelectedDownloadClientsMessageText": "¿Estás seguro que quieres eliminar {count} cliente(s) de descarga seleccionado(s)?",
|
||||
"DeleteSelectedImportListsMessageText": "¿Estás seguro que quieres eliminar {count} lista(s) de importación seleccionada(s)?",
|
||||
"DeleteSelectedIndexers": "Borrar indexador(es)",
|
||||
"DownloadClientTagHelpText": "Utiliza solo este cliente de descarga para autores con al menos una etiqueta coincidente. Déjalo en blanco para utilizarlo con todos los autores.",
|
||||
"ExistingTag": "Etiquetas existentes",
|
||||
"No": "No",
|
||||
"NoChange": "Sin cambio",
|
||||
@@ -672,9 +670,9 @@
|
||||
"Clone": "Clonar",
|
||||
"CloneCondition": "Clonar Condición",
|
||||
"ApplyChanges": "Aplicar Cambios",
|
||||
"CountDownloadClientsSelected": "{0} cliente(s) de descarga seleccionado(s)",
|
||||
"CountImportListsSelected": "{0} lista(s) de importación seleccionada(s)",
|
||||
"CountIndexersSelected": "{0} indexador(es) seleccionado(s)",
|
||||
"CountDownloadClientsSelected": "{selectedCount} cliente(s) de descarga seleccionado(s)",
|
||||
"CountImportListsSelected": "{selectedCount} lista(s) de importación seleccionada(s)",
|
||||
"CountIndexersSelected": "{selectedCount} indexador(es) seleccionado(s)",
|
||||
"DeleteCondition": "Eliminar Condición",
|
||||
"DeleteSelectedImportLists": "Eliminar Lista(s) de Importación",
|
||||
"EditSelectedDownloadClients": "Editar Clientes de Descarga Seleccionados",
|
||||
@@ -685,8 +683,8 @@
|
||||
"ListWillRefreshEveryInterp": "La lista será refrescada cada {0}",
|
||||
"Activity": "Actividad",
|
||||
"Location": "Ubicación",
|
||||
"Ui": "UI",
|
||||
"AddNew": "Añadir Nuevo",
|
||||
"Ui": "Interfaz",
|
||||
"AddNew": "Añadir nuevo",
|
||||
"Backup": "Copia de seguridad",
|
||||
"ManageClients": "Gestionar Clientes",
|
||||
"ManageDownloadClients": "Gestionar Clientes de Descarga",
|
||||
@@ -696,12 +694,12 @@
|
||||
"TotalSpace": "Espacio Total",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.",
|
||||
"ManageImportLists": "Gestionar Listas de Importación",
|
||||
"ConnectionLostToBackend": "{appName} 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 tendrá que ser recargado para restaurar su funcionalidad.",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "Listas no disponibles debido a errores: {0}",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a fallos",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "Las notificaciones no están disponibles debido a errores",
|
||||
"ReleaseProfiles": "Perfiles de lanzamiento",
|
||||
"Small": "Pequeño",
|
||||
"DeleteImportList": "Eliminar Lista(s) de Importación",
|
||||
"DeleteImportList": "Eliminar lista de importación",
|
||||
"Large": "Grande",
|
||||
"Library": "Biblioteca",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "Algunos resultados están ocultos por el filtro aplicado",
|
||||
@@ -710,16 +708,16 @@
|
||||
"LastExecution": "Última Ejecución",
|
||||
"LastWriteTime": "Última Fecha de Escritura",
|
||||
"ConnectionLost": "Conexión perdida",
|
||||
"ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puede hacer clic en recargar abajo.",
|
||||
"ConnectionLostReconnect": "{appName} intentará conectarse automáticamente, o puedes pulsar en recargar abajo.",
|
||||
"NextExecution": "Siguiente ejecución",
|
||||
"NoResultsFound": "Ningún resultado encontrado",
|
||||
"RecentChanges": "Cambios recientes",
|
||||
"WhatsNew": "Que es lo nuevo?",
|
||||
"WhatsNew": "¿Qué hay nuevo?",
|
||||
"Loading": "Cargando",
|
||||
"Events": "Eventos",
|
||||
"Medium": "Mediano",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Todos los resultados están ocultos por el filtro aplicado",
|
||||
"CatalogNumber": "número de catálogo",
|
||||
"CatalogNumber": "Número de catálogo",
|
||||
"Authors": "Autores",
|
||||
"AuthorEditor": "Editor de Autor",
|
||||
"Author": "Autor",
|
||||
@@ -744,33 +742,33 @@
|
||||
"Book": "Libro",
|
||||
"AutomaticallySwitchEdition": "Cambiar edición automáticamente",
|
||||
"BookNaming": "Nombrado de libros",
|
||||
"Books": "Libro",
|
||||
"Books": "Libros",
|
||||
"NoHistoryBlocklist": "Sin historial de la lista de bloqueos",
|
||||
"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",
|
||||
"BypassIfAboveCustomFormatScore": "Ignorar 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",
|
||||
"CloneIndexer": "Clonar indexador",
|
||||
"CompletedDownloadHandling": "Manipulación de descargas completas",
|
||||
"EnableProfile": "Habilitar perfil",
|
||||
"ListsSettingsSummary": "lista de importación",
|
||||
"ExtraFileExtensionsHelpText": "Lista de archivos adicionales separados por coma para importar (.nfo será importado como .nfo-orig)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "Ejemplos: '.sub, .nfo' o 'sub,nfo'",
|
||||
"ImportLists": "Importar listas",
|
||||
"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.",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "El cliente de descarga {downloadClientName} está configurado para eliminar las descargas completadas. Esto puede causar que las descargas sean eliminadas de tu cliente antes de que {1} pueda importarlas.",
|
||||
"Continuing": "Continua",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido",
|
||||
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
|
||||
"NoCutoffUnmetItems": "Sin objetos sin condiciones de corte incumplidas",
|
||||
"NoCutoffUnmetItems": "Ningún elemento con límite no alcanzado",
|
||||
"StatusEndedContinuing": "Continua",
|
||||
"ChownGroup": "Cambiar grupo propietario",
|
||||
"ChownGroup": "chown del grupo",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)",
|
||||
"CustomFormatsSpecificationRegularExpression": "Expresión regular",
|
||||
"ErrorLoadingContent": "Hubo un error cargando este contenido",
|
||||
@@ -803,19 +801,19 @@
|
||||
"NoImportListsFound": "Ninguna lista de importación encontrada",
|
||||
"Monitoring": "Monitorizando",
|
||||
"NoMissingItems": "No hay elementos faltantes",
|
||||
"DefaultMetadataProfileIdHelpText": "Perfil de metadatos predeterminado para los artistas detectados en esta carpeta",
|
||||
"MetadataProfileIdHelpText": "Los elementos de la lista del Perfil de Calidad se añadirán con",
|
||||
"DefaultQualityProfileIdHelpText": "Perfil de calidad predeterminado para los artistas detectados en esta carpeta",
|
||||
"ContinuingAllBooksDownloaded": "Continúa (Todas las pistas descargadas)",
|
||||
"DataListMonitorAll": "Supervisar los artistas y todos los álbumes de cada artista incluido en la lista de importación",
|
||||
"DefaultMetadataProfileIdHelpText": "Perfil de metadatos predeterminado para los autores detectados en esta carpeta",
|
||||
"MetadataProfileIdHelpText": "Los elementos de la lista del perfil de metadatos que deberían ser añadidos",
|
||||
"DefaultQualityProfileIdHelpText": "Perfil de calidad predeterminado para los autores detectados en esta carpeta",
|
||||
"ContinuingAllBooksDownloaded": "Continúa (Todos los libros descargados)",
|
||||
"DataListMonitorAll": "Monitoriza los autores y todos los álbumes de cada artista incluido en la lista de importación",
|
||||
"MetadataSettingsSummary": "Crea archivos de metadatos cuando los episodios son importados o las series son refrescadas",
|
||||
"MonitoredAuthorIsUnmonitored": "El artista no está vigilado",
|
||||
"SearchForAllCutoffUnmetBooks": "Buscar todos los episodios en Umbrales no alcanzados",
|
||||
"ConsoleLogLevel": "Nivel de Registro de la Consola",
|
||||
"DataMissingBooks": "Monitoriza episodios que no tienen archivos o que no se han emitido aún",
|
||||
"SearchForAllCutoffUnmetBooks": "Buscar todos los libros con límites no alcanzados",
|
||||
"ConsoleLogLevel": "Nivel de registro de consola",
|
||||
"DataMissingBooks": "Monitoriza libros que no tienen archivos o que no se han lanzado aún",
|
||||
"EnabledHelpText": "Señalar para habilitar el perfil de lanzamiento",
|
||||
"FilterAnalyticsEvents": "Filtrar Eventos Analíticos",
|
||||
"FilterSentryEventsHelpText": "Filtrar eventos de error de usuario conocidos para que no se envíen como Análisis",
|
||||
"FilterAnalyticsEvents": "Filtrar eventos analíticos",
|
||||
"FilterSentryEventsHelpText": "Filtrar eventos de error de usuario conocidos para que no se envíen como Analíticas",
|
||||
"RootFolderPathHelpText": "Los elementos de la lista de carpetas raíz se añadirán a",
|
||||
"StatusEndedDeceased": "Fallecido",
|
||||
"LogRotateHelpText": "Número máximo de archivos de registro que se guardan en la carpeta de registros",
|
||||
@@ -823,16 +821,16 @@
|
||||
"QualityProfileIdHelpText": "Los elementos de la lista del Perfil de Calidad se añadirán con",
|
||||
"SelectDropdown": "Seleccionar...",
|
||||
"CollapseMultipleBooksHelpText": "Colapsar varios álbumes que salen el mismo día",
|
||||
"ContinuingNoAdditionalBooksAreExpected": "No se esperan álbumes adicionales",
|
||||
"DefaultMonitorOptionHelpText": "Qué álbumes se deben supervisar en la adición inicial para los artistas detectados en esta carpeta",
|
||||
"CustomFilter": "Filtros personalizados",
|
||||
"ContinuingNoAdditionalBooksAreExpected": "No se esperan libros adicionales",
|
||||
"DefaultMonitorOptionHelpText": "Qué libros deberían ser monitorizados en la adición inicial para los autores detectados en esta carpeta",
|
||||
"CustomFilter": "Filtro personalizado",
|
||||
"LabelIsRequired": "Se requiere etiqueta",
|
||||
"RemoveQueueItemConfirmation": "¿Estás seguro que quieres eliminar '{sourceTitle}' de la cola?",
|
||||
"SelectQuality": "Seleccionar calidad",
|
||||
"SelectReleaseGroup": "Seleccionar grupo de lanzamiento",
|
||||
"ThereWasAnErrorLoadingThisItem": "Hubo un error cargando este elemento",
|
||||
"ThereWasAnErrorLoadingThisPage": "Hubo un error cargando esta página",
|
||||
"SourceTitle": "Título de la fuente",
|
||||
"SourceTitle": "Título de origen",
|
||||
"ShowBanners": "Mostrar banners",
|
||||
"SearchMonitored": "Buscar monitorizados",
|
||||
"Other": "Otro",
|
||||
@@ -845,5 +843,263 @@
|
||||
"RemoveMultipleFromDownloadClientHint": "Elimina descargas y archivos del cliente de descarga",
|
||||
"RemoveQueueItem": "Eliminar - {sourceTitle}",
|
||||
"RemoveQueueItemRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará la descarga y el archivo(s) del cliente de descarga.",
|
||||
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará las descargas y los archivos del cliente de descarga."
|
||||
"RemoveQueueItemsRemovalMethodHelpTextWarning": "'Eliminar del cliente de descarga' eliminará las descargas y los archivos del cliente de descarga.",
|
||||
"EndedAllBooksDownloaded": "FInalizado (Todos los libros descargados)",
|
||||
"ClickToChangeIndexerFlags": "Pulsa para cambiar los indicadores del indexador",
|
||||
"CustomFormatsSpecificationFlag": "Indicador",
|
||||
"IndexerFlags": "Indicadores del indexador",
|
||||
"NotificationsSettingsUpdateMapPathsFrom": "Mapear rutas desde",
|
||||
"NotificationsSettingsUpdateMapPathsFromHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')",
|
||||
"NotificationsSettingsUpdateMapPathsTo": "Mapear rutas a",
|
||||
"NotificationsSettingsUpdateMapPathsToHelpText": "Ruta de {appName}, usado para modificar rutas de series cuando {serviceName} ve la ubicación de ruta de biblioteca de forma distinta a {appName} (Requiere 'Actualizar biblioteca')",
|
||||
"NotificationsSettingsUseSslHelpText": "Conectar a {serviceName} sobre HTTPS en vez de HTTP",
|
||||
"Rejections": "Rechazados",
|
||||
"SelectIndexerFlags": "Seleccionar indicadores del indexador",
|
||||
"RecycleBinUnableToWriteHealthCheck": "No se pudo escribir en la carpeta configurada de la papelera de reciclaje: {path}. Asegúrate de que esta ruta existe y es modificable por el usuario que ejecuta {appName}",
|
||||
"SearchForAllMissingBooks": "Buscar todos los episodios perdidos",
|
||||
"IndexerIdHelpText": "Especifica a qué indexador se aplica el perfil",
|
||||
"ProfilesSettingsSummary": "Perfiles de calidad, de retraso de idioma y de lanzamiento",
|
||||
"DataExistingBooks": "Monitoriza libros que no tienen archivos o que no se han lanzado aún",
|
||||
"MonitoredAuthorIsMonitored": "El artista no está vigilado",
|
||||
"RemotePathMappingsInfo": "Los mapeos de ruta remota son muy raramente solicitados, si {appName} y tu cliente de descarga están en el mismo sistema es mejor coincidir sus rutas. Para más información consulta la [wiki]({wikiLink}).",
|
||||
"ShowBannersHelpText": "Muestra carteles en lugar de nombres",
|
||||
"DefaultTagsHelpText": "Etiquetas predeterminadas de Readarr para los autores detectados en esta carpeta",
|
||||
"UseSSL": "Usar SSL",
|
||||
"SetIndexerFlags": "Establecer indicadores del indexador",
|
||||
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Autenticar con Plex.tv",
|
||||
"NotificationsSettingsUpdateLibrary": "Actualizar biblioteca",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Añade un prefijo a la url {connectionName}, como {url}",
|
||||
"DownloadClientDelugeSettingsDirectory": "Directorio de descarga",
|
||||
"DownloadClientDelugeSettingsDirectoryCompleted": "Directorio al que mover cuando se complete",
|
||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Ubicación opcional a la que mover las descargas completadas, dejar en blanco para usar la ubicación predeterminada de Deluge",
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación predeterminada de Deluge",
|
||||
"InteractiveSearchModalHeader": "Búsqueda interactiva",
|
||||
"NotificationsPlexSettingsAuthToken": "Token de autenticación",
|
||||
"CustomFormatsSettingsTriggerInfo": "Un formato personalizado será aplicado al lanzamiento o archivo cuando coincida con al menos uno de los diferentes tipos de condición elegidos.",
|
||||
"ShouldSearchHelpText": "Buscar indexadores para elementos añadido recientemente. Usar con precaución en listas largas.",
|
||||
"ShowTitleHelpText": "Mostrar nombre de autor debajo del póster",
|
||||
"SkipBooksWithNoISBNOrASIN": "Saltar libros sin ISBN o ASIN",
|
||||
"UnableToLoadMetadataProviderSettings": "No se pudo cargar las opciones del proveedor de metadatos",
|
||||
"LoadingEditionsFailed": "La carga de ediciones falló",
|
||||
"MetadataSourceHelpText": "Fuente de metadatos alternativa (Dejar en blanco para el valor predeterminado)",
|
||||
"MinPagesHelpText": "Ignorar libros con menos páginas que estas",
|
||||
"MonitorNewBooks": "Monitorizar nuevos libros",
|
||||
"MonitorNewItems": "Monitorizar nuevos libros",
|
||||
"NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún. Añade etiquetas a enlaces de autores con perfiles de retraso, restricciones o notificaciones. Pulsa en {0} para descubrir más acerca de las etiquetas en Readarr.",
|
||||
"OnBookRetagHelpText": "En libro reetiquetado",
|
||||
"OnDownloadFailureHelpText": "En fallo de descarga",
|
||||
"PathHelpTextWarning": "Debe ser diferente al directorio donde tu cliente de descarga pone los archivos",
|
||||
"TrackNumber": "Número de pista",
|
||||
"WriteTagsSync": "Todos los archivos; mantener sincronizados con Goodreads",
|
||||
"LatestBook": "El último libro",
|
||||
"CollapseMultipleBooks": "Colapsar múltiples libros",
|
||||
"DataListMonitorNone": "No monitorizar autores o libros",
|
||||
"Iso639-3": "Códigos de idioma ISO 639-3, o 'nulo', separados por coma",
|
||||
"MinPopularityHelpText": "Popularidad es la media de valoraciones * número de votos",
|
||||
"DeleteSelected": "Eliminar seleccionados",
|
||||
"IsExpandedShowFileInfo": "Mostrar información de archivo",
|
||||
"MassBookSearchWarning": "¿Estás seguro que quieres llevar a cabo una búsqueda masiva para {0} libros?",
|
||||
"MonitorNewItemsHelpText": "Qué nuevos libros deberían ser monitorizados",
|
||||
"NewBooks": "Nuevos libros",
|
||||
"OnImportFailureHelpText": "En fallo de importación",
|
||||
"ShowBookCount": "Mostrar recuento de libros",
|
||||
"CalibreOutputFormat": "Formato de salida de Calibre",
|
||||
"CalibreUrlBase": "Url base de Calibre",
|
||||
"CalibreSettings": "Opciones de Calibre",
|
||||
"CalibreUsername": "Usuario de Calibre",
|
||||
"SearchForNewItems": "Buscar nuevos elementos",
|
||||
"SearchForMonitoredBooks": "Buscar libros monitorizados",
|
||||
"SeriesNumber": "Número de series",
|
||||
"ShouldMonitorHelpText": "Monitoriza nuevos autores y libros añadidos desde esta lista",
|
||||
"ShowLastBook": "Mostrar último libro",
|
||||
"UseSslHelpText": "Usa SSL para conectarse al servidor de contenido de Calibre",
|
||||
"Development": "Desarrollo",
|
||||
"DiscNumber": "Número de disco",
|
||||
"DownloadPropersAndRepacksHelpTexts2": "Usar 'No preferir' para ordenar por puntuación de palabra preferida sobre propers/repacks",
|
||||
"DiscCount": "Recuento de disco",
|
||||
"ImportListSettings": "Opciones generales de lista de importación",
|
||||
"DataFutureBooks": "Monitoriza libros que no hayan sido lanzados aún",
|
||||
"EditBook": "Editar libro",
|
||||
"EnableAutomaticAddHelpText": "Añadir autor/libros a Readarr cuando las sincronizaciones sean llevadas a cabo a través de la interfaz o por Readarr",
|
||||
"ExistingBooks": "Libros existentes",
|
||||
"FilesTotal": "Archivos ({0})",
|
||||
"IgnoreDeletedBooks": "Ignorar libros borrados",
|
||||
"MinimumPages": "Páginas mínimas",
|
||||
"SearchBook": "Buscar libro",
|
||||
"SeriesTotal": "Series ({0})",
|
||||
"MassBookSearch": "Búsqueda masiva de libros",
|
||||
"MinimumPopularity": "Popularidad mínima",
|
||||
"MonitorBook": "Monitorizar libro",
|
||||
"MusicBrainzRecordingID": "ID de grabación de MusicBrainz",
|
||||
"NETCore": ".NET Core",
|
||||
"WriteAudioTags": "Etiquetar archivos de audio con metadatos",
|
||||
"PastDays": "Días pasados",
|
||||
"WriteTagsAll": "Todos los archivos; solo importación inicial",
|
||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "Readarr soporta múltiples listas para importar libros y autores en la base de datos.",
|
||||
"ConvertToFormat": "Convertir a formato",
|
||||
"DataNone": "Ningún libro será monitorizado",
|
||||
"NameFirstLast": "Primer nombre, último nombre",
|
||||
"OnAuthorDelete": "En autor borrado",
|
||||
"WriteTagsNew": "Solo para nuevas descargas",
|
||||
"EmbedMetadataHelpText": "Decir a Calibre que escriba los metadatos en el archivo de libro actual",
|
||||
"FutureDaysHelpText": "Días para que el canal de iCal busque en el futuro",
|
||||
"ImportFailures": "Importar fallos",
|
||||
"LibraryHelpText": "Nombre de la biblioteca del servidor de contenido de Calibre. Dejar en blanco para el valor predeterminado.",
|
||||
"PreviewRetag": "Vista previa de reetiquetado",
|
||||
"FutureBooks": "Libros futuros",
|
||||
"ISBN": "ISBN",
|
||||
"IsCalibreLibraryHelpText": "Usar el servidor de contenido de Calibre para manipular bibliotecas",
|
||||
"DeleteBookFile": "Borrar archivo de libro",
|
||||
"EditList": "Editar lista",
|
||||
"HasMonitoredBooksNoMonitoredBooksForThisAuthor": "Libros no monitorizados para este autor",
|
||||
"IgnoredMetaHelpText": "Los libros serán ignorados si contienen uno o más de los siguientes términos (insensible a mayúsculas)",
|
||||
"IsExpandedHideBooks": "Esconder libros",
|
||||
"LogSQL": "Registro SQL",
|
||||
"MusicbrainzId": "ID de MusicBrainz",
|
||||
"OnBookTagUpdate": "En actualización de etiqueta de libro",
|
||||
"PasswordHelpText": "Contraseña del servidor de contenido de Calibre",
|
||||
"OnAuthorAddedHelpText": "En autor añadido",
|
||||
"ShouldMonitorExistingHelpText": "Monitoriza automáticamente libros en esta lista que ya están en Readarr",
|
||||
"UrlBaseHelpText": "Añade un prefijo a la url de Calibre, p. ej. http://[host]:[puerto]/[urlBase]",
|
||||
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} libros en total. {1} libros con archivos.",
|
||||
"UseCalibreContentServer": "Usar el servidor de contenido de Calibre",
|
||||
"ContinuingMoreBooksAreExpected": "Se esperan más libros",
|
||||
"DataAllBooks": "Monitorizar todos los libros",
|
||||
"IsInUseCantDeleteAMetadataProfileThatIsAttachedToAnAuthorOrImportList": "No se puede eliminar un perfil de metadatos que está enlazado a un autor o a una lista de importación",
|
||||
"MetadataConsumers": "Consumidores de metadatos",
|
||||
"MonitorExistingBooks": "Monitorizar libros existentes",
|
||||
"UpdateCovers": "Actualizar cubiertas",
|
||||
"UpdateCoversHelpText": "Establece las cubiertas de libros en Calibre para que coincidan en Readarr",
|
||||
"SkipRedownloadHelpText": "Evita que Readarr intente descargar lanzamientos alternativos para los elementos borrados",
|
||||
"EntityName": "Nombre de entidad",
|
||||
"CalibreLibrary": "Biblioteca de Calibre",
|
||||
"DeleteMetadataProfile": "Eliminar el perfil de metadatos",
|
||||
"PathHelpText": "Carpeta raíz que contiene tu biblitoteca de libros",
|
||||
"ForeignIdHelpText": "La ID de Musicbrainz del autor/libro a excluir",
|
||||
"HostHelpText": "Host del servidor de contenido de Calibre",
|
||||
"MetadataProviderSource": "Fuente del proveedor de metadatos",
|
||||
"MonitorAuthor": "Monitorizar autor",
|
||||
"MusicBrainzAuthorID": "ID de autor de MusicBrainz",
|
||||
"RefreshBook": "Refrescar libro",
|
||||
"RefreshInformation": "Refrescar información",
|
||||
"RenameBooks": "Renombrar libros",
|
||||
"EditAuthor": "Editar autor",
|
||||
"EditionsHelpText": "Cambiar edición para este libro",
|
||||
"ShouldMonitorExisting": "Monitorizar libros existentes",
|
||||
"EmbedMetadataInBookFiles": "Metadatos incrustados en archivos de libro",
|
||||
"ExistingTagsScrubbed": "Etiquetas existentes borradas",
|
||||
"GoToAuthorListing": "Ir al listado de autor",
|
||||
"MusicBrainzReleaseID": "ID de lanzamiento de MusicBrainz",
|
||||
"SpecificBook": "Libro específico",
|
||||
"BookTitle": "Título de libro",
|
||||
"CalibreContentServer": "Servidor de contenido de Calibre",
|
||||
"CalibreHost": "Host de Calibre",
|
||||
"BypassIfHighestQualityHelpText": "Evita el retardo cuando el lanzamiento tiene la calidad más alta habilitada en el perfil de calidad",
|
||||
"DeleteFilesHelpText": "Elimina los archivos del libro y carpeta del autor",
|
||||
"FutureDays": "Días futuros",
|
||||
"SearchBoxPlaceHolder": "P. ej. Guerra y Paz, goodreads:656, isbn:067003469X, asin: B00JCDK5ME",
|
||||
"MissingBooks": "Libros perdidos",
|
||||
"MissingBooksAuthorNotMonitored": "Libros perdidos (Autor no monitorizado)",
|
||||
"SendMetadataToCalibre": "Enviar metadatos a Calibre",
|
||||
"SkipSecondarySeriesBooks": "Saltar libros de series secundarias",
|
||||
"DataNewBooks": "Monitoriza libros nuevos lanzados después del libro más nuevo existente",
|
||||
"DataNewNone": "No monitorizar ningún libro nuevo",
|
||||
"WriteMetadataTags": "Escribir etiquetas de metadatos",
|
||||
"IndexerIdHelpTextWarning": "Usar un indexador específico con palabras preferidas puede provocar que se capturen lanzamientos duplicados",
|
||||
"IsInUseCantDeleteAQualityProfileThatIsAttachedToAnAuthorOrImportList": "No se puede eliminar un perfil de calidad que está enlazado a un autor o a una lista de importación",
|
||||
"NoName": "No mostrar nombre",
|
||||
"OnBookDelete": "En libro borrado",
|
||||
"PortHelpText": "Puerto del servidor de contenido de Calibre",
|
||||
"WriteAudioTagsScrub": "Limpiar las etiquetas existentes",
|
||||
"SetReadarrTags": "Establecer etiquetas de Readarr",
|
||||
"ForeignId": "ID foránea",
|
||||
"BooksTotal": "Libros ({0})",
|
||||
"CalibreMetadata": "Metadatos de Calibre",
|
||||
"CalibreNotCalibreWeb": "Readarr puede interconectarse con el servidor de contenido de Calibre. No puede usar Calibre web, que es software no relacionado.",
|
||||
"OnDownloadFailure": "En fallo de descarga",
|
||||
"SkipPartBooksAndSets": "Saltar partes y conjuntos de libros",
|
||||
"FilterAuthor": "Filtrar autor",
|
||||
"FilterPlaceHolder": "Filtrar libro",
|
||||
"ImportListSpecificSettings": "Opciones específicas de lista de importación",
|
||||
"ItsEasyToAddANewAuthorOrBookJustStartTypingTheNameOfTheItemYouWantToAdd": "Es fácil añadir un nuevo autor o libro empezando a escribir solo el nombre del elemento que quieras añadir",
|
||||
"ManualDownload": "Descarga manual",
|
||||
"MissingBooksAuthorMonitored": "Libros perdidos (Autor monitorizado)",
|
||||
"MonitoredHelpText": "Readarr buscará y descargará el libro",
|
||||
"MusicBrainzBookID": "ID de libro de MusicBrainz",
|
||||
"MusicBrainzTrackID": "ID de pista de MusicBrainz",
|
||||
"OnAuthorDeleteHelpText": "En autor borrado",
|
||||
"OnBookDeleteHelpText": "En libro borrado",
|
||||
"OnReleaseImport": "En importación de lanzamiento",
|
||||
"OnReleaseImportHelpText": "En importación de lanzamiento",
|
||||
"OnImportFailure": "En fallo de importación",
|
||||
"OutputFormatHelpText": "Pregunta opcionalmente a Calibre para que convierta a otros formatos al importar. Lista separada por coma.",
|
||||
"PastDaysHelpText": "Días para que el canal de iCal busque en el pasado",
|
||||
"ShowName": "Mostrar nombre",
|
||||
"SkipBooksWithMissingReleaseDate": "Saltar libros con fechas de lanzamientos faltantes",
|
||||
"TheFollowingFilesWillBeDeleted": "Los siguientes archivos serán eliminados:",
|
||||
"UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Actualizar se encuentra deshabilitado en un contenedor docker. Actualiza la imagen del contenedor en su lugar.",
|
||||
"WriteAudioTagsScrubHelp": "Borra las etiquetas existentes de los archivos, dejando solo aquellas añadidas por Readarr.",
|
||||
"ExistingItems": "Elementos existentes",
|
||||
"AuthorProgressBarText": "{availableBookCount} / {bookCount} (Total: {totalBookCount}, Archivos: {bookFileCount})",
|
||||
"BookProgressBarText": "{bookCount} / {totalBookCount} (Archivos: {bookFileCount})",
|
||||
"SelectBook": "Seleccionar libro",
|
||||
"FileDetails": "Detalles de archivo",
|
||||
"Bookshelf": "Estantería",
|
||||
"DataFirstBook": "Monitorizar el primer libro. El resto de libros serán ignorados",
|
||||
"DataListMonitorSpecificBook": "Monitoriza autores, pero solo monitoriza libros explícitamente incluidos en la lista",
|
||||
"TagsHelpText": "Se aplica a autores con al menos una etiqueta coincidente. Dejar en blanco para aplicar a todos los autores",
|
||||
"CalibreContentServerText": "Usar un servidor de contenido de Calibre (no Calibre web) permite a Readarr añadir libros a tu biblioteca de Calibre y disparar las conversiones entre formatos",
|
||||
"TooManyBooks": "¿Libros perdidos o demasiados de ellos? Modifica o crea uno nuevo",
|
||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "Si no añades una exclusión de lista de importación y el autor tiene un perfil de metadatos distinto de 'Ninguno', entonces este libro puede ser de nuevo añadido durante el siguiente refresco de autor.",
|
||||
"MonitoringOptionsHelpText": "Qué libros deberían ser monitorizados una vez el autor sea añadido (ajuste único)",
|
||||
"DataLatestBook": "Monitoriza el último libro y futuros libros",
|
||||
"DataNewAllBooks": "Monitorizar todos los libros nuevos",
|
||||
"DefaultReadarrTags": "Etiquetas predeterminadas de Readarr",
|
||||
"DeleteFormat": "Eliminar formato",
|
||||
"FirstBook": "Primer libro",
|
||||
"HideBooks": "Esconder libros",
|
||||
"IsExpandedHideFileInfo": "Esconder información de archivo",
|
||||
"IsExpandedShowBooks": "Mostrar libros",
|
||||
"LogSqlHelpText": "Registra todas las peticiones SQL de Readarr",
|
||||
"NameLastFirst": "Último nombre, primer nombre",
|
||||
"NameStyle": "Estilo de nombre de autor",
|
||||
"RefreshAuthor": "Refrescar autor",
|
||||
"SelectEdition": "Seleccionar edición",
|
||||
"SelectedCountAuthorsSelectedInterp": "{0} autor(es) seleccionado(s)",
|
||||
"TagsSettingsSummary": "Gestionar autor, perfil, restricción y etiquetas de notificación",
|
||||
"TheBooksFilesWillBeDeleted": "Los archivos del libro serán eliminados.",
|
||||
"TrackTitle": "Título de pista",
|
||||
"UsernameHelpText": "Usuario del servidor de contenido de Calibre",
|
||||
"WatchLibraryForChangesHelpText": "Vuelve a escanear automáticamente cuando los archivos cambien en una carpeta raíz",
|
||||
"WatchRootFoldersForFileChanges": "Supervisar las carpetas raíz para cambios de archivos",
|
||||
"WriteBookTagsHelpTextWarning": "Seleccionar 'Todos los archivos' alterará los archivos existentes cuando son importados.",
|
||||
"MonitorBookExistingOnlyWarning": "Esto es un ajuste único de la configuración monitorizada para cada libro. Utiliza la opción debajo de Autor/Editar para controlar lo que ocurre con los libros recién añadidos",
|
||||
"UnmappedFiles": "Archivos sin mapear",
|
||||
"CountAuthorsSelected": "{selectedCount} autor(es) seleccionados",
|
||||
"CalibreOutputProfile": "Perfil de salida de Calibre",
|
||||
"CalibrePassword": "Contraseña de Calibre",
|
||||
"CalibrePort": "Puerto de Calibre",
|
||||
"InteractiveSearchModalHeaderBookAuthor": "Búsqueda interactiva - {bookTitle} por {authorName}",
|
||||
"OnAuthorAdded": "En autor añadido",
|
||||
"IndexerSettingsSeedRatio": "Ratio de sembrado",
|
||||
"IndexerSettingsSeedRatioHelpText": "El ratio que un torrent debería alcanzar antes de parar, vacío usa el predeterminado del cliente de descarga. El ratio debería ser al menos 1.0 y seguir las reglas de los indexadores",
|
||||
"IndexerSettingsSeedTime": "Tiempo de sembrado",
|
||||
"IndexerSettingsSeedTimeHelpText": "El tiempo que un torrent debería ser sembrado antes de parar, vacío usa el predeterminado del cliente de descarga",
|
||||
"FailedLoadingSearchResults": "Error al cargar los resultados de la busqueda, prueba otra vez.",
|
||||
"WhySearchesCouldBeFailing": "Pulsa aquí para descubrir por qué las búsquedas podrían estar fallando",
|
||||
"ApiKey": "Clave API",
|
||||
"AuthenticationRequiredHelpText": "Cambia para qué solicitudes se requiere autenticación. No cambiar a menos que entiendas los riesgos.",
|
||||
"AuthForm": "Formularios (Página de inicio de sesión)",
|
||||
"AuthenticationRequiredWarning": "Para evitar el acceso remoto sin autenticación, {appName} ahora requiere que la autenticación sea habilitada. Opcionalmente puedes deshabilitar la autenticación desde direcciones locales.",
|
||||
"DisabledForLocalAddresses": "Deshabilitada para direcciones locales",
|
||||
"Enabled": "Habilitada",
|
||||
"PasswordConfirmation": "Confirmación de contraseña",
|
||||
"AuthBasic": "Básica (Ventana emergente del navegador)",
|
||||
"AuthenticationMethod": "Método de autenticación",
|
||||
"AuthenticationMethodHelpTextWarning": "Por favor selecciona un método de autenticación válido",
|
||||
"AuthenticationRequired": "Autenticación requerida",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirma la nueva contraseña",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Introduce una nueva contraseña",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Introduce un nuevo usuario",
|
||||
"External": "Externa"
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
"20MinutesTwenty": "20 minuuttia: {0}",
|
||||
"45MinutesFourtyFive": "45 minuuttia: {0}",
|
||||
"60MinutesSixty": "60 minuuttia: {0}",
|
||||
"APIKey": "Rajapinnan avain",
|
||||
"About": "Tietoja",
|
||||
"AddListExclusion": "Lisää listapoikkeus",
|
||||
"AddingTag": "Tunniste lisätään",
|
||||
@@ -50,7 +49,7 @@
|
||||
"ChownGroupHelpText": "Ryhmän nimi tai GID. Käytä GID:tä etätiedostojärjestelmille.",
|
||||
"ChownGroupHelpTextWarning": "Toimii vain, jos {appName}in suorittava käyttäjä on tiedoston omistaja. On parempi varmistaa, että lataustyökalu käyttää samaa ryhmää kuin {appName}.",
|
||||
"Clear": "Tyhjennä",
|
||||
"ClickToChangeQuality": "Vaihda laatua klikkaamalla",
|
||||
"ClickToChangeQuality": "Vaihda laatua painamalla tästä",
|
||||
"ClientPriority": "Lataustyökalun painotus",
|
||||
"CloneIndexer": "Monista tietolähde",
|
||||
"CloneProfile": "Monista profiili",
|
||||
@@ -163,7 +162,7 @@
|
||||
"ImportExtraFilesHelpText": "Tuo kirjatiedoston tuonnin yhteydessä sääntöjä vastaavat tiedostot, kuten tekstitykset, .nfo-tiedostot, yms.",
|
||||
"ImportFailedInterp": "Tuonti epäonnistui: {0}",
|
||||
"ImportedTo": "Tuontikohde",
|
||||
"Importing": "Tuonti",
|
||||
"Importing": "Tuodaan",
|
||||
"IncludeHealthWarningsHelpText": "Sisällytä kuntovaroitukset",
|
||||
"IncludeUnknownAuthorItemsHelpText": "Näytä jonossa kohteet, joille ei ole kirjailijaa. Tämä voi sisältää poistettuja kirjailijoita tai mitä tahansa muuta Readarrille luokiteltua.",
|
||||
"IncludeUnmonitored": "Sisällytä valvomattomat",
|
||||
@@ -204,7 +203,7 @@
|
||||
"MinimumLimits": "Vähimmäisrajoitukset",
|
||||
"Missing": "Puuttuu",
|
||||
"Mode": "Tila",
|
||||
"Monitored": "Valvotut",
|
||||
"Monitored": "Valvonta",
|
||||
"MoreInfo": "Lisätietoja",
|
||||
"MustContain": "Täytyy sisältää",
|
||||
"MustNotContain": "Ei voi sisältää",
|
||||
@@ -431,7 +430,6 @@
|
||||
"WeekColumnHeader": "Viikkosarakkeen otsikko",
|
||||
"Year": "Vuosi",
|
||||
"YesCancel": "Kyllä, peru",
|
||||
"ApiKeyHelpTextWarning": "Käyttöönotto vaatii {appName}in uudelleenkäynnistyksen.",
|
||||
"DeleteRootFolderMessageText": "Haluatko varmasti poistaa juurikansion \"{name}\"?",
|
||||
"LoadingBooksFailed": "Kirjojen lataus epäonnistui",
|
||||
"ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee täyttää vain tarvittaessa. Mikäli näitä ei ole, tulee kentät jättää tyhjiksi.",
|
||||
@@ -801,10 +799,10 @@
|
||||
"ImportListMultipleMissingRoots": "Useita tuontilistojen juurikansioita puuttuu: {0}",
|
||||
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu.",
|
||||
"IndexerTagsHelpText": "Tietolähdettä käytetään vain vähintään yhdellä täsmäävällä tunnisteella merkityille kirjailijoille. Käytä kaikille jättämällä tyhjäksi.",
|
||||
"HiddenClickToShow": "Piilotettu, näytä painalla",
|
||||
"HiddenClickToShow": "Piilotettu, näytä painamalla tästä",
|
||||
"HideAdvanced": "Piilota lisäasetukset",
|
||||
"ShowAdvanced": "Näytä lisäasetukset",
|
||||
"ShownClickToHide": "Näkyvissä, piilota painamalla",
|
||||
"ShownClickToHide": "Näytetään, piilota painamalla tästä",
|
||||
"ColonReplacement": "Kaksoispisteen korvaus",
|
||||
"ReplaceWithDash": "Korvaa yhdysmerkillä",
|
||||
"ReplaceWithSpaceDash": "Korvaa yhdistelmällä \"välilyönti yhdysmerkki\"",
|
||||
@@ -983,12 +981,53 @@
|
||||
"SelectQuality": "Valitse laatu",
|
||||
"BlocklistAndSearch": "Estolista ja haku",
|
||||
"IgnoreDownloads": "Ohita lataukset",
|
||||
"CustomFilter": "Omat suodattimet",
|
||||
"CustomFilter": "Oma suodatin",
|
||||
"DashOrSpaceDashDependingOnName": "Yhdysmerkki tai välilyönti nimen perusteella",
|
||||
"DoNotBlocklist": "Älä estä",
|
||||
"IgnoreDownload": "Ohita lataus",
|
||||
"RemoveQueueItem": "Poistetaan - {sourceTitle}",
|
||||
"RemoveQueueItemConfirmation": "Haluatko varmasti poistaa kohteen \"{sourceTitle}\" jonosta?",
|
||||
"SelectReleaseGroup": "Aseta julkaisuryhmä",
|
||||
"BlocklistOnly": "Vain esto"
|
||||
"BlocklistOnly": "Vain esto",
|
||||
"IndexerFlags": "Tietolähteen liput",
|
||||
"NotificationsSettingsUpdateMapPathsFrom": "Kohdista sijainnit lähteeseen",
|
||||
"NotificationsSettingsUpdateMapPathsFromHelpText": "{appName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).",
|
||||
"NotificationsSettingsUpdateMapPathsTo": "Kohdista sijainnit kohteeseen",
|
||||
"NotificationsSettingsUpdateMapPathsToHelpText": "{serviceName}-sijainti, jonka mukaisesti sarjasijainteja muutetaan kun {serviceName} näkee kirjastosijainnin eri tavalla kuin {appName} (vaatii \"Päivitä kirjasto\" -asetuksen).",
|
||||
"NotificationsSettingsUseSslHelpText": "Muodosta yhteys sovellukseen {serviceName} SSL-protokollan välityksellä.",
|
||||
"Rejections": "Hylkäykset",
|
||||
"NotificationsSettingsUpdateLibrary": "Päivitä kirjasto",
|
||||
"ConnectionSettingsUrlBaseHelpText": "Lisää etuliite lataustuökalun {clientName} URL-osoitteeseen, kuten {url}.",
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.",
|
||||
"InteractiveSearchModalHeader": "Manuaalihaku",
|
||||
"NotificationsPlexSettingsAuthToken": "Todennustunniste",
|
||||
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv-tunnistautuminen",
|
||||
"ClickToChangeIndexerFlags": "Vaihda tietolähteen lippuja painamalla tästä",
|
||||
"CustomFormatsSpecificationFlag": "Lippu",
|
||||
"SelectIndexerFlags": "Valitse tietolähteen liput",
|
||||
"SetIndexerFlags": "Aseta tietolähteen liput",
|
||||
"LabelIsRequired": "Nimi on pakollinen",
|
||||
"IndexerSettingsSeedRatio": "Jakosuhde",
|
||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Valinnainen latuasten tallennussijainti. Käytä Aria2-oletusta jättämällä tyhjäksi.",
|
||||
"IndexerSettingsSeedRatioHelpText": "Suhde, joka torrentin tulee saavuttaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi. Suhteen tulisi olla ainakin 1.0 ja noudattaa tietolähteen sääntöjä.",
|
||||
"IndexerSettingsSeedTime": "Jakoaika",
|
||||
"IndexerSettingsSeedTimeHelpText": "Aika, joka torrentia tulee jakaa ennen sen pysäytystä. Käytä lataustyökalun oletusta jättämällä tyhjäksi.",
|
||||
"FailedLoadingSearchResults": "Hakutulosten lataus epäonnistui. Yritä uudelleen.",
|
||||
"WhySearchesCouldBeFailing": "Selvitä miksi haku saattaa epäonnistua painamalla tästä",
|
||||
"ApiKey": "Rajapinnan avain",
|
||||
"AuthBasic": "Perus (ponnahdusikkuna)",
|
||||
"AuthForm": "Lomake (kirjautumissivu)",
|
||||
"AuthenticationMethod": "Tunnistautumistapa",
|
||||
"AuthenticationMethodHelpTextWarning": "Valitse sopiva tunnistautumistapa",
|
||||
"AuthenticationRequired": "Vaadi tunnistautuminen",
|
||||
"AuthenticationRequiredHelpText": "Valitse mitkä pyynnöt vaativat tunnistautumisen. Älä muuta, jos et ymmärrä riskejä.",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Vahvista uusi salasana",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Syötä uusi salasana",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
|
||||
"AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.",
|
||||
"Enabled": "Käytössä",
|
||||
"External": "Ulkoinen",
|
||||
"PasswordConfirmation": "Salasanan vahvistus",
|
||||
"DisabledForLocalAddresses": "Ei käytössä paikallisille osoitteille",
|
||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "{appName} tukee useita listoja, joilta sarjoja voidaan tuoda tietokantaan."
|
||||
}
|
||||
|
||||
@@ -2,11 +2,9 @@
|
||||
"20MinutesTwenty": "20 Minutes : {0}",
|
||||
"45MinutesFourtyFive": "45 Minutes : {0}",
|
||||
"60MinutesSixty": "60 Minutes : {0}",
|
||||
"APIKey": "Clé API",
|
||||
"About": "Tagalog",
|
||||
"About": "À propos",
|
||||
"AddListExclusion": "Ajouter une liste d'exclusion",
|
||||
"BindAddressHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"ApiKeyHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"Branch": "Branche",
|
||||
"Docker": "Docker",
|
||||
"DeleteRootFolderMessageText": "Êtes-vous sûr de vouloir supprimer le dossier racine « {name} » ?",
|
||||
@@ -33,7 +31,7 @@
|
||||
"AppDataDirectory": "Dossier AppData",
|
||||
"ApplyTags": "Appliquer les étiquettes",
|
||||
"Authentication": "Authentification",
|
||||
"AuthenticationMethodHelpText": "Exiger un nom d'utilisateur et un mot de passe pour accéder à Readarr",
|
||||
"AuthenticationMethodHelpText": "Exiger un nom d'utilisateur et un mot de passe pour accéder à {appName}",
|
||||
"AuthorClickToChangeBook": "Cliquer pour changer le livre",
|
||||
"AutoRedownloadFailedHelpText": "Recherche automatique et tentative de téléchargement d'une version différente",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Les livres effacés du disque dur ne seront plus surveillés dans Readarr",
|
||||
@@ -179,7 +177,7 @@
|
||||
"IndexerSettings": "Paramètres de l'indexeur",
|
||||
"Indexers": "Indexeurs",
|
||||
"Interval": "Intervalle",
|
||||
"IsCutoffCutoff": "Limite",
|
||||
"IsCutoffCutoff": "Couper",
|
||||
"IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Mettre à niveau jusqu'à ce que cette qualité soit atteinte ou dépassée",
|
||||
"IsTagUsedCannotBeDeletedWhileInUse": "Ne peut pas être supprimé pendant l'utilisation",
|
||||
"Language": "Langue",
|
||||
@@ -357,7 +355,7 @@
|
||||
"Status": "État",
|
||||
"StatusEndedEnded": "Terminé",
|
||||
"Style": "Style",
|
||||
"SuccessMyWorkIsDoneNoFilesToRename": "Victoire ! Mon travail est terminé, aucun fichier à renommer.",
|
||||
"SuccessMyWorkIsDoneNoFilesToRename": "C'est fait ! Mon travail est terminé, plus aucun fichier à renommer.",
|
||||
"SuccessMyWorkIsDoneNoFilesToRetag": "Victoire ! Mon travail est terminé, aucun fichier à renommer.",
|
||||
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS n'est pas pris en charge avec cet indexeur",
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "La recherche n'est pas prise en charge avec cet indexeur",
|
||||
@@ -484,9 +482,9 @@
|
||||
"AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour",
|
||||
"IndexerPriorityHelpText": "Priorité de l'indexeur de 1 (la plus élevée) à 50 (la plus basse). Par défaut : 25. Utilisé pour départager les versions lors des téléchargements. Readarr continuera d'utiliser tous les indexeurs activés pour les synchro RSS et les recherches.",
|
||||
"Duration": "Durée",
|
||||
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
|
||||
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin {2} valide. Vérifiez vos mappages de chemins distants et les paramètres de votre client de téléchargement.",
|
||||
"RemotePathMappingCheckDockerFolderMissing": "Vous utilisez docker ; {0} enregistre les téléchargements dans {1} mais ce dossier n'est pas présent dans ce conteneur. Vérifiez vos paramètres de dossier distant et les paramètres de votre conteneur docker.",
|
||||
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker ; {0} signifie les téléchargement dans {1} mais ce n'est pas un dossier valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
|
||||
"RemotePathMappingCheckFilesBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} a signalé des fichiers dans {1} mais ce n'est pas un chemin {2} valide. Vérifiez vos mappages de chemins distants et les paramètres de votre client de téléchargement.",
|
||||
"RemotePathMappingCheckFilesWrongOSPath": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.",
|
||||
"RemotePathMappingCheckLocalFolderMissing": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
|
||||
"RemotePathMappingCheckRemoteDownloadClient": "Le client de téléchargement distant {0} met les téléchargements dans {1} mais ce chemin ne semble pas exister. Vérifiez vos paramètres de chemins distants.",
|
||||
@@ -518,7 +516,7 @@
|
||||
"SearchFiltered": "Chercher les filtrés",
|
||||
"SettingsRemotePathMappingLocalPath": "Chemin local",
|
||||
"UpdateAvailable": "Une nouvelle mise à jour est disponible",
|
||||
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins distants",
|
||||
"DownloadClientsSettingsSummary": "Clients de téléchargement, gestion des téléchargements et mappages de chemins d'accès à distance",
|
||||
"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",
|
||||
@@ -540,19 +538,19 @@
|
||||
"FileWasDeletedByUpgrade": "Le fichier à été supprimé pour importer une version supérieure",
|
||||
"Filters": "Filtres",
|
||||
"General": "Général",
|
||||
"GeneralSettingsSummary": "Port, SSL/TLS, nom d'utilisateur/mot de passe, proxy, analyses et mises à jour",
|
||||
"GeneralSettingsSummary": "Port, SSL, 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": "Surveillé",
|
||||
"Monitor": "Surveiller",
|
||||
"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": "À saisir",
|
||||
"OnBookFileDelete": "Lors de la suppression du fichier d'un livre",
|
||||
"OnBookFileDeleteForUpgrade": "Lors de la suppression du fichier d'un livre pour la mise à niveau",
|
||||
"OnBookFileDeleteForUpgradeHelpText": "Lors de la suppression du fichier d'un livre pour la mise à niveau",
|
||||
"OnBookFileDeleteHelpText": "Lors de la suppression du fichier d'un livre",
|
||||
"OnGrab": "Lors de la saisie",
|
||||
"OnHealthIssue": "Sur la question de la santé",
|
||||
"OnRename": "Au renommage",
|
||||
"ProxyCheckBadRequestMessage": "Échec du test du proxy. StatusCode : {0}",
|
||||
@@ -666,8 +664,8 @@
|
||||
"ClickToChangeReleaseGroup": "Cliquez pour changer de groupe de diffusion",
|
||||
"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",
|
||||
"OnApplicationUpdate": "Lors de la mise à jour de l'application",
|
||||
"OnApplicationUpdateHelpText": "Lors de la mise à jour de l'application",
|
||||
"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é",
|
||||
@@ -809,7 +807,7 @@
|
||||
"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].",
|
||||
"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 à",
|
||||
@@ -970,5 +968,136 @@
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Emplacement dans lequel placer les téléchargements (facultatif), laissez vide pour utiliser l'emplacement Deluge par défaut",
|
||||
"LabelIsRequired": "L'étiquette est requise",
|
||||
"NotificationsSettingsUpdateMapPathsFromHelpText": "Chemin d'accès {appName}, utilisé pour modifier les chemins d'accès aux séries lorsque {serviceName} voit l'emplacement du chemin d'accès à la bibliothèque différemment de {appName} (Nécessite 'Mettre à jour la bibliothèque')",
|
||||
"NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite 'Mise à jour bibliothèque')"
|
||||
"NotificationsSettingsUpdateMapPathsToHelpText": "Chemin {serviceName}, utilisé pour modifier les chemins des séries quand {serviceName} voit un chemin d'emplacement de bibliothèque différemment de {appName} (nécessite 'Mise à jour bibliothèque')",
|
||||
"ClickToChangeIndexerFlags": "Cliquez pour changer les drapeaux de l'indexeur",
|
||||
"CustomFormatsSpecificationFlag": "Drapeau",
|
||||
"EditAuthor": "Éditer l'auteur",
|
||||
"EditBook": "Modifier le livre",
|
||||
"EditList": "Modifier la liste",
|
||||
"AuthorProgressBarText": "{availableBookCount} / {bookCount} (Total : {totalBookCount}, Fichiers : {bookFileCount})",
|
||||
"BookProgressBarText": "{bookCount} / {totalBookCount} (Fichiers : {bookFileCount})",
|
||||
"CustomFormatsSettingsTriggerInfo": "Un format personnalisé sera appliqué à une version ou à un fichier lorsqu'il correspond à au moins un de chacun des différents types de conditions choisis.",
|
||||
"IndexerFlags": "Drapeaux de l'indexeur",
|
||||
"Rejections": "Rejets",
|
||||
"SelectIndexerFlags": "Sélectionner les drapeaux de l'indexeur",
|
||||
"SetIndexerFlags": "Définir les drapeaux de l'indexeur",
|
||||
"NotificationsPlexSettingsAuthToken": "Jeton d'authentification",
|
||||
"NotificationsPlexSettingsAuthenticateWithPlexTv": "S'authentifier avec Plex.tv",
|
||||
"NotificationsSettingsUpdateLibrary": "Mettre à jour la bibliothèque",
|
||||
"NotificationsSettingsUpdateMapPathsFrom": "Mapper les chemins depuis",
|
||||
"NotificationsSettingsUseSslHelpText": "Se connecter à {serviceName} en HTTPS plutôt qu'en HTTP",
|
||||
"NotificationsSettingsUpdateMapPathsTo": "Mapper les chemins vers",
|
||||
"InteractiveSearchModalHeader": "Recherche interactive",
|
||||
"FailedLoadingSearchResults": "Échec du chargement des résultats de recherche, veuillez réessayer.",
|
||||
"MonitoredAuthorIsMonitored": "Artiste non surveillé",
|
||||
"IndexerSettingsSeedRatio": "Ratio d'envoie",
|
||||
"IndexerSettingsSeedRatioHelpText": "Le ratio qu'un torrent doit atteindre avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement. Le ratio doit être d'au moins 1.0 et suivre les règles des indexeurs",
|
||||
"IndexerSettingsSeedTime": "Temps d'envoie",
|
||||
"IndexerSettingsSeedTimeHelpText": "Durée pendant laquelle un torrent doit être envoyé avant de s'arrêter, vide utilise la valeur par défaut du client de téléchargement",
|
||||
"WhySearchesCouldBeFailing": "Cliquez ici pour savoir pourquoi les recherches pourraient échouer",
|
||||
"ApiKey": "Clé API",
|
||||
"AuthBasic": "Basique (fenêtre surgissante du navigateur)",
|
||||
"AuthForm": "Formulaire (page de connexion)",
|
||||
"AuthenticationMethod": "Méthode d'authentification",
|
||||
"AuthenticationMethodHelpTextWarning": "Veuillez choisir une méthode d'authentification valide",
|
||||
"AuthenticationRequired": "Authentification requise",
|
||||
"AuthenticationRequiredHelpText": "Modifier les demandes pour lesquelles l'authentification est requise. Ne rien modifier si vous n'en comprenez pas les risques.",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Saisir un nouveau mot de passe",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur",
|
||||
"AuthenticationRequiredWarning": "Pour empêcher l'accès à distance sans authentification, {appName} exige désormais que l'authentification soit activée. Vous pouvez éventuellement désactiver l'authentification pour les adresses locales.",
|
||||
"DisabledForLocalAddresses": "Désactivée pour les adresses IP locales",
|
||||
"Enabled": "Activé",
|
||||
"External": "Externe",
|
||||
"PasswordConfirmation": "Confirmation du mot de passe",
|
||||
"TagsSettingsSummary": "Gérer les étiquettes d'auteur, de profil, de restriction et de notification",
|
||||
"RefreshAuthor": "Actualiser l'auteur",
|
||||
"RenameBooks": "Renommer les livres",
|
||||
"ShouldMonitorExisting": "Surveiller les livres existants",
|
||||
"LatestBook": "Dernier livre",
|
||||
"WriteTagsNew": "Pour les nouveaux téléchargements uniquement",
|
||||
"FirstBook": "Premier livre",
|
||||
"RefreshInformation": "Actualiser les informations",
|
||||
"ISBN": "ISBN",
|
||||
"EmbedMetadataInBookFiles": "Intégrer des métadonnées dans les fichiers des livres",
|
||||
"IgnoredMetaHelpText": "Les livres seront ignorés s'ils contiennent un ou plusieurs termes (insensible à la casse)",
|
||||
"NewBooks": "Nouveaux livres",
|
||||
"NoName": "Ne pas afficher le nom",
|
||||
"HideBooks": "Masquer les livres",
|
||||
"IsExpandedHideBooks": "Masquer les livres",
|
||||
"TooManyBooks": "Il vous manque ou il y a trop de livres ? Modifier ou créer un nouveau",
|
||||
"FileDetails": "Détails du fichier",
|
||||
"LogSQL": "Log SQL",
|
||||
"EditionsHelpText": "Changer d'édition pour ce livre",
|
||||
"ExistingItems": "Éléments existants",
|
||||
"SendMetadataToCalibre": "Envoyer des métadonnées à Calibre",
|
||||
"MonitorNewItems": "Surveiller les nouveaux livres",
|
||||
"NameFirstLast": "Prénom Nom",
|
||||
"UsernameHelpText": "Nom d'utilisateur du serveur de contenu Calibre",
|
||||
"SearchBook": "Rechercher un livre",
|
||||
"HostHelpText": "Hôte du serveur de contenu Calibre",
|
||||
"MonitorAuthor": "Surveiller l'auteur",
|
||||
"MonitoredHelpText": "Readarr recherchera et téléchargera le livre",
|
||||
"NETCore": ".NET Core",
|
||||
"PasswordHelpText": "Mot de passe du serveur de contenu Calibre",
|
||||
"ExistingBooks": "Livres existants",
|
||||
"SelectEdition": "Sélectionnez une édition",
|
||||
"FilterPlaceHolder": "Filtrer par livre",
|
||||
"OnAuthorAdded": "Lors de l'ajout d'un auteur",
|
||||
"OnAuthorAddedHelpText": "Lors de l'ajout d'un auteur",
|
||||
"EmbedMetadataHelpText": "Dites à Calibre d'écrire les métadonnées dans le fichier du livre actuel",
|
||||
"UrlBaseHelpText": "Ajoute un préfixe à l'URL de Calibre, par exemple http://[host]:[port]/[urlBase]",
|
||||
"HasMonitoredBooksNoMonitoredBooksForThisAuthor": "Aucun livre surveillé pour cet auteur",
|
||||
"IsCalibreLibraryHelpText": "Utiliser le serveur de contenu Calibre pour manipuler la bibliothèque",
|
||||
"IsExpandedShowBooks": "Afficher les livres",
|
||||
"LibraryHelpText": "Nom de la bibliothèque du serveur de contenu Calibre. Laissez vide par défaut.",
|
||||
"MetadataSourceHelpText": "Source de métadonnées alternative (laisser vide par défaut)",
|
||||
"MissingBooksAuthorNotMonitored": "Livres manquants (auteur non surveillé)",
|
||||
"NoTagsHaveBeenAddedYet": "Aucun tag n'a été ajouté pour l'instant. Ajoutez des tag s pour lier les auteurs avec des profils de retard, des restrictions ou des notifications. Cliquez sur {0} pour en savoir plus sur les tags dans Readarr.",
|
||||
"PortHelpText": "Port du serveur de contenu Calibre",
|
||||
"SelectBook": "Sélectionnez un livre",
|
||||
"SelectedCountAuthorsSelectedInterp": "{0} Auteur(s) sélectionné(s)",
|
||||
"UpdateCovers": "Mettre à jour les couvertures",
|
||||
"UpdateCoversHelpText": "Définir les couvertures de livres dans Calibre pour qu'elles correspondent à celles de Readarr",
|
||||
"MinimumPages": "Pages minimum",
|
||||
"FilterAuthor": "Filtrer par auteur",
|
||||
"FutureBooks": "Livres futurs",
|
||||
"IgnoreDeletedBooks": "Ignorer les livres supprimés",
|
||||
"InteractiveSearchModalHeaderBookAuthor": "Recherche interactive - {bookTitle} de {authorName}",
|
||||
"LoadingEditionsFailed": "Le chargement des éditions a échoué",
|
||||
"MassBookSearch": "Recherche de livres de masse",
|
||||
"MassBookSearchWarning": "Voulez-vous vraiment effectuer une recherche groupée de {0} livres ?",
|
||||
"MetadataProviderSource": "Source du fournisseur de métadonnées",
|
||||
"MinPagesHelpText": "Ignorer les livres avec moins de pages que cela",
|
||||
"MinPopularityHelpText": "La popularité est la note moyenne * le nombre de votes",
|
||||
"MissingBooks": "Livres manquants",
|
||||
"MissingBooksAuthorMonitored": "Livres manquants (auteur surveillé)",
|
||||
"MonitorBook": "Surveiller le livre",
|
||||
"MonitorExistingBooks": "Surveiller les livres existants",
|
||||
"MonitorNewBooks": "Surveiller les nouveaux livres",
|
||||
"NameLastFirst": "Nom, Prénom",
|
||||
"NameStyle": "Style du nom de l'auteur",
|
||||
"OnAuthorDelete": "Lors de la suppression d'un auteur",
|
||||
"OnAuthorDeleteHelpText": "Lors de la suppression d'un auteur",
|
||||
"OnBookDelete": "Lors de la suppression d'un livre",
|
||||
"OnBookDeleteHelpText": "Lors de la suppression d'un livre",
|
||||
"OnBookRetagHelpText": "Lors du réétiquetage d'un livre",
|
||||
"OnBookTagUpdate": "Lors de la mise à jour des étiquettes d'un livre",
|
||||
"OutputFormatHelpText": "Demandez éventuellement à Calibre de convertir vers d'autres formats lors de l'importation. Liste séparée par des virgules.",
|
||||
"RefreshBook": "Actualiser le livre",
|
||||
"SeriesNumber": "Numéro de série",
|
||||
"SeriesTotal": "Séries ({0})",
|
||||
"SetReadarrTags": "Définir les étiquettes Readarr",
|
||||
"ShouldMonitorHelpText": "Surveiller les nouveaux auteurs et livres ajoutés à partir de cette liste",
|
||||
"ShowBookCount": "Afficher le nombre de livres",
|
||||
"ShowLastBook": "Afficher le dernier livre",
|
||||
"SkipBooksWithMissingReleaseDate": "Ignorer les livres dont la date de sortie est manquante",
|
||||
"SkipBooksWithNoISBNOrASIN": "Ignorer les livres sans ISBN ou ASIN",
|
||||
"TagsHelpText": "S'applique aux auteurs avec au moins une étiquette correspondante. Laisser vide pour appliquer à tous les auteurs",
|
||||
"TheFollowingFilesWillBeDeleted": "Les fichiers suivants seront supprimés :",
|
||||
"UseSslHelpText": "Utilisez SSL pour vous connecter au serveur de contenu Calibre",
|
||||
"WriteTagsAll": "Tous les fichiers ; importation initiale uniquement",
|
||||
"WriteTagsSync": "Tous les fichiers ; rester synchronisé avec Goodreads",
|
||||
"Iso639-3": "Codes de langage ISO 639-3, ou 'null', séparés par des virgules",
|
||||
"SpecificBook": "Livre spécifique"
|
||||
}
|
||||
|
||||
@@ -420,10 +420,8 @@
|
||||
"20MinutesTwenty": "60 דקות: {0}",
|
||||
"45MinutesFourtyFive": "60 דקות: {0}",
|
||||
"60MinutesSixty": "60 דקות: {0}",
|
||||
"APIKey": "מפתח API",
|
||||
"About": "אודות",
|
||||
"AddListExclusion": "הוסף אי הכללת רשימה",
|
||||
"ApiKeyHelpTextWarning": "נדרש הפעלה מחדש כדי להיכנס לתוקף",
|
||||
"AnalyticsEnabledHelpTextWarning": "נדרש הפעלה מחדש כדי להיכנס לתוקף",
|
||||
"Automatic": "אוֹטוֹמָטִי",
|
||||
"Cancel": "לְבַטֵל",
|
||||
@@ -665,5 +663,18 @@
|
||||
"CustomFilter": "מסננים מותאמים אישית",
|
||||
"RemoveQueueItemConfirmation": "האם אתה בטוח שברצונך להסיר את {0} פריט {1} מהתור?",
|
||||
"SourceTitle": "כותרת מקור",
|
||||
"AutoRedownloadFailed": "הורדה נכשלה"
|
||||
"AutoRedownloadFailed": "הורדה נכשלה",
|
||||
"IndexerFlags": "אינדקס דגלים",
|
||||
"InteractiveSearchModalHeader": "חיפוש אינטראקטיבי",
|
||||
"FailedLoadingSearchResults": "טעינת תוצאות החיפוש נכשלה, נסה שוב.",
|
||||
"RemotePathMappingCheckFilesLocalWrongOSPath": "אתה משתמש בדוקר; קליינט ההורדות {downloadClientName} שם הורדות ב-{path} אבל הנתיב לא תקין {osName}. בחן מחדש את ניתוב התיקיות והגדרות קליינט ההורדות.",
|
||||
"RemotePathMappingCheckLocalWrongOSPath": "אתה משתמש בדוקר; קליינט ההורדות {downloadClientName} שם הורדות ב-{path} אבל הנתיב לא תקין {osName}. בחן מחדש את ניתוב התיקיות והגדרות קליינט ההורדות.",
|
||||
"ApiKey": "מפתח API",
|
||||
"AuthBasic": "בסיסי (חלון קופץ לדפדפן)",
|
||||
"AuthForm": "טפסים (דף כניסה)",
|
||||
"AuthenticationRequired": "נדרש אימות",
|
||||
"AuthenticationRequiredHelpText": "הגדר עבור אילו קריאות נדרש אימות. עדיף להשאיר את ברירת המחדל.",
|
||||
"AuthenticationRequiredWarning": "בכדי למנוע גישה מרחוק ללא אימות, {appName} דורש הגדרת אימות.\nהגדר את הפרטים ושיטת האימות. ישנה אפשרות לדלג על אימות מהרשת הביתית שלך. \nבמידת הצורך יש לפנות אל שו״ת למידע נוסף.",
|
||||
"DisabledForLocalAddresses": "מושבת לכתובות מקומיות",
|
||||
"Enabled": "מופעל"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"45MinutesFourtyFive": "90 मिनट: {0}",
|
||||
"45MinutesFourtyFive": "45 मिनट: {0}",
|
||||
"60MinutesSixty": "60 मिनट: {0}",
|
||||
"About": "के बारे में",
|
||||
"AddListExclusion": "सूची बहिष्करण जोड़ें",
|
||||
@@ -423,10 +423,8 @@
|
||||
"WeekColumnHeader": "वीक कॉलम हैडर",
|
||||
"Year": "साल",
|
||||
"YesCancel": "हाँ, रद्द करें",
|
||||
"20MinutesTwenty": "90 मिनट: {0}",
|
||||
"APIKey": "एपीआई कुंजी",
|
||||
"20MinutesTwenty": "20 मिनट: {0}",
|
||||
"AnalyticsEnabledHelpTextWarning": "प्रभावी करने के लिए पुनरारंभ की आवश्यकता है",
|
||||
"ApiKeyHelpTextWarning": "प्रभावी करने के लिए पुनरारंभ की आवश्यकता है",
|
||||
"DeleteTag": "टैग हटाएं",
|
||||
"DeleteRootFolderMessageText": "क्या आप वाकई '{0}' इंडेक्स को हटाना चाहते हैं?",
|
||||
"EnableRSS": "आरएसएस को सक्षम करें",
|
||||
@@ -583,5 +581,64 @@
|
||||
"RemoveSelectedItemBlocklistMessageText": "क्या आप वाकई चयनित आइटम को ब्लैकलिस्ट से हटाना चाहते हैं?",
|
||||
"RemoveSelectedItemQueueMessageText": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?",
|
||||
"RemoveSelectedItemsQueueMessageText": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?",
|
||||
"NoEventsFound": "कोई घटना नहीं मिली"
|
||||
"NoEventsFound": "कोई घटना नहीं मिली",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
|
||||
"DeleteSelectedDownloadClients": "डाउनलोड क्लाइंट हटाएं",
|
||||
"ExistingTag": "मौजूदा टैग",
|
||||
"Events": "आयोजन",
|
||||
"LastDuration": "lastDuration",
|
||||
"NextExecution": "अगला निष्पादन",
|
||||
"Yes": "हाँ",
|
||||
"Small": "छोटा",
|
||||
"InteractiveSearchModalHeader": "इंटरएक्टिव खोज",
|
||||
"ExtraFileExtensionsHelpText": "आयात करने के लिए कोमा ने अतिरिक्त फ़ाइलों की सूची अलग कर दी (.nfo को .nfo- मूल के रूप में आयात किया जाएगा)",
|
||||
"ExtraFileExtensionsHelpTextsExamples": "उदाहरण: '.sub, .nfo' या 'सब, nfo'",
|
||||
"ConnectionLost": "संपर्क टूट गया",
|
||||
"RecentChanges": "हाल में हुए बदलाव",
|
||||
"ApplyTagsHelpTextAdd": "जोड़ें: टैग की मौजूदा सूची में टैग जोड़ें",
|
||||
"No": "नहीं",
|
||||
"System": "प्रणाली",
|
||||
"SetTags": "टैग सेट करें",
|
||||
"DeleteSelectedIndexers": "अनुक्रमणिका हटाएं",
|
||||
"Activity": "गतिविधि",
|
||||
"AddNew": "नया जोड़ें",
|
||||
"Medium": "मध्यम",
|
||||
"Backup": "बैकअप",
|
||||
"ConnectionLostReconnect": "Radarr अपने आप कनेक्ट होने का प्रयास करेगा, या आप नीचे पुनः लोड कर सकते हैं।",
|
||||
"RemoveQueueItemConfirmation": "क्या आप वाकई {0} आइटम {1} को कतार से हटाना चाहते हैं?",
|
||||
"CustomFilter": "कस्टम फ़िल्टर",
|
||||
"AutoRedownloadFailed": "डाउनलोड विफल",
|
||||
"SourceTitle": "स्रोत शीर्षक",
|
||||
"FreeSpace": "खाली जगह",
|
||||
"ImportLists": "सूचियों",
|
||||
"ListsSettingsSummary": "सूचियों",
|
||||
"Location": "स्थान",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "कुछ परिणाम लागू फ़िल्टर द्वारा छिपे हुए हैं",
|
||||
"TotalSpace": "कुल स्थान",
|
||||
"WhatsNew": "नया क्या है?",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
|
||||
"ApplyTagsHelpTextRemove": "निकालें: दर्ज किए गए टैग निकालें",
|
||||
"ApplyTagsHelpTextReplace": "प्रतिस्थापित करें: दर्ज किए गए टैगों के साथ टैग बदलें (सभी टैग्स को खाली करने के लिए कोई टैग दर्ज न करें)",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "सभी परिणाम लागू फ़िल्टर द्वारा छिपे हुए हैं",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "चयनित फिल्मों के लिए टैग कैसे लागू करें",
|
||||
"FailedLoadingSearchResults": "खोज परिणाम लोड करने में विफल, कृपया पुनः प्रयास करें।",
|
||||
"IndexerFlags": "इंडेक्स फ्लैग",
|
||||
"Large": "विशाल",
|
||||
"LastExecution": "अंतिम निष्पादन",
|
||||
"LastWriteTime": "अंतिम समय लिखें",
|
||||
"NoChange": "कोई परिवर्तन नहीं होता है",
|
||||
"NoResultsFound": "कोई परिणाम नहीं मिला",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "सभी सूचियाँ विफल होने के कारण अनुपलब्ध हैं",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "विफलताओं के कारण अनुपलब्ध सूची: {0}",
|
||||
"RedownloadFailed": "डाउनलोड विफल",
|
||||
"RemovingTag": "टैग हटाना",
|
||||
"SelectDropdown": "'चुनते हैं..।",
|
||||
"SelectQuality": "गुणवत्ता का चयन करें",
|
||||
"Ui": "यूआई",
|
||||
"ApiKey": "एपीआई कुंजी",
|
||||
"AuthBasic": "बेसिक (ब्राउज़र पॉपअप)",
|
||||
"AuthForm": "प्रपत्र (लॉग इन पेज)",
|
||||
"DisabledForLocalAddresses": "स्थानीय पते के लिए अक्षम",
|
||||
"Enabled": "सक्रिय"
|
||||
}
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
"URLBase": "URL Base",
|
||||
"Usenet": "Usenet",
|
||||
"Analytics": "Analitika",
|
||||
"APIKey": "API ključ",
|
||||
"Clear": "Očisti",
|
||||
"Grab": "Dohvati",
|
||||
"MetadataProfile": "profil metapodataka",
|
||||
@@ -178,5 +177,26 @@
|
||||
"UseProxy": "Koristi proxy",
|
||||
"RemoveFilter": "Ukloni filter",
|
||||
"Name": "Ime",
|
||||
"Version": "Verzija"
|
||||
"Version": "Verzija",
|
||||
"ListsSettingsSummary": "Lista",
|
||||
"ImportLists": "Lista",
|
||||
"ImportListExclusions": "Dodaj na Listu Isključenja",
|
||||
"Activity": "Aktivnost",
|
||||
"AddNew": "Dodaj Novo",
|
||||
"DeleteImportListExclusion": "Dodaj na Listu Isključenja",
|
||||
"Events": "Događaj",
|
||||
"Backup": "Sigurnosna kopija",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Svi rezultati su skriveni zbog primjenjenog filtera",
|
||||
"HasPendingChangesSaveChanges": "Spremi izmjene",
|
||||
"Library": "Biblioteka",
|
||||
"RemoveQueueItemConfirmation": "Jeste li sigurni da želite izbrisati stavku {0} iz reda?",
|
||||
"Size": " Veličina",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "Svi rezultati su skriveni zbog primjenjenog filtera",
|
||||
"System": "Sustav",
|
||||
"Ui": "Korisničko sučelje",
|
||||
"ApiKey": "API ključ",
|
||||
"AuthBasic": "Osnovno (Skočni prozor preglednika)",
|
||||
"AuthForm": "Forme (Login Stranica)",
|
||||
"DisabledForLocalAddresses": "Onemogućeno za Lokalne Adrese",
|
||||
"Enabled": "Omogući"
|
||||
}
|
||||
|
||||
@@ -393,7 +393,6 @@
|
||||
"20MinutesTwenty": "20 Perc: {0}",
|
||||
"45MinutesFourtyFive": "45 Perc: {0}",
|
||||
"60MinutesSixty": "60 Perc: {0}",
|
||||
"APIKey": "API Kulcs",
|
||||
"About": "Névjegy",
|
||||
"AddListExclusion": "Listakizárás hozzáadása",
|
||||
"AddingTag": "Címke hozzáadása",
|
||||
@@ -564,7 +563,6 @@
|
||||
"MusicBrainzTrackID": "MusicBrainz zeneszám azonosítója",
|
||||
"MusicbrainzId": "MusicBrainz azonosító",
|
||||
"NETCore": ".NET Mag",
|
||||
"ApiKeyHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez",
|
||||
"AnalyticsEnabledHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez",
|
||||
"DeleteRootFolderMessageText": "Biztosan törli a(z) \"{name}\" gyökérmappát?",
|
||||
"LoadingBooksFailed": "A film fájljainak betöltése sikertelen",
|
||||
@@ -1049,5 +1047,32 @@
|
||||
"RemoveQueueItemRemovalMethod": "Eltávolítási módszer",
|
||||
"RemoveQueueItemRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltést és a fájl(oka)t a letöltési kliensből.",
|
||||
"RemoveQueueItemsRemovalMethodHelpTextWarning": "Az „Eltávolítás a letöltési kliensből” eltávolítja a letöltéseket és a fájlokat a letöltési kliensből.",
|
||||
"OnAuthorAdded": "A szerző hozzáadva"
|
||||
"OnAuthorAdded": "A szerző hozzáadva",
|
||||
"DashOrSpaceDashDependingOnName": "Dash vagy Space Dash névtől függően",
|
||||
"Rejections": "Elutasítások",
|
||||
"BlocklistAndSearchHint": "Indítsa el a csere keresését a tiltólistázás után",
|
||||
"DownloadClientDelugeSettingsDirectoryHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához",
|
||||
"FailedLoadingSearchResults": "Nem sikerült betölteni a keresési eredményeket, próbálkozzon újra.",
|
||||
"CustomFilter": "Egyedi Szűrők",
|
||||
"IndexerFlags": "Indexer Zászló",
|
||||
"InteractiveSearchModalHeader": "Interaktív Keresés",
|
||||
"SelectDropdown": "Válassz...",
|
||||
"SelectQuality": "Minőség kiválasztása",
|
||||
"SelectReleaseGroup": "Release csoport kiválasztása",
|
||||
"DownloadClientDelugeSettingsDirectoryCompletedHelpText": "Választható hely a letöltések elhelyezéséhez, hagyja üresen az alapértelmezett Aria2 hely használatához",
|
||||
"ApiKey": "API Kulcs",
|
||||
"AuthForm": "Űrlapok (bejelentkezési oldal)",
|
||||
"AuthenticationMethod": "Hitelesítési Módszer",
|
||||
"AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot",
|
||||
"AuthenticationRequired": "Azonosítás szükséges",
|
||||
"AuthenticationRequiredHelpText": "Módosítsa, hogy mely kérésekhez van szükség hitelesítésre. Ne változtasson, hacsak nem érti a kockázatokat.",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet",
|
||||
"AuthenticationRequiredWarning": "A hitelesítés nélküli távoli hozzáférés megakadályozása érdekében a(z) {appName} alkalmazásnak engedélyeznie kell a hitelesítést. Opcionálisan letilthatja a helyi címekről történő hitelesítést.",
|
||||
"DisabledForLocalAddresses": "Helyi címeknél letiltva",
|
||||
"External": "Külső",
|
||||
"PasswordConfirmation": "Jelszó megerősítése",
|
||||
"AuthBasic": "Alap (böngésző előugró ablak)",
|
||||
"Enabled": "Engedélyezés"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user