mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-24 17:24:30 -04:00
Compare commits
19 Commits
v0.3.4.220
...
v0.3.6.223
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44e6de2e23 | ||
|
|
b209d047fa | ||
|
|
fd5ab27df6 | ||
|
|
4a89befd79 | ||
|
|
1a30293c33 | ||
|
|
f5c2a6bf51 | ||
|
|
f3d90fdaf1 | ||
|
|
04c5671a0a | ||
|
|
22cc88c5e7 | ||
|
|
ca0c95a2d2 | ||
|
|
419f790d66 | ||
|
|
9fe08429bc | ||
|
|
71f4a88ab3 | ||
|
|
30b283eda3 | ||
|
|
e23d0bbfa1 | ||
|
|
765a2aa01b | ||
|
|
64895c3210 | ||
|
|
03ab84a814 | ||
|
|
b77e5b14e1 |
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '0.3.4'
|
||||
majorVersion: '0.3.6'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
readarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
|
||||
|
||||
@@ -162,7 +162,7 @@ namespace NzbDrone.Common.Extensions
|
||||
{
|
||||
if (text.IsNullOrWhiteSpace())
|
||||
{
|
||||
throw new ArgumentNullException("text");
|
||||
throw new ArgumentNullException(nameof(text));
|
||||
}
|
||||
|
||||
return text.IndexOfAny(Path.GetInvalidPathChars()) >= 0;
|
||||
|
||||
@@ -115,7 +115,7 @@ namespace NzbDrone.Common.Http.Dispatchers
|
||||
}
|
||||
else
|
||||
{
|
||||
data = responseMessage.Content.ReadAsByteArrayAsync(cts.Token).GetAwaiter().GetResult();
|
||||
data = await responseMessage.Content.ReadAsByteArrayAsync(cts.Token);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
using FizzWare.NBuilder;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Books;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.DecisionEngine.Specifications.RssSync;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
@@ -33,8 +34,13 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
||||
};
|
||||
|
||||
Mocker
|
||||
.GetMock<IIndexerRepository>()
|
||||
.GetMock<IIndexerFactory>()
|
||||
.Setup(m => m.Get(It.IsAny<int>()))
|
||||
.Throws(new ModelNotFoundException(typeof(IndexerDefinition), -1));
|
||||
|
||||
Mocker
|
||||
.GetMock<IIndexerFactory>()
|
||||
.Setup(m => m.Get(1))
|
||||
.Returns(_fakeIndexerDefinition);
|
||||
|
||||
_specification = Mocker.Resolve<IndexerTagSpecification>();
|
||||
@@ -106,5 +112,25 @@ namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync
|
||||
|
||||
_specification.IsSatisfiedBy(_parseResultMulti, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void release_without_indexerid_should_return_true()
|
||||
{
|
||||
_fakeIndexerDefinition.Tags = new HashSet<int> { 456 };
|
||||
_fakeAuthor.Tags = new HashSet<int> { 123, 789 };
|
||||
_fakeRelease.IndexerId = 0;
|
||||
|
||||
_specification.IsSatisfiedBy(_parseResultMulti, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void release_with_invalid_indexerid_should_return_true()
|
||||
{
|
||||
_fakeIndexerDefinition.Tags = new HashSet<int> { 456 };
|
||||
_fakeAuthor.Tags = new HashSet<int> { 123, 789 };
|
||||
_fakeRelease.IndexerId = 2;
|
||||
|
||||
_specification.IsSatisfiedBy(_parseResultMulti, new BookSearchCriteria { MonitoredBooksOnly = true }).Accepted.Should().BeTrue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
using System;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Download.Clients;
|
||||
using NzbDrone.Core.HealthCheck.Checks;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
using NzbDrone.Test.Common;
|
||||
|
||||
namespace NzbDrone.Core.Test.HealthCheck.Checks
|
||||
{
|
||||
[TestFixture]
|
||||
public class DownloadClientRemovesCompletedDownloadsCheckFixture : CoreTest<DownloadClientRemovesCompletedDownloadsCheck>
|
||||
{
|
||||
private DownloadClientInfo _clientStatus;
|
||||
private Mock<IDownloadClient> _downloadClient;
|
||||
|
||||
private static Exception[] DownloadClientExceptions =
|
||||
{
|
||||
new DownloadClientUnavailableException("error"),
|
||||
new DownloadClientAuthenticationException("error"),
|
||||
new DownloadClientException("error")
|
||||
};
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
_clientStatus = new DownloadClientInfo
|
||||
{
|
||||
IsLocalhost = true,
|
||||
|
||||
// SortingMode = null,
|
||||
RemovesCompletedDownloads = true
|
||||
};
|
||||
|
||||
_downloadClient = Mocker.GetMock<IDownloadClient>();
|
||||
_downloadClient.Setup(s => s.Definition)
|
||||
.Returns(new DownloadClientDefinition { Name = "Test" });
|
||||
|
||||
_downloadClient.Setup(s => s.GetStatus())
|
||||
.Returns(_clientStatus);
|
||||
|
||||
Mocker.GetMock<IProvideDownloadClient>()
|
||||
.Setup(s => s.GetDownloadClients(It.IsAny<bool>()))
|
||||
.Returns(new IDownloadClient[] { _downloadClient.Object });
|
||||
|
||||
Mocker.GetMock<ILocalizationService>()
|
||||
.Setup(s => s.GetLocalizedString(It.IsAny<string>()))
|
||||
.Returns("Some Warning Message");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_return_warning_if_removing_completed_downloads_is_enabled()
|
||||
{
|
||||
Subject.Check().ShouldBeWarning();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_return_ok_if_remove_completed_downloads_is_not_enabled()
|
||||
{
|
||||
_clientStatus.RemovesCompletedDownloads = false;
|
||||
Subject.Check().ShouldBeOk();
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCaseSource(nameof(DownloadClientExceptions))]
|
||||
public void should_return_ok_if_client_throws_downloadclientexception(Exception ex)
|
||||
{
|
||||
_downloadClient.Setup(s => s.GetStatus())
|
||||
.Throws(ex);
|
||||
|
||||
Subject.Check().ShouldBeOk();
|
||||
|
||||
ExceptionVerification.ExpectedErrors(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
@@ -10,12 +11,12 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
|
||||
public class IndexerTagSpecification : IDecisionEngineSpecification
|
||||
{
|
||||
private readonly Logger _logger;
|
||||
private readonly IIndexerRepository _indexerRepository;
|
||||
private readonly IIndexerFactory _indexerFactory;
|
||||
|
||||
public IndexerTagSpecification(Logger logger, IIndexerRepository indexerRepository)
|
||||
public IndexerTagSpecification(Logger logger, IIndexerFactory indexerFactory)
|
||||
{
|
||||
_logger = logger;
|
||||
_indexerRepository = indexerRepository;
|
||||
_indexerFactory = indexerFactory;
|
||||
}
|
||||
|
||||
public SpecificationPriority Priority => SpecificationPriority.Default;
|
||||
@@ -23,8 +24,24 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.RssSync
|
||||
|
||||
public virtual Decision IsSatisfiedBy(RemoteBook subject, SearchCriteriaBase searchCriteria)
|
||||
{
|
||||
// If indexer has tags, check that at least one of them is present on the author
|
||||
var indexerTags = _indexerRepository.Get(subject.Release.IndexerId).Tags;
|
||||
if (subject.Release == null || subject.Author?.Tags == null || subject.Release.IndexerId == 0)
|
||||
{
|
||||
return Decision.Accept();
|
||||
}
|
||||
|
||||
IndexerDefinition indexer;
|
||||
try
|
||||
{
|
||||
indexer = _indexerFactory.Get(subject.Release.IndexerId);
|
||||
}
|
||||
catch (ModelNotFoundException)
|
||||
{
|
||||
_logger.Debug("Indexer with id {0} does not exist, skipping indexer tags check", subject.Release.IndexerId);
|
||||
return Decision.Accept();
|
||||
}
|
||||
|
||||
// If indexer has tags, check that at least one of them is present on the series
|
||||
var indexerTags = indexer.Tags;
|
||||
|
||||
if (indexerTags.Any() && indexerTags.Intersect(subject.Author.Tags).Empty())
|
||||
{
|
||||
|
||||
@@ -389,7 +389,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
return new DownloadClientInfo
|
||||
{
|
||||
IsLocalhost = Settings.Host == "127.0.0.1" || Settings.Host == "localhost",
|
||||
OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, destDir) }
|
||||
OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, destDir) },
|
||||
RemovesCompletedDownloads = (config.MaxRatioEnabled || config.MaxSeedingTimeEnabled) && (config.MaxRatioAction == QBittorrentMaxRatioAction.Remove || config.MaxRatioAction == QBittorrentMaxRatioAction.DeleteFiles)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -263,6 +263,8 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
||||
status.OutputRootFolders = new List<OsPath> { _remotePathMappingService.RemapRemoteToLocal(Settings.Host, category.FullPath) };
|
||||
}
|
||||
|
||||
status.RemovesCompletedDownloads = config.Misc.history_retention != "0";
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace NzbDrone.Core.Download.Clients.Sabnzbd
|
||||
public string[] date_categories { get; set; }
|
||||
public bool enable_date_sorting { get; set; }
|
||||
public bool pre_check { get; set; }
|
||||
public string history_retention { get; set; }
|
||||
}
|
||||
|
||||
public class SabnzbdCategory
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace NzbDrone.Core.Download
|
||||
}
|
||||
|
||||
public bool IsLocalhost { get; set; }
|
||||
public bool RemovesCompletedDownloads { get; set; }
|
||||
public List<OsPath> OutputRootFolders { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,6 +346,7 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
private void DownloadImage(Author author, ImageFileResult image)
|
||||
{
|
||||
var fullPath = Path.Combine(author.Path, image.RelativePath);
|
||||
var downloaded = true;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -353,12 +354,19 @@ namespace NzbDrone.Core.Extras.Metadata
|
||||
{
|
||||
_httpClient.DownloadFile(image.Url, fullPath);
|
||||
}
|
||||
else
|
||||
else if (_diskProvider.FileExists(image.Url))
|
||||
{
|
||||
_diskProvider.CopyFile(image.Url, fullPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
downloaded = false;
|
||||
}
|
||||
|
||||
_mediaFileAttributeService.SetFilePermissions(fullPath);
|
||||
if (downloaded)
|
||||
{
|
||||
_mediaFileAttributeService.SetFilePermissions(fullPath);
|
||||
}
|
||||
}
|
||||
catch (WebException ex)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Datastore.Events;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Download.Clients;
|
||||
using NzbDrone.Core.Localization;
|
||||
using NzbDrone.Core.RemotePathMappings;
|
||||
using NzbDrone.Core.RootFolders;
|
||||
using NzbDrone.Core.ThingiProvider.Events;
|
||||
|
||||
namespace NzbDrone.Core.HealthCheck.Checks
|
||||
{
|
||||
[CheckOn(typeof(ProviderUpdatedEvent<IDownloadClient>))]
|
||||
[CheckOn(typeof(ProviderDeletedEvent<IDownloadClient>))]
|
||||
[CheckOn(typeof(ModelEvent<RootFolder>))]
|
||||
[CheckOn(typeof(ModelEvent<RemotePathMapping>))]
|
||||
|
||||
public class DownloadClientRemovesCompletedDownloadsCheck : HealthCheckBase, IProvideHealthCheck
|
||||
{
|
||||
private readonly IProvideDownloadClient _downloadClientProvider;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public DownloadClientRemovesCompletedDownloadsCheck(IProvideDownloadClient downloadClientProvider,
|
||||
Logger logger,
|
||||
ILocalizationService localizationService)
|
||||
: base(localizationService)
|
||||
{
|
||||
_downloadClientProvider = downloadClientProvider;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public override HealthCheck Check()
|
||||
{
|
||||
var clients = _downloadClientProvider.GetDownloadClients(true);
|
||||
|
||||
foreach (var client in clients)
|
||||
{
|
||||
try
|
||||
{
|
||||
var clientName = client.Definition.Name;
|
||||
var status = client.GetStatus();
|
||||
|
||||
if (status.RemovesCompletedDownloads)
|
||||
{
|
||||
return new HealthCheck(GetType(),
|
||||
HealthCheckResult.Warning,
|
||||
string.Format(_localizationService.GetLocalizedString("DownloadClientRemovesCompletedDownloadsHealthCheckMessage"), clientName, "Readarr"),
|
||||
"#download-client-removes-completed-downloads");
|
||||
}
|
||||
}
|
||||
catch (DownloadClientException ex)
|
||||
{
|
||||
_logger.Debug(ex, "Unable to communicate with {0}", client.Definition.Name);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "Unknown error occurred in DownloadClientHistoryRetentionCheck HealthCheck");
|
||||
}
|
||||
}
|
||||
|
||||
return new HealthCheck(GetType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using Dapper;
|
||||
using NzbDrone.Core.Datastore;
|
||||
|
||||
namespace NzbDrone.Core.Housekeeping.Housekeepers
|
||||
{
|
||||
public class FixMultipleMonitoredEditions : IHousekeepingTask
|
||||
{
|
||||
private readonly IMainDatabase _database;
|
||||
|
||||
public FixMultipleMonitoredEditions(IMainDatabase database)
|
||||
{
|
||||
_database = database;
|
||||
}
|
||||
|
||||
public void Clean()
|
||||
{
|
||||
using var mapper = _database.OpenConnection();
|
||||
|
||||
mapper.Execute(@"UPDATE ""Editions""
|
||||
SET ""Monitored"" = 0
|
||||
WHERE ""Id"" IN (
|
||||
SELECT MIN(""Id"")
|
||||
FROM ""Editions""
|
||||
WHERE ""Monitored"" = 1
|
||||
GROUP BY ""BookId""
|
||||
HAVING COUNT(""BookId"") > 1
|
||||
)");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -257,9 +257,17 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
protected virtual bool IsValidRelease(ReleaseInfo release)
|
||||
{
|
||||
if (release.Title.IsNullOrWhiteSpace())
|
||||
{
|
||||
_logger.Trace("Invalid Release: '{0}' from indexer: {1}. No title provided.", release.InfoUrl, Definition.Name);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (release.DownloadUrl.IsNullOrWhiteSpace())
|
||||
{
|
||||
_logger.Trace("Invalid Release: '{0}' from indexer: {1}. No Download URL provided.", release.Title, release.Indexer);
|
||||
_logger.Trace("Invalid Release: '{0}' from indexer: {1}. No Download URL provided.", release.Title, Definition.Name);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ using NzbDrone.Common.Cache;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Indexers.Exceptions;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Newznab
|
||||
{
|
||||
@@ -73,6 +74,13 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
_logger.Debug(ex, "Failed to parse newznab api capabilities for {0}", indexerSettings.BaseUrl);
|
||||
throw;
|
||||
}
|
||||
catch (ApiKeyException ex)
|
||||
{
|
||||
ex.WithData(response, 128 * 1024);
|
||||
_logger.Trace("Unexpected Response content ({0} bytes): {1}", response.ResponseData.Length, response.Content);
|
||||
_logger.Debug(ex, "Failed to parse newznab api capabilities for {0}, invalid API key", indexerSettings.BaseUrl);
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ex.WithData(response, 128 * 1024);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"20MinutesTwenty": "60 minutter: {0}",
|
||||
"45MinutesFourtyFive": "60 minutter: {0}",
|
||||
"20MinutesTwenty": "20 minutter: {0}",
|
||||
"45MinutesFourtyFive": "45 minutter: {0}",
|
||||
"60MinutesSixty": "60 minutter: {0}",
|
||||
"APIKey": "API-nøgle",
|
||||
"About": "Om",
|
||||
@@ -634,5 +634,6 @@
|
||||
"AddNew": "Tilføj Ny",
|
||||
"Large": "Stor",
|
||||
"Library": "Bibliotek",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Alle resultater skjules af det anvendte filter"
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Alle resultater skjules af det anvendte filter",
|
||||
"AddNewItem": "Tilføj Ny Genstand"
|
||||
}
|
||||
|
||||
@@ -993,5 +993,8 @@
|
||||
"AddNew": "Προσθήκη Νέων",
|
||||
"Backup": "Αντίγραφο Ασφαλείας",
|
||||
"NextExecution": "Επόμενη εκτέλεση",
|
||||
"Small": "Μικρό"
|
||||
"Small": "Μικρό",
|
||||
"AppUpdated": "{appName} Ενημερώθηκε",
|
||||
"AppUpdatedVersion": "ξαναφορτωθεί",
|
||||
"AutoAdd": "Προσθήκη"
|
||||
}
|
||||
|
||||
@@ -265,6 +265,7 @@
|
||||
"DownloadClientCheckDownloadingToRoot": "Download client {0} places downloads in the root folder {1}. You should not download to a root folder.",
|
||||
"DownloadClientCheckNoneAvailableMessage": "No download client is available",
|
||||
"DownloadClientCheckUnableToCommunicateMessage": "Unable to communicate with {0}.",
|
||||
"DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Download client {0} is set to remove completed downloads. This can result in downloads being removed from your client before {1} can import them.",
|
||||
"DownloadClientSettings": "Download Client Settings",
|
||||
"DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}",
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
"SslCertPathHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"UnableToLoadMetadataProfiles": "Impossible de charger les profils de délai",
|
||||
"AddingTag": "Ajouter un tag",
|
||||
"AgeWhenGrabbed": "Age (au moment du téléchargement)",
|
||||
"AlreadyInYourLibrary": "Déjà disponible dans votre librairie",
|
||||
"AlternateTitles": "Titre alternatif",
|
||||
"AgeWhenGrabbed": "Âge (au moment de la saisie)",
|
||||
"AlreadyInYourLibrary": "Déjà dans la bibliothèque",
|
||||
"AlternateTitles": "Titres alternatifs",
|
||||
"Analytics": "Statistiques",
|
||||
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Readarr. Cela inclut des informations sur votre navigateur, quelle page de l'interface web Readarr vous utilisez, les rapports d'erreur ainsi que le SE et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.",
|
||||
"AnalyticsEnabledHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
@@ -35,14 +35,14 @@
|
||||
"Authentication": "Authentification",
|
||||
"AuthenticationMethodHelpText": "Exiger un identifiant et un mot de passe pour accéder à Readarr",
|
||||
"AuthorClickToChangeBook": "Cliquer pour changer le livre",
|
||||
"AutoRedownloadFailedHelpText": "Chercher et essayer de télécharger une version différente automatiquement",
|
||||
"AutoRedownloadFailedHelpText": "Recherche automatique et tentative de téléchargement d'une version différente",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Les livres qui sont effacés du disque dur sont automatiquement non-surveillés dans Readarr",
|
||||
"Automatic": "Automatique",
|
||||
"BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de Readarr",
|
||||
"BackupNow": "Sauvegarder maintenant",
|
||||
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées",
|
||||
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de rétention seront nettoyées automatiquement",
|
||||
"Backups": "Sauvegardes",
|
||||
"BindAddress": "Adresse d'attache",
|
||||
"BindAddress": "Adresse de liaison",
|
||||
"BindAddressHelpText": "Adresse IP valide, localhost ou '*' pour toutes les interfaces",
|
||||
"BookIsDownloading": "Le livre est en cours de téléchargement",
|
||||
"BookIsDownloadingInterp": "Le livre est en cours de téléchargement - {0}% {1}",
|
||||
@@ -52,16 +52,16 @@
|
||||
"Cancel": "Annuler",
|
||||
"CancelMessageText": "Êtes-vous sur de vouloir annuler cette tâche en attente ?",
|
||||
"CertificateValidation": "Validation du certificat",
|
||||
"CertificateValidationHelpText": "Modifier le degré de rigueur de la validation de la certification HTTPS. Ne changez rien si vous ne comprenez pas les risques.",
|
||||
"CertificateValidationHelpText": "Modifier le niveau de rigueur de la validation de la certification HTTPS. Ne pas modifier si vous ne maîtrisez pas les risques.",
|
||||
"ChangeFileDate": "Changer la date du fichier",
|
||||
"ChangeHasNotBeenSavedYet": "Les changements n'ont pas encore été sauvegardés",
|
||||
"ChmodFolder": "chmod Dossier",
|
||||
"ChmodFolderHelpText": "Nombre, appliqué durant l'import/renommage vers les dossiers et fichiers multimédias (sans exécuter les bits)",
|
||||
"ChmodFolderHelpText": "Octal, appliqué lors de l'importation/du renommage des dossiers et fichiers multimédias (sans bits d'exécution)",
|
||||
"ChmodFolderHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant Readarr est le propriétaire du fichier. Il est recommandé de vérifier les permissions du client de téléchargement.",
|
||||
"ChownGroupHelpText": "Nom du Groupe ou GID. Utiliser le GID pour les systèmes de fichier distants.",
|
||||
"ChownGroupHelpText": "Nom du groupe ou gid. Utilisez gid pour les systèmes de fichiers distants.",
|
||||
"ChownGroupHelpTextWarning": "Fonctionne uniquement si l'utilisateur exécutant Readarr est le propriétaire du fichier. Il est recommandé de vérifier que le client de téléchargement utilise le même Groupe que Readarr.",
|
||||
"Clear": "Effacer",
|
||||
"ClickToChangeQuality": "Cliquer pour changer la qualité",
|
||||
"ClickToChangeQuality": "Cliquez pour changer la qualité",
|
||||
"ClientPriority": "Priorité du client",
|
||||
"CloneIndexer": "Dupliqué l'indexeur",
|
||||
"CloneProfile": "Dupliqué le profil",
|
||||
@@ -258,7 +258,7 @@
|
||||
"PublishedDate": "Date de publication",
|
||||
"Quality": "Qualité",
|
||||
"QualityDefinitions": "Définitions qualité",
|
||||
"QualityProfile": "Profil qualité",
|
||||
"QualityProfile": "Profil de qualité",
|
||||
"QualitySettings": "Paramètres Qualité",
|
||||
"Queue": "File d'attente",
|
||||
"RSSSync": "Synchro RSS",
|
||||
@@ -634,7 +634,7 @@
|
||||
"CalibreOutputFormat": "Format de sortie de Calibre",
|
||||
"CalibreOutputProfile": "Profil de sortie de Calibre",
|
||||
"CalibrePassword": "Mot de passe de Calibre",
|
||||
"ChownGroup": "Groupe chown",
|
||||
"ChownGroup": "chown Groupe",
|
||||
"CollapseMultipleBooks": "Regrouper plusieurs livres",
|
||||
"CollapseMultipleBooksHelpText": "Regrouper les livres qui sortent le même jour",
|
||||
"ConvertToFormat": "Convertir au format",
|
||||
@@ -667,7 +667,7 @@
|
||||
"ApplicationURL": "URL de l'application",
|
||||
"ImportListExclusions": "Supprimer les exclusions de liste d'imports",
|
||||
"ChooseImportMethod": "Choisir une méthode d'importation",
|
||||
"ClickToChangeReleaseGroup": "Cliquer pour changer le groupe de publication",
|
||||
"ClickToChangeReleaseGroup": "Cliquez pour changer de groupe de diffusion",
|
||||
"HardlinkCopyFiles": "Lier/copier les fichiers",
|
||||
"MoveFiles": "Déplacer les fichiers",
|
||||
"OnApplicationUpdate": "Lors de la mise à jour de l'app",
|
||||
@@ -722,7 +722,7 @@
|
||||
"ReplaceWithSpaceDashSpace": "Remplacer par Space Dash Space",
|
||||
"DeleteRemotePathMapping": "Éditer le chemin distant",
|
||||
"DeleteRemotePathMappingMessageText": "Êtes-vous sûr de vouloir effacer ce chemin ?",
|
||||
"BlocklistReleases": "Mettre cette release sur la liste noire",
|
||||
"BlocklistReleases": "Publications de la liste de blocage",
|
||||
"DeleteConditionMessageText": "Voulez-vous vraiment supprimer la liste '{0}' ?",
|
||||
"Negated": "Inversé",
|
||||
"RemoveSelectedItem": "Supprimer l'élément sélectionné",
|
||||
@@ -744,12 +744,12 @@
|
||||
"RedownloadFailed": "Échec du téléchargement",
|
||||
"RemoveCompleted": "Supprimer les complétés",
|
||||
"RemoveFailed": "Echec de la suppression",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Comment appliquer des tags au film sélectionné",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Comment appliquer des balises aux clients de téléchargement sélectionnés",
|
||||
"ApplyChanges": "Appliquer les modifications",
|
||||
"ApplyTagsHelpTextAdd": "Ajouter : Ajouter les tags à la liste de tags existantes",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Comment appliquer des tags au film sélectionné",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Comment appliquer des balises aux listes d'importation sélectionnées",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des tags aux indexeurs sélectionnés",
|
||||
"ApplyTagsHelpTextReplace": "Remplacer : Remplace les tags par les tags renseignés (ne pas renseigner de tags pour effacer tous les tags)",
|
||||
"ApplyTagsHelpTextReplace": "Remplacer : Remplace les balises par les balises saisies (ne pas saisir de balises pour effacer toutes les balises)",
|
||||
"CountIndexersSelected": "{0} indexeur(s) sélectionné(s)",
|
||||
"DeleteSelectedDownloadClients": "Supprimer le client de téléchargement",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Voulez-vous vraiment supprimer l'indexeur '{0}' ?",
|
||||
@@ -773,7 +773,7 @@
|
||||
"RecentChanges": "Changements récents",
|
||||
"System": "Système",
|
||||
"WhatsNew": "Quoi de neuf ?",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Tous les résultats ont été dissimulés par le filtre actuellement appliqué",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Tous les résultats sont masqués par le filtre appliqué",
|
||||
"Location": "Emplacement",
|
||||
"NoResultsFound": "Aucun résultat trouvé",
|
||||
"Events": "Événements",
|
||||
@@ -790,5 +790,8 @@
|
||||
"Ui": "UI",
|
||||
"Activity": "Activité",
|
||||
"AddNew": "Ajouter un nouveau",
|
||||
"Backup": "Sauvegarde"
|
||||
"Backup": "Sauvegarde",
|
||||
"AutoAdd": "Ajout automatique",
|
||||
"AutomaticUpdatesDisabledDocker": "Les mises à jour automatiques ne sont pas directement prises en charge lors de l'utilisation du mécanisme de mise à jour de Docker. Vous devrez mettre à jour l'image du conteneur en dehors de {appName} ou utiliser un script",
|
||||
"AppUpdated": "{appName} Mise à jour"
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"DeleteReleaseProfile": "지연 프로필 삭제",
|
||||
"DeleteIndexer": "인덱서 삭제",
|
||||
"HasPendingChangesSaveChanges": "변경 사항을 저장하다",
|
||||
"History": "역사",
|
||||
"History": "내역",
|
||||
"DownloadClients": "클라이언트 다운로드",
|
||||
"Host": "주최자",
|
||||
"GoToInterp": "{0}로 이동",
|
||||
@@ -408,7 +408,7 @@
|
||||
"UnableToLoadRemotePathMappings": "원격 경로 매핑을로드 할 수 없습니다.",
|
||||
"UnableToLoadRootFolders": "루트 폴더를로드 할 수 없습니다.",
|
||||
"UnableToLoadTags": "태그를로드 할 수 없습니다.",
|
||||
"UnableToLoadTheCalendar": "캘린더를로드 할 수 없습니다.",
|
||||
"UnableToLoadTheCalendar": "달력을 불러올 수 없습니다.",
|
||||
"UnableToLoadUISettings": "UI 설정을로드 할 수 없습니다.",
|
||||
"Ungroup": "그룹 해제",
|
||||
"Unmonitored": "모니터링되지 않음",
|
||||
@@ -608,7 +608,7 @@
|
||||
"FreeSpace": "여유 공간",
|
||||
"NextExecution": "다음 실행",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "적용된 필터에 의해 모든 결과가 숨겨집니다.",
|
||||
"System": "체계",
|
||||
"System": "시스템",
|
||||
"Medium": "매질",
|
||||
"ConnectionLost": "연결이 끊어졌습니다.",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "적용된 필터에 의해 모든 결과가 숨겨집니다.",
|
||||
@@ -616,6 +616,6 @@
|
||||
"LastDuration": "lastDuration",
|
||||
"LastExecution": "마지막 실행",
|
||||
"Activity": "활동",
|
||||
"AddNew": "새로 추가",
|
||||
"AddNew": "새로 추가하기",
|
||||
"Backup": "백업"
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
"DeleteImportListMessageText": "Czy na pewno chcesz usunąć listę „{0}”?",
|
||||
"DeleteIndexer": "Usuń indeksator",
|
||||
"DeleteIndexerMessageText": "Czy na pewno chcesz usunąć indeksator „{0}”?",
|
||||
"DeleteMetadataProfileMessageText": "Czy na pewno chcesz usunąć profil metadanych '{0}'?",
|
||||
"DeleteMetadataProfileMessageText": "Czy na pewno usunąć informacje dodatkowe '{0name}'?",
|
||||
"DeleteNotification": "Usuń powiadomienie",
|
||||
"DeleteNotificationMessageText": "Czy na pewno chcesz usunąć powiadomienie „{0}”?",
|
||||
"DeleteQualityProfile": "Usuń profil jakości",
|
||||
|
||||
@@ -140,18 +140,18 @@
|
||||
"SearchAll": "Pesquisar todos",
|
||||
"Source": "Origem",
|
||||
"AddListExclusion": "Adicionar exclusão de lista",
|
||||
"AddingTag": "A adicionar etiqueta",
|
||||
"AgeWhenGrabbed": "Tempo de vida (quando capturado)",
|
||||
"AddingTag": "Adicionando etiqueta",
|
||||
"AgeWhenGrabbed": "Idade (quando capturada)",
|
||||
"AlreadyInYourLibrary": "Já está na sua biblioteca",
|
||||
"AlternateTitles": "Título alternativo",
|
||||
"Analytics": "Análises",
|
||||
"AlternateTitles": "Títulos Alternativos",
|
||||
"Analytics": "Análise",
|
||||
"AnalyticsEnabledHelpText": "Envia informações anônimas de uso e de erros aos servidores do Readarr. Isso inclui informações sobre seu browser, páginas utilizadas na WebUI do Readarr, relatórios de erros, bem como as versões do sistema operativo e da aplicação. Utilizaremos essas informações para priorizar funcionalidades e correções de bugs.",
|
||||
"AppDataDirectory": "Pasta AppData",
|
||||
"AppDataDirectory": "Diretório AppData",
|
||||
"ApplyTags": "Aplicar etiquetas",
|
||||
"Authentication": "Autenticação",
|
||||
"AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao Readarr",
|
||||
"AuthorClickToChangeBook": "Clique para mudar o livro",
|
||||
"AutoRedownloadFailedHelpText": "Pesquisar e tentar transferir automaticamente uma versão diferente",
|
||||
"AutoRedownloadFailedHelpText": "Procurar automaticamente e tente baixar uma versão diferente",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Livros eliminados do disco deixam automaticamente de ser monitorados no Readarr",
|
||||
"Automatic": "Automático",
|
||||
"BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do Readarr",
|
||||
@@ -690,7 +690,7 @@
|
||||
"IndexerJackettAll": "Indexadores que usam o ponto de extremidade não suportado do Jackett 'all (tudo)' : {0}",
|
||||
"Duration": "Duração",
|
||||
"Filters": "Filtros",
|
||||
"AppDataLocationHealthCheckMessage": "Não foi possivél actualizar para prevenir apagar a AppData durante a actualização",
|
||||
"AppDataLocationHealthCheckMessage": "Não foi possível atualizar para prevenir apagar a AppData durante a atualização",
|
||||
"FileWasDeletedByViaUI": "O ficheiro foi eliminado por meio da IU",
|
||||
"SizeLimit": "Tamanho Limite",
|
||||
"Started": "Começado",
|
||||
@@ -781,7 +781,7 @@
|
||||
"OnBookFileDelete": "Ao eliminar o ficheiro do filme",
|
||||
"InstanceName": "Nome da Instancia",
|
||||
"RestartRequiredHelpTextWarning": "Requer reinício para aplicar alterações",
|
||||
"AddList": "Adicionar lista",
|
||||
"AddList": "Adicionar Lista",
|
||||
"RenameFiles": "Renomear ficheiros",
|
||||
"Test": "Testar",
|
||||
"InstanceNameHelpText": "Nome da instância na aba e nome da aplicação para Syslog",
|
||||
@@ -789,7 +789,7 @@
|
||||
"AddedAuthorSettings": "Definições de Autor adicionadas",
|
||||
"ManualImportSelectEdition": "Importação manual - Seleciona o filme",
|
||||
"ApplicationUrlHelpText": "O URL desta aplicação externa, incluindo http(s)://, porta e URL base",
|
||||
"ApplicationURL": "URL da aplicação",
|
||||
"ApplicationURL": "URL do Aplicativo",
|
||||
"ChooseImportMethod": "Selecionar Modo de Importação",
|
||||
"HardlinkCopyFiles": "Realizar ligação fixa/copiar ficheiros",
|
||||
"MoveFiles": "Mover ficheiros",
|
||||
@@ -834,5 +834,16 @@
|
||||
"ReplaceWithDash": "Substituir por travessão",
|
||||
"ReplaceWithSpaceDash": "Substituir por espaço e travessão",
|
||||
"ReplaceWithSpaceDashSpace": "Substituir por espaço, travessão e espaço",
|
||||
"ApiKeyValidationHealthCheckMessage": "Por favor, actualize a sua API Key para ter no minimo {0} caracteres. Pode fazer através das definições ou do ficheiro de configuração"
|
||||
"ApiKeyValidationHealthCheckMessage": "Por favor, atualize a sua API Key para ter no mínimo {0} caracteres. Pode fazer através das definições ou do ficheiro de configuração",
|
||||
"AppUpdated": "{appName} Atualizado",
|
||||
"ApplyTagsHelpTextAdd": "Adicionar: agregar as etiquetas à lista existente de etiquetas",
|
||||
"ApplyTagsHelpTextRemove": "Remover: eliminar as etiquetas adicionadas",
|
||||
"ApplyTagsHelpTextReplace": "Substituir: mudar as etiquetas pelas adicionadas (deixe em branco para limpar todas as etiquetas)",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar etiquetas aos indexadores selecionados",
|
||||
"AutoAdd": "Adicionar automaticamente",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "Todos os resultados foram ocultados pelo filtro aplicado",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Como aplicar etiquetas aos clientes de download selecionados",
|
||||
"Activity": "Atividade",
|
||||
"AddNew": "Adicionar Novo",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Como aplicar etiquetas às listas de importação selecionadas"
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Será usado quando pesquisas automáticas forem realizadas pela interface ou pelo Readarr",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Será usado com a pesquisa interativa",
|
||||
"TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída",
|
||||
"Tags": "Etiquetas",
|
||||
"Tags": "Tags",
|
||||
"Tasks": "Tarefas",
|
||||
"TestAll": "Testar tudo",
|
||||
"TestAllClients": "Testar todos os clientes",
|
||||
@@ -454,7 +454,7 @@
|
||||
"TrackNumber": "Número da faixa",
|
||||
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} livro(s) no total. {1} livro(s) com arquivos.",
|
||||
"TheBooksFilesWillBeDeleted": "Os arquivos do livro serão excluídos.",
|
||||
"TagsHelpText": "Aplica-se a autores com pelo menos uma etiqueta correspondente. Deixe em branco para aplicar a todos os autores",
|
||||
"TagsHelpText": "Aplica-se a autores com pelo menos uma tag correspondente. Deixe em branco para aplicar a todos os autores",
|
||||
"StatusEndedDeceased": "Falecido",
|
||||
"StatusEndedContinuing": "Continuação",
|
||||
"SslCertPasswordHelpTextWarning": "Requer reinício para ter efeito",
|
||||
@@ -488,7 +488,7 @@
|
||||
"RescanAfterRefreshHelpText": "Verificar novamente a pasta de autor após atualizar o autor",
|
||||
"ReplaceIllegalCharactersHelpText": "Substituir caracteres ilegais. Se desmarcada, o Readarr irá removê-los",
|
||||
"RenameBooks": "Renomear livros",
|
||||
"ReleaseProfiles": "Perfis de Lançamento",
|
||||
"ReleaseProfiles": "Perfis de Lançamentos",
|
||||
"RefreshInformation": "Atualizar informações",
|
||||
"RefreshAuthor": "Atualizar autor",
|
||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "O Readarr oferece suporte a várias listas para importar livros e autores para o banco de dados.",
|
||||
@@ -829,7 +829,7 @@
|
||||
"UISettingsSummary": "Opções de calendário, data e cores prejudicadas",
|
||||
"UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.",
|
||||
"TagsSettingsSummary": "Gerenciar etiquetas de autor, perfil, restrição e notificação",
|
||||
"TagsSettingsSummary": "Gerenciar tags de autor, perfil, restrição e notificação",
|
||||
"InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog",
|
||||
"AddList": "Adicionar Lista",
|
||||
"DataExistingBooks": "Monitorar livros que você tem arquivos ou que não foram lançados ainda",
|
||||
@@ -880,7 +880,7 @@
|
||||
"DataFutureBooks": "Monitorar livros que ainda não foram lançados",
|
||||
"DeleteFormatMessageText": "Tem certeza de que deseja excluir a tag de formato '{0}'?",
|
||||
"IncludeCustomFormatWhenRenamingHelpText": "'Incluir em {Formatos Personalizados} formato de renomeação'",
|
||||
"IndexerTagsHelpText": "Use este indexador apenas para autores com pelo menos uma etiqueta correspondente. Deixe em branco para usar com todos os autores.",
|
||||
"IndexerTagsHelpText": "Use este indexador apenas para autores com pelo menos uma tag correspondente. Deixe em branco para usar com todos os autores.",
|
||||
"MinFormatScoreHelpText": "Pontuação mínima de formato personalizado permitida para download",
|
||||
"RecycleBinUnableToWriteHealthCheck": "Não é possível gravar na pasta da lixeira configurada: {0}. Certifique-se de que este caminho exista e seja gravável pelo usuário executando o Readarr",
|
||||
"Clone": "Clonar",
|
||||
@@ -955,18 +955,18 @@
|
||||
"RemoveFailedDownloads": "Remover downloads com falha",
|
||||
"RemoveDownloadsAlert": "As configurações de remoção foram movidas para as configurações individuais do cliente de download na tabela acima.",
|
||||
"RemoveFailed": "Falha na remoção",
|
||||
"SetTags": "Definir etiquetas",
|
||||
"SetTags": "Definir tags",
|
||||
"Yes": "Sim",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Como aplicar etiquetas aos autores selecionados",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Como aplicar tags aos autores selecionados",
|
||||
"ManageDownloadClients": "Gerenciar clientes de download",
|
||||
"ManageImportLists": "Gerenciar listas de importação",
|
||||
"RemoveCompleted": "Remoção Concluída",
|
||||
"AutoAdd": "Adicionar automaticamente",
|
||||
"AutomaticAdd": "Adição Automática",
|
||||
"ApplyChanges": "Aplicar Mudanças",
|
||||
"ApplyTagsHelpTextAdd": "Adicionar: adicione as etiquetas à lista existente de etiquetas",
|
||||
"ApplyTagsHelpTextRemove": "Remover: remove as etiquetas inseridas",
|
||||
"ApplyTagsHelpTextReplace": "Substituir: Substitua as etiquetas pelas etiquetas inseridas (não digite nenhuma etiqueta para limpar todas as etiquetas)",
|
||||
"ApplyTagsHelpTextAdd": "Adicionar: adicione as tags à lista existente de tags",
|
||||
"ApplyTagsHelpTextRemove": "Remover: Remove as tags inseridas",
|
||||
"ApplyTagsHelpTextReplace": "Substituir: Substitua as tags pelas tags inseridas (não digite nenhuma tag para limpar todas as tags)",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Como aplicar tags aos clientes de download selecionados",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Como aplicar tags às listas de importação selecionadas",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar tags aos indexadores selecionados",
|
||||
@@ -977,11 +977,11 @@
|
||||
"DeleteSelectedImportLists": "Excluir lista(s) de importação",
|
||||
"DeleteSelectedImportListsMessageText": "Tem certeza de que deseja excluir {count} lista(s) de importação selecionada(s)?",
|
||||
"DeleteSelectedIndexers": "Excluir indexador(es)",
|
||||
"DownloadClientTagHelpText": "Use este cliente de download apenas para autores com pelo menos uma etiqueta correspondente. Deixe em branco para usar com todos os autores.",
|
||||
"ExistingTag": "Etiqueta existente",
|
||||
"DownloadClientTagHelpText": "Use este cliente de download apenas para autores com pelo menos uma tag correspondente. Deixe em branco para usar com todos os autores.",
|
||||
"ExistingTag": "Tag existente",
|
||||
"No": "Não",
|
||||
"RemoveCompletedDownloads": "Remover downloads concluídos",
|
||||
"RemovingTag": "Removendo etiqueta",
|
||||
"RemovingTag": "Removendo tag",
|
||||
"SkipRedownloadHelpText": "Impede Readarr de tentar baixar versões alternativas para os itens removidos",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.",
|
||||
"Activity": "Atividade",
|
||||
@@ -1011,9 +1011,9 @@
|
||||
"AutomaticUpdatesDisabledDocker": "As atualizações automáticas não têm suporte direto ao usar o mecanismo de atualização do Docker. Você precisará atualizar a imagem do contêiner fora de {appName} ou usar um script",
|
||||
"WouldYouLikeToRestoreBackup": "Gostaria de restaurar o backup '{name}'?",
|
||||
"AppUpdated": "{appName} Atualizado",
|
||||
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}",
|
||||
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`. Para obter as alterações mais recentes, você precisará recarregar {appName}",
|
||||
"ConnectionLost": "Conexão Perdida",
|
||||
"ConnectionLostToBackend": "{appName} perdeu sua conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
"ConnectionLostToBackend": "{appName} perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
"CountAuthorsSelected": "{selectedCount} autor(es) selecionado(s)",
|
||||
"RecentChanges": "Mudanças Recentes",
|
||||
"WhatsNew": "O que há de novo?",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"PortNumber": "端口号",
|
||||
"PosterSize": "海报尺寸",
|
||||
"AddingTag": "添加标签",
|
||||
"AgeWhenGrabbed": "发布时长",
|
||||
"AgeWhenGrabbed": "年龄(在被抓取后)",
|
||||
"AlreadyInYourLibrary": "已经在你的库中",
|
||||
"AlternateTitles": "备选标题",
|
||||
"Analytics": "分析",
|
||||
@@ -51,12 +51,12 @@
|
||||
"CompletedDownloadHandling": "完成下载处理",
|
||||
"ConnectSettings": "连接设置",
|
||||
"Connections": "连接",
|
||||
"CopyUsingHardlinksHelpText": "拷贝文件时torrents文件还在做种中则使用硬链接",
|
||||
"CopyUsingHardlinksHelpText": "硬链接允许Readarr导入播放种子到剧集文件夹,而无需占用额外的磁盘空间或复制文件的整个内容。只有当源和目标在同一卷上时,硬链接才会起作用",
|
||||
"CopyUsingHardlinksHelpTextWarning": "有时候,文件锁可能会阻止对正在做种的文件进行重命名。您可以暂时禁用做种功能,并使用Radarr的重命名功能作为解决方案。",
|
||||
"CreateEmptyAuthorFoldersHelpText": "硬盘扫描过程中创建缺失的电影目录",
|
||||
"CreateGroup": "创建组",
|
||||
"CutoffHelpText": "一旦质量满足则Radarr不会再下载影片",
|
||||
"CutoffUnmet": "终止未满足",
|
||||
"CutoffUnmet": "未达截止条件",
|
||||
"DBMigration": "数据库迁移版本",
|
||||
"Dates": "日期",
|
||||
"DelayProfile": "延时配置",
|
||||
@@ -64,7 +64,7 @@
|
||||
"DelayingDownloadUntilInterp": "延时下载直到 {1} 在 {0} 之前 Delaying download until {0} at {1}",
|
||||
"Delete": "删除",
|
||||
"DeleteBackup": "删除备份",
|
||||
"DeleteBackupMessageText": "您确定要删除备份 '{0}' 吗?",
|
||||
"DeleteBackupMessageText": "您确定要删除备份“{name}”吗?",
|
||||
"DeleteDelayProfile": "删除延迟配置",
|
||||
"DeleteDelayProfileMessageText": "你确定要删除此延迟配置吗?",
|
||||
"DeleteDownloadClient": "删除下载客户端",
|
||||
@@ -76,7 +76,7 @@
|
||||
"DeleteImportListMessageText": "您确定要删除列表 “{name}” 吗?",
|
||||
"DeleteIndexer": "删除索引器",
|
||||
"DeleteIndexerMessageText": "您确定要删除索引器 “{name}” 吗?",
|
||||
"DeleteMetadataProfileMessageText": "确定要删除元数据配置吗‘{0}’?",
|
||||
"DeleteMetadataProfileMessageText": "您确定要删除元数据配置文件“{name}”吗?",
|
||||
"DeleteNotification": "删除消息推送",
|
||||
"DeleteNotificationMessageText": "您确定要删除消息推送 “{name}” 吗?",
|
||||
"DeleteQualityProfile": "删除质量配置",
|
||||
@@ -145,7 +145,7 @@
|
||||
"ICalFeed": "iCal订阅地址",
|
||||
"ICalHttpUrlHelpText": "将此URL复制到您的客户端,如果您的浏览器支持webcal,请直接点击右侧订阅按钮",
|
||||
"ICalLink": "iCal链接",
|
||||
"IconForCutoffUnmet": "未满足停止监控的图标",
|
||||
"IconForCutoffUnmet": "未达截止条件的图标",
|
||||
"IconTooltip": "计划中",
|
||||
"IgnoredAddresses": "已忽略地址",
|
||||
"IgnoredHelpText": "如版本包含一个或多个条件则丢弃(无视大小写)",
|
||||
@@ -161,7 +161,7 @@
|
||||
"IncludeUnmonitored": "包含未监控的",
|
||||
"Indexer": "索引器",
|
||||
"IndexerPriority": "索引器优先级",
|
||||
"IndexerSettings": "搜刮器设置",
|
||||
"IndexerSettings": "索引器设置",
|
||||
"Indexers": "索引器",
|
||||
"Interval": "间隔",
|
||||
"IsCutoffCutoff": "截止",
|
||||
@@ -204,11 +204,11 @@
|
||||
"NamingSettings": "命名设置",
|
||||
"New": "新的",
|
||||
"NoBackupsAreAvailable": "无备份可用",
|
||||
"NoHistory": "无历史记录",
|
||||
"NoHistory": "无历史记录。",
|
||||
"NoLeaveIt": "不,就这样",
|
||||
"NoLimitForAnyRuntime": "不限制任何歌曲时长",
|
||||
"NoLimitForAnyRuntime": "不限制任何运行环境",
|
||||
"NoLogFiles": "没有日志文件",
|
||||
"NoMinimumForAnyRuntime": "歌曲时间没有最小限制",
|
||||
"NoMinimumForAnyRuntime": "运行环境没有最小限制",
|
||||
"NoUpdatesAreAvailable": "无可用更新",
|
||||
"None": "无",
|
||||
"NotificationTriggers": "通知触发器",
|
||||
@@ -216,7 +216,7 @@
|
||||
"OnHealthIssueHelpText": "健康度异常",
|
||||
"OnRenameHelpText": "重命名中",
|
||||
"OnUpgradeHelpText": "升级中",
|
||||
"OpenBrowserOnStart": "打开浏览器时启动",
|
||||
"OpenBrowserOnStart": "启动时打开浏览器",
|
||||
"Options": "选项",
|
||||
"Original": "原始的",
|
||||
"Overview": "概述",
|
||||
@@ -251,7 +251,7 @@
|
||||
"ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Radarr支持任何使用Newznab标准的搜刮器,以及下面列出的其他搜刮器。",
|
||||
"ReadarrTags": "Radarr标签",
|
||||
"Real": "真的",
|
||||
"Reason": "季",
|
||||
"Reason": "原因",
|
||||
"RecycleBinCleanupDaysHelpText": "设置为0关闭自动清理",
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "回收站中的文件在超出选择的天数后会被自动清理",
|
||||
"RecycleBinHelpText": "影片文件会被移动到回收站以替代永久删除",
|
||||
@@ -276,11 +276,11 @@
|
||||
"RemoveSelected": "移除已选",
|
||||
"RemoveTagExistingTag": "已有标签",
|
||||
"RemoveTagRemovingTag": "移除标签",
|
||||
"RemovedFromTaskQueue": "从任务队列中移除",
|
||||
"RemovedFromTaskQueue": "从任务队列中删除",
|
||||
"RenameBooksHelpText": "如果重命名未启用,Radarr会使用现有文件名",
|
||||
"Reorder": "重新排序Reorder",
|
||||
"ReplaceIllegalCharacters": "替换非法字符",
|
||||
"RequiredHelpText": "发布的歌曲必须至少包含一个这些项目(不区分大小写)",
|
||||
"RequiredHelpText": "这个{0}条件必须匹配自定义格式才能应用。否则,一个{0}匹配就足够了。",
|
||||
"RequiredPlaceHolder": "添加新限制",
|
||||
"RescanAfterRefreshHelpTextWarning": "当没有设置为“总是”时,Radarr将不会自动检测文件的更改",
|
||||
"RescanAuthorFolderAfterRefresh": "刷新后重新扫描作者文件夹",
|
||||
@@ -298,7 +298,7 @@
|
||||
"RetryingDownloadInterp": "尝试重新下载“{0}”在“{1}”",
|
||||
"RootFolder": "根目录",
|
||||
"RootFolders": "根目录",
|
||||
"RssSyncIntervalHelpText": "间隔时间以分钟为单位,设置为0则关闭该功能(会停止所有歌曲的自动抓取下载)",
|
||||
"RssSyncIntervalHelpText": "间隔时间以分钟为单位,设置为0则关闭该功能(会停止所有剧集的自动抓取下载)",
|
||||
"SSLCertPassword": "SSL证书密码",
|
||||
"SSLCertPath": "SSL证书路径",
|
||||
"SSLPort": "SSL端口",
|
||||
@@ -317,7 +317,7 @@
|
||||
"ShortDateFormat": "短日期格式",
|
||||
"ShowCutoffUnmetIconHelpText": "终止监控条件未满足前为文件显示图标",
|
||||
"ShowDateAdded": "显示添加日期",
|
||||
"ShowMonitored": "显示监控中的歌曲",
|
||||
"ShowMonitored": "显示监控中的",
|
||||
"ShowMonitoredHelpText": "在海报下显示监控状态",
|
||||
"ShowPath": "显示路径",
|
||||
"ShowQualityProfile": "显示媒体质量配置",
|
||||
@@ -333,7 +333,7 @@
|
||||
"SkipFreeSpaceCheckWhenImportingHelpText": "当 Readarr 无法从您的作者根文件夹中检测到空闲空间时使用",
|
||||
"SorryThatAuthorCannotBeFound": "对不起,未找到影片。",
|
||||
"SorryThatBookCannotBeFound": "对不起,未找到影片。",
|
||||
"Source": "源",
|
||||
"Source": "来源",
|
||||
"SourcePath": "来源路径",
|
||||
"SslCertPasswordHelpText": "pfx文件密码",
|
||||
"SslCertPasswordHelpTextWarning": "重启生效",
|
||||
@@ -355,13 +355,13 @@
|
||||
"Tasks": "任务",
|
||||
"TestAll": "测试全部",
|
||||
"TestAllClients": "测试全部客户端",
|
||||
"TestAllIndexers": "测试全部搜刮器",
|
||||
"TestAllIndexers": "测试全部索引器",
|
||||
"TestAllLists": "测试全部列表",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "这将适用于所有搜刮器,请遵循他们所制定的规则",
|
||||
"TimeFormat": "时间格式",
|
||||
"Title": "标题",
|
||||
"TorrentDelay": "Torrent延时",
|
||||
"TorrentDelayHelpText": "延迟几分钟等待获取洪流",
|
||||
"TorrentDelayHelpText": "延迟几分钟等待获取torrent",
|
||||
"Torrents": "种子",
|
||||
"TotalFileSize": "总文件体积",
|
||||
"UILanguage": "UI界面语言",
|
||||
@@ -383,7 +383,7 @@
|
||||
"UnableToLoadDownloadClientOptions": "无法加载下载客户端选项",
|
||||
"UnableToLoadDownloadClients": "无法加载下载客户端",
|
||||
"UnableToLoadGeneralSettings": "无法加载通用设置",
|
||||
"UnableToLoadHistory": "无法加载历史记录",
|
||||
"UnableToLoadHistory": "无法加载历史记录。",
|
||||
"UnableToLoadImportListExclusions": "无法加载排除列表",
|
||||
"UnableToLoadIndexerOptions": "无法加载搜刮器选项",
|
||||
"UnableToLoadIndexers": "无法加载搜刮器",
|
||||
@@ -405,7 +405,7 @@
|
||||
"UnmonitoredHelpText": "在iCal订阅中包含未监控的电影",
|
||||
"UpdateAll": "全部更新",
|
||||
"UpdateAutomaticallyHelpText": "自动下载并安装更新。你还可以在“系统:更新”中安装",
|
||||
"UpdateMechanismHelpText": "使用 Radarr 的内置更新程序或脚本",
|
||||
"UpdateMechanismHelpText": "使用Readarr内置的更新程序或脚本",
|
||||
"UpdateScriptPathHelpText": "自定义脚本的路径,该脚本处理获取的更新包并处理更新过程的其余部分",
|
||||
"Updates": "更新",
|
||||
"UpgradeAllowedHelpText": "如关闭,则质量不做升级",
|
||||
@@ -435,13 +435,13 @@
|
||||
"SslPortHelpTextWarning": "重启生效",
|
||||
"SslCertPathHelpTextWarning": "重启生效",
|
||||
"ProxyUsernameHelpText": "如果需要,您只需要输入用户名和密码。否则就让它们为空。",
|
||||
"MaintenanceRelease": "维护版本:修复错误及其他改进,参见Github提交 查看更多详情",
|
||||
"MaintenanceRelease": "维护发布:bug修复和其他改进。更多细节请参见Github提交历史",
|
||||
"DeleteBookFileMessageText": "您确认您想删除吗?",
|
||||
"ApiKeyHelpTextWarning": "需重启以生效",
|
||||
"Actions": "动作",
|
||||
"AddMissing": "添加丢失项",
|
||||
"AddNewItem": "添加新项目",
|
||||
"DeleteRootFolderMessageText": "您确定要删除索引 '{0}'吗?",
|
||||
"DeleteRootFolderMessageText": "您确定要删除根文件夹“{name}”吗?",
|
||||
"Progress": "进度",
|
||||
"Publisher": "发布者",
|
||||
"Series": "节目",
|
||||
@@ -454,7 +454,7 @@
|
||||
"NotAvailable": "不可用",
|
||||
"NotMonitored": "未监控的",
|
||||
"OutputPath": "输出路径",
|
||||
"ReleaseTitle": "发布标题",
|
||||
"ReleaseTitle": "发行版标题",
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "电影目录 '{0}' 及所有内容都会被删除。",
|
||||
"Today": "今天",
|
||||
"Tomorrow": "明天",
|
||||
@@ -509,7 +509,7 @@
|
||||
"IndexerRssHealthCheckNoIndexers": "没有任何索引器开启了RSS同步,Radarr不会自动抓取新发布的影片",
|
||||
"IndexerSearchCheckNoAutomaticMessage": "没有索引器开启自动搜索,Radarr不会提供任何自动搜索结果",
|
||||
"IndexerSearchCheckNoAvailableIndexersMessage": "由于最近的索引器错误,所有支持搜索的索引器暂时不可用",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "没有任何索引器开启了手动搜索,Radarr 不会提供任何手动搜索结果",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "没有启用交互式搜索的索引器,Readarr将不提供任何交互式搜索结果",
|
||||
"IndexersSettingsSummary": "搜刮器和发布版本限制",
|
||||
"IndexerStatusCheckAllClientMessage": "所有搜刮器都因错误不可用",
|
||||
"IndexerStatusCheckSingleClientMessage": "搜刮器因错误不可用:{0}",
|
||||
@@ -563,7 +563,7 @@
|
||||
"General": "通用",
|
||||
"HealthNoIssues": "您的设置没有问题",
|
||||
"ImportListStatusCheckSingleClientMessage": "列表因错误不可用:{0}",
|
||||
"IndexerPriorityHelpText": "索引器优先级从1(最高)到50(最低),默认25。当资源连接中断时寻找同等资源时使用,否则Radarr将依旧使用已启用的索引器进行RSS同步并搜索",
|
||||
"IndexerPriorityHelpText": "索引器优先级从1(最高)到50(最低)。默认值:25。在抓取版本时,Readarr将使用所有启用的索引器进行RSS同步和搜索。",
|
||||
"Lists": "列表",
|
||||
"MediaManagement": "媒体管理",
|
||||
"Metadata": "元数据",
|
||||
@@ -588,7 +588,7 @@
|
||||
"BackupIntervalHelpText": "备份 Lidarr 数据库和设置的时间间隔",
|
||||
"MetadataProfile": "元数据配置",
|
||||
"MetadataProfiles": "元数据配置",
|
||||
"InstanceName": "中文",
|
||||
"InstanceName": "应用名称",
|
||||
"InstanceNameHelpText": "选项卡及日志应用名称",
|
||||
"AddList": "添加列表",
|
||||
"BookList": "书籍清单",
|
||||
@@ -736,10 +736,10 @@
|
||||
"RefreshAuthor": "刷新作者",
|
||||
"RefreshBook": "刷新书籍",
|
||||
"RefreshInformation": "刷新信息",
|
||||
"ReleaseProfiles": "刷新配置文件",
|
||||
"ReleaseProfiles": "发行版概要",
|
||||
"RenameBooks": "重命名书籍",
|
||||
"RenameFiles": "重命名文件",
|
||||
"RestartRequiredHelpTextWarning": "需要重新启动才能生效",
|
||||
"RestartRequiredHelpTextWarning": "需重启以生效",
|
||||
"SearchForAllMissingBooks": "搜索所有丢失的书籍",
|
||||
"SendMetadataToCalibre": "发送元数据至Calibre",
|
||||
"SeriesNumber": "系列编号",
|
||||
@@ -780,7 +780,7 @@
|
||||
"ChownGroup": "修改组权限",
|
||||
"ContinuingAllBooksDownloaded": "仍在继续(所有书籍已下载)",
|
||||
"EnableProfile": "启用配置文件",
|
||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "如果您不添加导入列表例外,并且作者元数据配置不是“无”,那这本书可能会在下次作者刷新是重新添加",
|
||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "如果您不添加导入列表排除,并且作者有除“无”之外的元数据配置文件,那么这本书可能会在下一次作者刷新期间重新添加。",
|
||||
"IndexerIdHelpTextWarning": "使用带有首字母的特定索引器可能会导致复制版本被抓取",
|
||||
"MassBookSearchWarning": "您确定要对{0}本书进行批量书籍搜索吗?",
|
||||
"MediaManagementSettingsSummary": "命名,文件管理和根文件夹设置",
|
||||
@@ -831,7 +831,7 @@
|
||||
"IsShowingMonitoredUnmonitorSelected": "未监控选中的",
|
||||
"ItsEasyToAddANewAuthorOrBookJustStartTypingTheNameOfTheItemYouWantToAdd": "添加新作者或书籍很容易,只需开始输入要添加的条目的名称",
|
||||
"LatestBook": "最新书籍",
|
||||
"LibraryHelpText": "Calibre内容服务器库名 默认留空",
|
||||
"LibraryHelpText": "校准内容服务器库名称。默认为空。",
|
||||
"ListsSettingsSummary": "导入列表",
|
||||
"AddImportListExclusionHelpText": "通过导入列表或作者刷新 防止书籍添加到Readarr",
|
||||
"ManualDownload": "手动下载",
|
||||
@@ -865,7 +865,7 @@
|
||||
"OnApplicationUpdateHelpText": "程序更新时",
|
||||
"ChooseImportMethod": "选择导入模式",
|
||||
"HardlinkCopyFiles": "硬链接/复制文件",
|
||||
"ThemeHelpText": "更改程序界面主题,“自动”主题将根据您的操作系统主题来设置浅色或深色模式。灵感来自Theme.Park",
|
||||
"ThemeHelpText": "改变应用界面主题,选择“自动”主题会通过操作系统主题来自适应白天黑夜模式。(受Theme.Park启发)",
|
||||
"Theme": "主题",
|
||||
"EnableRssHelpText": "当Radarr定期通过RSS同步查找发布时使用",
|
||||
"BypassIfAboveCustomFormatScore": "若高于自定义格式分数则绕过",
|
||||
@@ -878,8 +878,8 @@
|
||||
"CustomFormats": "自定义命名格式",
|
||||
"CutoffFormatScoreHelpText": "一旦自定义格式分数满足则Radarr不会再下载影片",
|
||||
"DeleteCustomFormat": "删除自定义命名格式",
|
||||
"DeleteCustomFormatMessageText": "是否确实要删除条件“{0}”?",
|
||||
"DeleteFormatMessageText": "你确定要删除格式标签 “{0}” 吗?",
|
||||
"DeleteCustomFormatMessageText": "您确定要删除自定义格式“{name}”吗?",
|
||||
"DeleteFormatMessageText": "您确定要删除格式标签 '{0}' 吗?",
|
||||
"Formats": "格式",
|
||||
"ImportListMissingRoot": "在导入列表中缺少根目录文件夹",
|
||||
"ImportListMultipleMissingRoots": "导入列表中缺失多个根目录文件夹",
|
||||
@@ -911,9 +911,9 @@
|
||||
"ListWillRefreshEveryInterp": "列表将每 {0} 刷新一次",
|
||||
"ShowAdvanced": "显示高级",
|
||||
"ShownClickToHide": "显示,点击隐藏",
|
||||
"RemoveSelectedItemQueueMessageText": "您确定要从队列中删除 1 项吗?",
|
||||
"RemoveSelectedItemQueueMessageText": "您确定要从队列中删除一个项目吗?",
|
||||
"RemoveSelectedItemBlocklistMessageText": "您确定要从阻止列表中删除所选项目吗?",
|
||||
"RemoveSelectedItemsQueueMessageText": "您确定要从队列中删除 {0} 个项目吗?",
|
||||
"RemoveSelectedItemsQueueMessageText": "您确定要从队列中删除{0}个项目吗?",
|
||||
"ResetQualityDefinitionsMessageText": "您确定要重置质量定义吗?",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "如何将标签应用到已选择的下载客户端",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "如何将标签应用到已选择的导入列表",
|
||||
@@ -946,13 +946,77 @@
|
||||
"AppUpdated": "{appName} 升级",
|
||||
"ConnectionLost": "连接丢失",
|
||||
"ConnectionLostReconnect": "{appName} 将会尝试自动连接,您也可以点击下方的重新加载。",
|
||||
"ConnectionLostToBackend": "{appName} 与后端的链接已断开,需要重新加载恢复功能。",
|
||||
"DeleteRemotePathMapping": "删除远程映射路径",
|
||||
"ConnectionLostToBackend": "{appName}失去了与后端的连接,需要重新加载以恢复功能。",
|
||||
"DeleteRemotePathMapping": "删除远程路径映射",
|
||||
"AutomaticUpdatesDisabledDocker": "不支持在使用 Docker 容器时直接升级。你需要升级 {appName} 容器镜像或使用脚本(script)",
|
||||
"ColonReplacement": "替换冒号",
|
||||
"Clone": "复制",
|
||||
"ErrorLoadingContent": "加载此内容时出错",
|
||||
"ReplaceWithSpaceDash": "替换为空格破折号",
|
||||
"ReplaceWithDash": "替换为破折号",
|
||||
"ReplaceWithSpaceDashSpace": "替换为空格破折号空格"
|
||||
"ReplaceWithSpaceDashSpace": "替换为空格破折号空格",
|
||||
"Large": "大",
|
||||
"IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{0}。",
|
||||
"RecentChanges": "最近修改",
|
||||
"RedownloadFailed": "重新下载失败",
|
||||
"SomeResultsAreHiddenByTheAppliedFilter": "部分结果已被过滤隐藏",
|
||||
"NoResultsFound": "无结果",
|
||||
"NotificationStatusAllClientHealthCheckMessage": "由于故障,所有通知都不可用",
|
||||
"NotificationStatusSingleClientHealthCheckMessage": "由于失败导致通知不可用:{0}",
|
||||
"Medium": "中",
|
||||
"RemoveDownloadsAlert": "移除设置被移至上表中的单个下载客户端设置。",
|
||||
"Small": "小",
|
||||
"Ui": "UI",
|
||||
"SmartReplace": "智能替换",
|
||||
"WhatsNew": "什么是新的?",
|
||||
"BlocklistReleaseHelpText": "防止 Readarr 再次自动抓取这些文件",
|
||||
"AppUpdatedVersion": "{appName}已更新为版本` {version}`,为了获得最新的更改,您需要重新加载{appName}",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "当抓取发布版本的分数高于配置的最低自定义格式分数时跳过延时",
|
||||
"CountAuthorsSelected": "已选择{selectedCount}个作者",
|
||||
"CountDownloadClientsSelected": "{selectedCount}下载客户端已选中",
|
||||
"CountImportListsSelected": "{selectedCount}导入列表已选中",
|
||||
"DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?",
|
||||
"FreeSpace": "剩余空间",
|
||||
"Implementation": "执行",
|
||||
"LastDuration": "上一次用时",
|
||||
"NextExecution": "下一次执行",
|
||||
"System": "系统",
|
||||
"WouldYouLikeToRestoreBackup": "是否要还原备份“{name}”?",
|
||||
"NoImportListsFound": "未找到导入列表",
|
||||
"NoIndexersFound": "未找到索引器",
|
||||
"NoMissingItems": "没有缺失的项目",
|
||||
"SkipRedownloadHelpText": "阻止 Readarr 尝试下载已删除项目的替代版本",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "如何将标签应用到选定的作者",
|
||||
"AutomaticAdd": "自动添加",
|
||||
"BypassIfHighestQualityHelpText": "当发布版本在质量配置文件中具有最高启用质量时,跳过延迟",
|
||||
"DeleteSelectedImportListsMessageText": "您确定要删除选定的{count}导入列表吗?",
|
||||
"MinimumCustomFormatScoreHelpText": "跳过首选协议延迟所需的最低自定义格式分数",
|
||||
"NoDownloadClientsFound": "找不到下载客户端",
|
||||
"NoCutoffUnmetItems": "没有未满足的截止项目",
|
||||
"RemoveCompletedDownloads": "删除已完成的下载",
|
||||
"RemoveFailedDownloads": "删除失败的下载",
|
||||
"TotalSpace": "总空间",
|
||||
"DashOrSpaceDashDependingOnName": "破折号或空格破折号取决于名字",
|
||||
"CountIndexersSelected": "{selectedCount}索引器已选中",
|
||||
"DeleteConditionMessageText": "您确定要删除条件“{name}”吗?",
|
||||
"DeleteFormat": "删除格式",
|
||||
"DownloadClientTagHelpText": "仅对具有至少一个匹配标签的作者使用此下载客户端。留空以供所有作者使用。",
|
||||
"DeleteSelectedIndexersMessageText": "您确定要删除{count}选定的索引器吗?",
|
||||
"Events": "事件",
|
||||
"Location": "位置",
|
||||
"ManageLists": "管理列表",
|
||||
"ManageClients": "管理客户端",
|
||||
"ManageIndexers": "管理索引器",
|
||||
"ManageImportLists": "管理导入列表",
|
||||
"ManageDownloadClients": "管理下载客户端",
|
||||
"RemotePathMappingsInfo": "很少需要远程路径映射,如果{app}和你的下载客户端在同一个系统上,最好匹配你的路径。有关更多信息,请参阅[wiki]({wikiink})。",
|
||||
"Bookshelf": "书架",
|
||||
"ApplyChanges": "应用更改",
|
||||
"Activity": "活动",
|
||||
"Backup": "备份",
|
||||
"AddNew": "添加新的",
|
||||
"AllResultsAreHiddenByTheAppliedFilter": "根据过滤条件所有结果已隐藏",
|
||||
"LastWriteTime": "最后写入时间",
|
||||
"LastExecution": "上一次执行",
|
||||
"Library": "库"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Net.Http;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Notifications.Webhook;
|
||||
@@ -14,10 +15,12 @@ namespace NzbDrone.Core.Notifications.Notifiarr
|
||||
{
|
||||
private const string URL = "https://notifiarr.com";
|
||||
private readonly IHttpClient _httpClient;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public NotifiarrProxy(IHttpClient httpClient)
|
||||
public NotifiarrProxy(IHttpClient httpClient, Logger logger)
|
||||
{
|
||||
_httpClient = httpClient;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void SendNotification(WebhookPayload payload, NotifiarrSettings settings)
|
||||
@@ -47,12 +50,17 @@ namespace NzbDrone.Core.Notifications.Notifiarr
|
||||
switch ((int)responseCode)
|
||||
{
|
||||
case 401:
|
||||
_logger.Error("HTTP 401 - API key is invalid");
|
||||
throw new NotifiarrException("API key is invalid");
|
||||
case 400:
|
||||
throw new NotifiarrException("Unable to send notification. Ensure Readarr Integration is enabled & assigned a channel on Notifiarr");
|
||||
// 400 responses shouldn't be treated as an actual error because it's a misconfiguration
|
||||
// between Readarr and Notifiarr for a specific event, but shouldn't stop all events.
|
||||
_logger.Error("HTTP 400 - Unable to send notification. Ensure Readarr Integration is enabled & assigned a channel on Notifiarr");
|
||||
break;
|
||||
case 502:
|
||||
case 503:
|
||||
case 504:
|
||||
_logger.Error("Unable to send notification. Service Unavailable");
|
||||
throw new NotifiarrException("Unable to send notification. Service Unavailable", ex);
|
||||
case 520:
|
||||
case 521:
|
||||
@@ -61,6 +69,7 @@ namespace NzbDrone.Core.Notifications.Notifiarr
|
||||
case 524:
|
||||
throw new NotifiarrException("Cloudflare Related HTTP Error - Unable to send notification", ex);
|
||||
default:
|
||||
_logger.Error(ex, "Unknown HTTP Error - Unable to send notification");
|
||||
throw new NotifiarrException("Unknown HTTP Error - Unable to send notification", ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@ namespace NzbDrone.Core.Organizer
|
||||
tokenHandlers["{Author Name}"] = m => author.Name;
|
||||
tokenHandlers["{Author CleanName}"] = m => CleanTitle(author.Name);
|
||||
tokenHandlers["{Author NameThe}"] = m => TitleThe(author.Name);
|
||||
tokenHandlers["{Author SortName}"] = m => author.Metadata.Value.NameLastFirst;
|
||||
tokenHandlers["{Author SortName}"] = m => author?.Metadata?.Value?.NameLastFirst ?? string.Empty;
|
||||
tokenHandlers["{Author NameFirstCharacter}"] = m => TitleThe(author.Name).Substring(0, 1).FirstCharToUpper();
|
||||
|
||||
if (author.Metadata.Value.Disambiguation != null)
|
||||
|
||||
@@ -34,7 +34,8 @@ namespace NzbDrone.Core.Organizer
|
||||
Metadata = new AuthorMetadata
|
||||
{
|
||||
Name = "The Author Name",
|
||||
Disambiguation = "US Author"
|
||||
Disambiguation = "US Author",
|
||||
NameLastFirst = "Last name, First name"
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -31,7 +31,12 @@ namespace NzbDrone.Core.Parser
|
||||
|
||||
public static QualityModel ParseQuality(string name, string desc = null, List<int> categories = null)
|
||||
{
|
||||
Logger.Debug("Trying to parse quality for {0}", name);
|
||||
Logger.Debug("Trying to parse quality for '{0}'", name);
|
||||
|
||||
if (name.IsNullOrWhiteSpace() && desc.IsNullOrWhiteSpace())
|
||||
{
|
||||
return new QualityModel { Quality = Quality.Unknown };
|
||||
}
|
||||
|
||||
var normalizedName = name.Replace('_', ' ').Trim().ToLower();
|
||||
var result = ParseQualityModifiers(name, normalizedName);
|
||||
|
||||
@@ -15,6 +15,9 @@ namespace NzbDrone.Mono.Test.EnvironmentInfo.VersionAdapters
|
||||
[TestCase("10.8")]
|
||||
[TestCase("10.8.1")]
|
||||
[TestCase("10.11.20")]
|
||||
[TestCase("11.7.9")]
|
||||
[TestCase("12.6.8")]
|
||||
[TestCase("13.5.1")]
|
||||
public void should_get_version_info(string versionString)
|
||||
{
|
||||
var fileContent = File.ReadAllText(GetTestPath("Files/macOS/SystemVersion.plist")).Replace("10.0.0", versionString);
|
||||
|
||||
@@ -209,10 +209,12 @@ namespace NzbDrone.Mono.Disk
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"Failed to fetch drive info for mount point: {d.Name}", ex);
|
||||
_logger.Debug(ex, "Failed to fetch drive info for mount point: {0}", d.Name);
|
||||
|
||||
return null;
|
||||
}
|
||||
})
|
||||
.Where(d => d.DriveType is DriveType.Fixed or DriveType.Network or DriveType.Removable));
|
||||
.Where(d => d is { DriveType: DriveType.Fixed or DriveType.Network or DriveType.Removable }));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
@@ -10,9 +10,8 @@ namespace NzbDrone.Mono.EnvironmentInfo.VersionAdapters
|
||||
{
|
||||
private const string PLIST_DIR = "/System/Library/CoreServices/";
|
||||
|
||||
private static readonly Regex DarwinVersionRegex = new Regex("<string>(?<version>10\\.\\d{1,2}\\.?\\d{0,2}?)<\\/string>",
|
||||
RegexOptions.Compiled |
|
||||
RegexOptions.IgnoreCase);
|
||||
private static readonly Regex DarwinVersionRegex = new ("<key>ProductVersion<\\/key>\\s*<string>(?<version>1\\d\\.\\d{1,2}\\.?\\d{0,2}?)<\\/string>",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private readonly IDiskProvider _diskProvider;
|
||||
private readonly Logger _logger;
|
||||
|
||||
@@ -17,6 +17,8 @@ namespace Readarr.Api.V1.Profiles.Quality
|
||||
ruleBuilder.SetValidator(new ItemGroupIdValidator<T>());
|
||||
ruleBuilder.SetValidator(new UniqueIdValidator<T>());
|
||||
ruleBuilder.SetValidator(new UniqueQualityIdValidator<T>());
|
||||
ruleBuilder.SetValidator(new AllQualitiesValidator<T>());
|
||||
|
||||
return ruleBuilder.SetValidator(new ItemGroupNameValidator<T>());
|
||||
}
|
||||
}
|
||||
@@ -151,4 +153,46 @@ namespace Readarr.Api.V1.Profiles.Quality
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class AllQualitiesValidator<T> : PropertyValidator
|
||||
{
|
||||
protected override string GetDefaultMessageTemplate() => "Must contain all qualities";
|
||||
|
||||
protected override bool IsValid(PropertyValidatorContext context)
|
||||
{
|
||||
if (context.PropertyValue is not IList<QualityProfileQualityItemResource> items)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var qualityIds = new HashSet<int>();
|
||||
|
||||
foreach (var item in items)
|
||||
{
|
||||
if (item.Id > 0)
|
||||
{
|
||||
foreach (var quality in item.Items)
|
||||
{
|
||||
qualityIds.Add(quality.Quality.Id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
qualityIds.Add(item.Quality.Id);
|
||||
}
|
||||
}
|
||||
|
||||
var allQualityIds = NzbDrone.Core.Qualities.Quality.All;
|
||||
|
||||
foreach (var quality in allQualityIds)
|
||||
{
|
||||
if (!qualityIds.Contains(quality.Id))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ namespace Readarr.Api.V1.Profiles.Quality
|
||||
SharedValidator.RuleFor(c => c.Name).NotEmpty();
|
||||
SharedValidator.RuleFor(c => c.Cutoff).ValidCutoff();
|
||||
SharedValidator.RuleFor(c => c.Items).ValidItems();
|
||||
|
||||
SharedValidator.RuleFor(c => c.FormatItems).Must(items =>
|
||||
{
|
||||
var all = _formatService.All().Select(f => f.Id).ToList();
|
||||
@@ -31,6 +32,7 @@ namespace Readarr.Api.V1.Profiles.Quality
|
||||
|
||||
return all.Except(ids).Empty();
|
||||
}).WithMessage("All Custom Formats and no extra ones need to be present inside your Profile! Try refreshing your browser.");
|
||||
|
||||
SharedValidator.RuleFor(c => c).Custom((profile, context) =>
|
||||
{
|
||||
if (profile.FormatItems.Where(x => x.Score > 0).Sum(x => x.Score) < profile.MinFormatScore &&
|
||||
|
||||
Reference in New Issue
Block a user