Compare commits

..

14 Commits

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

Co-authored-by: Aitzol Garmendia <aitzolgarmendia@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: HuaBing <admin@hbcraft.cn>
Co-authored-by: JJonttuu <oikeaihminen@protonmail.com>
Co-authored-by: Juan Lores <juan.lores@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Piotr Komborski <piotr+github@kombor.ski>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: boan51204 <je.991707@gmail.com>
Co-authored-by: 饶志华 <879467666@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_TW/
Translation: Servarr/Prowlarr
2024-01-05 18:38:00 -06:00
Bogdan
9679e88717 Update end date for RED freeload event 2024-01-04 23:32:37 +02:00
Bogdan
f4203993ba New: (MAM) Book title and author returned in response 2024-01-03 11:29:06 +02:00
Bogdan
4be0715fe3 New: (MAM) Filter releases by Min/Max size 2024-01-03 11:21:40 +02:00
Bogdan
f9c9d4a0e0 Fixed: (GGn) Improve title, timezone, MST, min/max size filters
Hiding torrents of type link
And some minor refactoring around the passkey fetching and parsing.
2024-01-03 10:49:25 +02:00
Weblate
bf47380f7b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Mario Rodriguez <mario2423@gmail.com>
Co-authored-by: Norbi <kovinor123@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2024-01-01 14:10:25 +02:00
Mark McDowall
e27a46f578 Fixed: Disable SSL on start if certificate path is not set
(cherry picked from commit 4e19fec123900b8ba1252b640f26f2a4983683ff)
2024-01-01 08:07:46 +02:00
Weblate
af4e69f8fb Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Pietro Ribeiro <xxb1exuv6@mozmail.com>
Co-authored-by: SunStorm <me@sunstorm.rocks>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chiral-lab <jan.eltner@googlemail.com>
Co-authored-by: chrizl <chrizl@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: slammingdeath <sebastianbrudny97@gmail.com>
Co-authored-by: ube <ube@alienautopsy.net>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translation: Servarr/Prowlarr
2023-12-31 10:48:13 +02:00
Weblate
1b2106d4f0 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Pietro Ribeiro <xxb1exuv6@mozmail.com>
Co-authored-by: SunStorm <me@sunstorm.rocks>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chiral-lab <jan.eltner@googlemail.com>
Co-authored-by: chrizl <chrizl@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: slammingdeath <sebastianbrudny97@gmail.com>
Co-authored-by: ube <ube@alienautopsy.net>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translation: Servarr/Prowlarr
2023-12-31 10:39:03 +02:00
Weblate
bdfbda3805 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Pietro Ribeiro <xxb1exuv6@mozmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chrizl <chrizl@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: slammingdeath <sebastianbrudny97@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translation: Servarr/Prowlarr
2023-12-31 07:26:54 +02:00
Stevie Robinson
cb98b10468 Translate fields on the backend
(cherry picked from commit 48b12f5b00429a7cd218d23f0544641b0da62a06)
2023-12-31 07:16:38 +02:00
Mark McDowall
ae1bc8366c New: Add qBittorrent option for Content Layout
(cherry picked from commit 4b22200708ca120cfdcf9cb796be92183adb95d1)
2023-12-31 06:46:16 +02:00
Bogdan
67eeb4373c Fixed: Ignore empty tags when adding items to Flood
(cherry picked from commit 0a5200766ea80fc1c97bfa497cdfed31b9af687f)
2023-12-31 06:39:20 +02:00
Bogdan
9d40a64be4 Bump version to 1.12.0 2023-12-31 06:36:27 +02:00
31 changed files with 712 additions and 381 deletions

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.11.4'
majorVersion: '1.12.0'
minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'

View File

@@ -1,4 +1,5 @@
using System;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
@@ -21,10 +22,10 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
[SetUp]
public void Setup()
{
Subject.Definition = new IndexerDefinition()
Subject.Definition = new IndexerDefinition
{
Name = "GazelleGames",
Settings = new GazelleGamesSettings() { Apikey = "somekey" }
Settings = new GazelleGamesSettings { Apikey = "somekey" }
};
}
@@ -37,20 +38,20 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
.Setup(o => o.ExecuteProxiedAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get), Subject.Definition))
.Returns<HttpRequest, IndexerDefinition>((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed)));
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases;
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases;
releases.Should().HaveCount(1464);
releases.Should().HaveCount(1463);
releases.First().Should().BeOfType<TorrentInfo>();
var torrentInfo = releases.First() as TorrentInfo;
torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM");
torrentInfo.Title.Should().Be("Microsoft_Flight_Simulator-HOODLUM (2020) [Windows / Multi-Language / Full ISO]");
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
torrentInfo.DownloadUrl.Should().Be("https://gazellegames.net/torrents.php?action=download&id=303216&authkey=prowlarr&torrent_pass=");
torrentInfo.InfoUrl.Should().Be("https://gazellegames.net/torrents.php?id=84781&torrentid=303216");
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 6:39:11").ToUniversalTime());
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-07-25 06:39:11", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal));
torrentInfo.Size.Should().Be(80077617780);
torrentInfo.InfoHash.Should().Be(null);
torrentInfo.MagnetUrl.Should().Be(null);
@@ -74,7 +75,7 @@ namespace NzbDrone.Core.Test.IndexerTests.GazelleGamesTests
.Setup(o => o.ExecuteProxiedAsync(It.Is<HttpRequest>(v => v.Method == HttpMethod.Get), Subject.Definition))
.Returns<HttpRequest, IndexerDefinition>((r, d) => Task.FromResult(new HttpResponse(r, new HttpHeader { { "Content-Type", "application/json" } }, new CookieCollection(), recentFeed)));
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new int[] { 2000 } })).Releases;
var releases = (await Subject.Fetch(new BasicSearchCriteria { Categories = new[] { 2000 } })).Releases;
releases.Should().HaveCount(0);
}

View File

@@ -41,6 +41,23 @@ namespace NzbDrone.Core.Annotations
public string Hint { get; set; }
}
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class FieldTokenAttribute : Attribute
{
public FieldTokenAttribute(TokenField field, string label = "", string token = "", object value = null)
{
Label = label;
Field = field;
Token = token;
Value = value?.ToString();
}
public string Label { get; set; }
public TokenField Field { get; set; }
public string Token { get; set; }
public string Value { get; set; }
}
public class FieldSelectOption
{
public int Value { get; set; }
@@ -82,4 +99,11 @@ namespace NzbDrone.Core.Annotations
ApiKey,
UserName
}
public enum TokenField
{
Label,
HelpText,
HelpTextWarning
}
}

View File

@@ -332,8 +332,8 @@ namespace NzbDrone.Core.Configuration
return;
}
// If SSL is enabled and a cert hash is still in the config file disable SSL
if (EnableSsl && GetValue("SslCertHash", null).IsNotNullOrWhiteSpace())
// If SSL is enabled and a cert hash is still in the config file or cert path is empty disable SSL
if (EnableSsl && (GetValue("SslCertHash", null).IsNotNullOrWhiteSpace() || SslCertPath.IsNullOrWhiteSpace()))
{
SetValue("EnableSsl", false);
}

View File

@@ -4,6 +4,7 @@ using System.Linq;
using FluentValidation.Results;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Download.Clients.Flood.Models;
using NzbDrone.Core.Indexers;
@@ -56,7 +57,7 @@ namespace NzbDrone.Core.Download.Clients.Flood
}
}
return result;
return result.Where(t => t.IsNotNullOrWhiteSpace());
}
public override string Name => "Flood";

View File

@@ -0,0 +1,9 @@
namespace NzbDrone.Core.Download.Clients.QBittorrent
{
public enum QBittorrentContentLayout
{
Default = 0,
Original = 1,
Subfolder = 2
}
}

View File

@@ -265,6 +265,15 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
{
request.AddFormParameter("firstLastPiecePrio", true);
}
if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Original)
{
request.AddFormParameter("contentLayout", "Original");
}
else if ((QBittorrentContentLayout)settings.ContentLayout == QBittorrentContentLayout.Subfolder)
{
request.AddFormParameter("contentLayout", "Subfolder");
}
}
public void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings)

View File

@@ -62,6 +62,9 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
[FieldDefinition(10, Label = "First and Last First", Type = FieldType.Checkbox, HelpText = "Download first and last pieces first (qBittorrent 4.1.0+)")]
public bool FirstAndLast { get; set; }
[FieldDefinition(13, Label = "DownloadClientQbittorrentSettingsContentLayout", Type = FieldType.Select, SelectOptions = typeof(QBittorrentContentLayout), HelpText = "DownloadClientQbittorrentSettingsContentLayoutHelpText")]
public int ContentLayout { get; set; }
public NzbDroneValidationResult Validate()
{
return new NzbDroneValidationResult(Validator.Validate(this));

View File

@@ -1,13 +1,16 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using FluentValidation;
using FluentValidation.Results;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Annotations;
@@ -16,6 +19,7 @@ using NzbDrone.Core.Indexers.Exceptions;
using NzbDrone.Core.Indexers.Settings;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Parser;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Validation;
@@ -24,7 +28,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public class GazelleGames : TorrentIndexerBase<GazelleGamesSettings>
{
public override string Name => "GazelleGames";
public override string[] IndexerUrls => new string[] { "https://gazellegames.net/" };
public override string[] IndexerUrls => new[] { "https://gazellegames.net/" };
public override string Description => "GazelleGames (GGn) is a Private Torrent Tracker for GAMES";
public override string Language => "en-US";
public override Encoding Encoding => Encoding.UTF8;
@@ -38,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Definitions
public override IIndexerRequestGenerator GetRequestGenerator()
{
return new GazelleGamesRequestGenerator() { Settings = Settings, Capabilities = Capabilities, HttpClient = _httpClient };
return new GazelleGamesRequestGenerator(Settings, Capabilities);
}
public override IParseIndexerResponse GetParser()
@@ -48,14 +52,13 @@ namespace NzbDrone.Core.Indexers.Definitions
private IndexerCapabilities SetCapabilities()
{
var caps = new IndexerCapabilities
{
};
var caps = new IndexerCapabilities();
// Apple
caps.Categories.AddCategoryMapping("Mac", NewznabStandardCategory.ConsoleOther, "Mac");
caps.Categories.AddCategoryMapping("iOS", NewznabStandardCategory.PCMobileiOS, "iOS");
caps.Categories.AddCategoryMapping("Apple Bandai Pippin", NewznabStandardCategory.ConsoleOther, "Apple Bandai Pippin");
caps.Categories.AddCategoryMapping("Apple II", NewznabStandardCategory.ConsoleOther, "Apple II");
// Google
caps.Categories.AddCategoryMapping("Android", NewznabStandardCategory.PCMobileAndroid, "Android");
@@ -78,6 +81,7 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping("Nintendo GameCube", NewznabStandardCategory.ConsoleOther, "Nintendo GameCube");
caps.Categories.AddCategoryMapping("Pokemon Mini", NewznabStandardCategory.ConsoleOther, "Pokemon Mini");
caps.Categories.AddCategoryMapping("SNES", NewznabStandardCategory.ConsoleOther, "SNES");
caps.Categories.AddCategoryMapping("Switch", NewznabStandardCategory.ConsoleOther, "Switch");
caps.Categories.AddCategoryMapping("Virtual Boy", NewznabStandardCategory.ConsoleOther, "Virtual Boy");
caps.Categories.AddCategoryMapping("Wii", NewznabStandardCategory.ConsoleWii, "Wii");
caps.Categories.AddCategoryMapping("Wii U", NewznabStandardCategory.ConsoleWiiU, "Wii U");
@@ -178,31 +182,62 @@ namespace NzbDrone.Core.Indexers.Definitions
caps.Categories.AddCategoryMapping("Retro - Other", NewznabStandardCategory.ConsoleOther, "Retro - Other");
// special categories (real categories/not platforms)
caps.Categories.AddCategoryMapping("OST", NewznabStandardCategory.AudioOther, "OST");
caps.Categories.AddCategoryMapping("Applications", NewznabStandardCategory.PC0day, "Applications");
caps.Categories.AddCategoryMapping("E-Books", NewznabStandardCategory.BooksEBook, "E-Books");
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.PCGames, "Games");
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.PC0day, "Applications");
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.BooksEBook, "E-Books");
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.AudioOther, "OST");
return caps;
}
protected override async Task Test(List<ValidationFailure> failures)
{
((GazelleGamesRequestGenerator)GetRequestGenerator()).FetchPasskey();
await base.Test(failures);
await FetchPasskey().ConfigureAwait(false);
await base.Test(failures).ConfigureAwait(false);
}
private async Task FetchPasskey()
{
var request = new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}/api.php")
.Accept(HttpAccept.Json)
.SetHeader("X-API-Key", Settings.Apikey)
.AddQueryParam("request", "quick_user")
.Build();
var indexResponse = await _httpClient.ExecuteAsync(request).ConfigureAwait(false);
var index = Json.Deserialize<GazelleGamesUserResponse>(indexResponse.Content);
if (index == null ||
string.IsNullOrWhiteSpace(index.Status) ||
index.Status != "success" ||
string.IsNullOrWhiteSpace(index.Response.PassKey))
{
throw new IndexerAuthException("Failed to authenticate with GazelleGames.");
}
// Set passkey on settings so it can be used to generate the download URL
Settings.Passkey = index.Response.PassKey;
}
}
public class GazelleGamesRequestGenerator : IIndexerRequestGenerator
{
public GazelleGamesSettings Settings { get; set; }
public IndexerCapabilities Capabilities { get; set; }
public IIndexerHttpClient HttpClient { get; set; }
private readonly GazelleGamesSettings _settings;
private readonly IndexerCapabilities _capabilities;
public GazelleGamesRequestGenerator(GazelleGamesSettings settings, IndexerCapabilities capabilities)
{
_settings = settings;
_capabilities = capabilities;
}
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -211,7 +246,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -220,7 +255,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -229,7 +264,7 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
@@ -238,61 +273,72 @@ namespace NzbDrone.Core.Indexers.Definitions
{
var pageableRequests = new IndexerPageableRequestChain();
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories)));
pageableRequests.Add(GetRequest(GetBasicSearchParameters(searchCriteria.SanitizedSearchTerm, searchCriteria)));
return pageableRequests;
}
public void FetchPasskey()
private IEnumerable<IndexerRequest> GetRequest(List<KeyValuePair<string, string>> parameters)
{
// GET on index for the passkey
var request = RequestBuilder().Resource("api.php?request=quick_user").Build();
var indexResponse = HttpClient.Execute(request);
var index = Json.Deserialize<GazelleGamesUserResponse>(indexResponse.Content);
if (index == null ||
string.IsNullOrWhiteSpace(index.Status) ||
index.Status != "success" ||
string.IsNullOrWhiteSpace(index.Response.PassKey))
{
throw new Exception("Failed to authenticate with GazelleGames.");
}
// Set passkey on settings so it can be used to generate the download URL
Settings.Passkey = index.Response.PassKey;
}
private IEnumerable<IndexerRequest> GetRequest(string parameters)
{
var req = RequestBuilder()
.Resource($"api.php?{parameters}")
var request = RequestBuilder()
.Resource($"/api.php?{parameters.GetQueryString()}")
.Build();
yield return new IndexerRequest(req);
yield return new IndexerRequest(request);
}
private HttpRequestBuilder RequestBuilder()
{
return new HttpRequestBuilder($"{Settings.BaseUrl.Trim().TrimEnd('/')}")
return new HttpRequestBuilder($"{_settings.BaseUrl.Trim().TrimEnd('/')}")
.Resource("/api.php")
.Accept(HttpAccept.Json)
.SetHeader("X-API-Key", Settings.Apikey);
.SetHeader("X-API-Key", _settings.Apikey);
}
private string GetBasicSearchParameters(string searchTerm, int[] categories)
private List<KeyValuePair<string, string>> GetBasicSearchParameters(string searchTerm, SearchCriteriaBase searchCriteria)
{
var parameters = "request=search&search_type=torrents&empty_groups=filled&order_by=time&order_way=desc";
if (!string.IsNullOrWhiteSpace(searchTerm))
var parameters = new List<KeyValuePair<string, string>>
{
var searchType = Settings.SearchGroupNames ? "groupname" : "searchstr";
{ "request", "search" },
{ "search_type", "torrents" },
{ "empty_groups", "filled" },
{ "order_by", "time" },
{ "order_way", "desc" }
};
parameters += string.Format("&{1}={0}", searchTerm.Replace(".", " "), searchType);
if (searchTerm.IsNotNullOrWhiteSpace())
{
parameters.Add(
_settings.SearchGroupNames ? "groupname" : "searchstr",
searchTerm.Replace(".", " "));
}
if (categories != null)
if (searchCriteria.Categories != null)
{
foreach (var cat in Capabilities.Categories.MapTorznabCapsToTrackers(categories))
var categoryMappings = _capabilities.Categories
.MapTorznabCapsToTrackers(searchCriteria.Categories)
.Distinct()
.Where(x => !x.IsAllDigits())
.ToList();
categoryMappings.ForEach(category => parameters.Add("artistcheck[]", category));
}
if (searchCriteria.MinSize is > 0)
{
var minSize = searchCriteria.MinSize.Value / 1024L / 1024L;
if (minSize > 0)
{
parameters += string.Format("&artistcheck[]={0}", cat);
parameters.Add("sizesmall", minSize.ToString());
}
}
if (searchCriteria.MaxSize is > 0)
{
var maxSize = searchCriteria.MaxSize.Value / 1024L / 1024L;
if (maxSize > 0)
{
parameters.Add("sizeslarge", maxSize.ToString());
}
}
@@ -329,66 +375,63 @@ namespace NzbDrone.Core.Indexers.Definitions
}
var jsonResponse = new HttpResponse<GazelleGamesResponse>(indexerResponse.HttpResponse);
if (jsonResponse.Resource.Status != "success" ||
string.IsNullOrWhiteSpace(jsonResponse.Resource.Status) ||
jsonResponse.Resource.Response == null)
jsonResponse.Resource.Response is not JObject response)
{
return torrentInfos;
}
Dictionary<string, GazelleGamesGroup> response;
var groups = response.ToObject<Dictionary<int, GazelleGamesGroup>>(JsonSerializer.Create(Json.GetSerializerSettings()));
try
foreach (var group in groups)
{
response = ((JObject)jsonResponse.Resource.Response).ToObject<Dictionary<string, GazelleGamesGroup>>();
}
catch
{
return torrentInfos;
}
foreach (var result in response)
{
Dictionary<string, GazelleGamesTorrent> torrents;
try
{
torrents = ((JObject)result.Value.Torrents).ToObject<Dictionary<string, GazelleGamesTorrent>>();
}
catch
if (group.Value.Torrents is not JObject groupTorrents)
{
continue;
}
if (result.Value.Torrents != null)
var torrents = groupTorrents
.ToObject<Dictionary<int, GazelleGamesTorrent>>(JsonSerializer.Create(Json.GetSerializerSettings()))
.Where(t => t.Value.TorrentType != "Link")
.ToList();
var categories = group.Value.Artists
.SelectMany(a => _categories.MapTrackerCatDescToNewznab(a.Name))
.Distinct()
.ToArray();
foreach (var torrent in torrents)
{
var categories = result.Value.Artists.Select(a => a.Name);
var torrentId = torrent.Key;
var infoUrl = GetInfoUrl(group.Key, torrentId);
foreach (var torrent in torrents)
if (categories.Length == 0)
{
var id = int.Parse(torrent.Key);
var infoUrl = GetInfoUrl(result.Key, id);
var release = new TorrentInfo()
{
Guid = infoUrl,
Title = torrent.Value.ReleaseTitle,
Files = torrent.Value.FileCount,
Grabs = torrent.Value.Snatched,
Size = long.Parse(torrent.Value.Size),
DownloadUrl = GetDownloadUrl(id),
InfoUrl = infoUrl,
Seeders = torrent.Value.Seeders,
Categories = _categories.MapTrackerCatDescToNewznab(categories.FirstOrDefault()),
Peers = torrent.Value.Leechers + torrent.Value.Seeders,
PublishDate = torrent.Value.Time.ToUniversalTime(),
DownloadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.FreeLeech || torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1,
UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1
};
torrentInfos.Add(release);
categories = _categories.MapTrackerCatToNewznab(torrent.Value.CategoryId.ToString()).ToArray();
}
var release = new TorrentInfo
{
Guid = infoUrl,
InfoUrl = infoUrl,
DownloadUrl = GetDownloadUrl(torrentId),
Title = GetTitle(group.Value, torrent.Value),
Categories = categories,
Files = torrent.Value.FileCount,
Size = long.Parse(torrent.Value.Size),
Grabs = torrent.Value.Snatched,
Seeders = torrent.Value.Seeders,
Peers = torrent.Value.Leechers + torrent.Value.Seeders,
PublishDate = torrent.Value.Time.ToUniversalTime(),
Scene = torrent.Value.Scene == 1,
DownloadVolumeFactor = torrent.Value.FreeTorrent is GazelleGamesFreeTorrent.FreeLeech or GazelleGamesFreeTorrent.Neutral || torrent.Value.LowSeedFL ? 0 : 1,
UploadVolumeFactor = torrent.Value.FreeTorrent == GazelleGamesFreeTorrent.Neutral ? 0 : 1,
MinimumSeedTime = 288000 // Minimum of 3 days and 8 hours (80 hours in total)
};
torrentInfos.Add(release);
}
}
@@ -399,6 +442,44 @@ namespace NzbDrone.Core.Indexers.Definitions
.ToArray();
}
private static string GetTitle(GazelleGamesGroup group, GazelleGamesTorrent torrent)
{
var title = WebUtility.HtmlDecode(torrent.ReleaseTitle);
if (group.Year is > 0 && !title.Contains(group.Year.ToString()))
{
title += $" ({group.Year})";
}
if (torrent.RemasterTitle.IsNotNullOrWhiteSpace())
{
title += $" [{$"{torrent.RemasterTitle} {torrent.RemasterYear}".Trim()}]";
}
var flags = new List<string>
{
$"{torrent.Format} {torrent.Encoding}".Trim()
};
if (group.Artists is { Count: > 0 })
{
flags.AddIfNotNull(group.Artists.Select(a => a.Name).Join(", "));
}
flags.AddIfNotNull(torrent.Language);
flags.AddIfNotNull(torrent.Region);
flags.AddIfNotNull(torrent.Miscellaneous);
flags = flags.Where(x => x.IsNotNullOrWhiteSpace()).ToList();
if (flags.Any())
{
title += $" [{string.Join(" / ", flags)}]";
}
return title;
}
private string GetDownloadUrl(int torrentId)
{
// AuthKey is required but not checked, just pass in a dummy variable
@@ -413,7 +494,7 @@ namespace NzbDrone.Core.Indexers.Definitions
return url.FullUri;
}
private string GetInfoUrl(string groupId, int torrentId)
private string GetInfoUrl(int groupId, int torrentId)
{
var url = new HttpUri(_settings.BaseUrl)
.CombinePath("/torrents.php")
@@ -444,7 +525,7 @@ namespace NzbDrone.Core.Indexers.Definitions
Passkey = "";
}
[FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings), Must have User Permissions", Privacy = PrivacyLevel.ApiKey)]
[FieldDefinition(2, Label = "API Key", HelpText = "API Key from the Site (Found in Settings => Access Settings)", HelpTextWarning = "Must have User and Torrents permissions", Privacy = PrivacyLevel.ApiKey)]
public string Apikey { get; set; }
[FieldDefinition(3, Label = "Search Group Names", Type = FieldType.Checkbox, HelpText = "Search Group Names Only")]
@@ -466,8 +547,9 @@ namespace NzbDrone.Core.Indexers.Definitions
public class GazelleGamesGroup
{
public List<GazelleGamesArtist> Artists { get; set; }
public ReadOnlyCollection<GazelleGamesArtist> Artists { get; set; }
public object Torrents { get; set; }
public int? Year { get; set; }
}
public class GazelleGamesArtist
@@ -478,13 +560,23 @@ namespace NzbDrone.Core.Indexers.Definitions
public class GazelleGamesTorrent
{
public int CategoryId { get; set; }
public string Format { get; set; }
public string Encoding { get; set; }
public string Language { get; set; }
public string Region { get; set; }
public string RemasterYear { get; set; }
public string RemasterTitle { get; set; }
public string ReleaseTitle { get; set; }
public string Miscellaneous { get; set; }
public int Scene { get; set; }
public DateTime Time { get; set; }
public string TorrentType { get; set; }
public int FileCount { get; set; }
public string Size { get; set; }
public int? Snatched { get; set; }
public int Seeders { get; set; }
public int Leechers { get; set; }
public string ReleaseTitle { get; set; }
public DateTime Time { get; set; }
public int FileCount { get; set; }
public GazelleGamesFreeTorrent FreeTorrent { get; set; }
public bool PersonalFL { get; set; }
public bool LowSeedFL { get; set; }
@@ -503,9 +595,9 @@ namespace NzbDrone.Core.Indexers.Definitions
public enum GazelleGamesFreeTorrent
{
Normal,
FreeLeech,
Neutral,
Either
Normal = 0,
FreeLeech = 1,
Neutral = 2,
Either = 3
}
}

View File

@@ -244,17 +244,17 @@ namespace NzbDrone.Core.Indexers.Definitions
if (Settings.SearchInDescription)
{
parameters.Add("tor[srchIn][description]", "true");
parameters.Set("tor[srchIn][description]", "true");
}
if (Settings.SearchInSeries)
{
parameters.Add("tor[srchIn][series]", "true");
parameters.Set("tor[srchIn][series]", "true");
}
if (Settings.SearchInFilenames)
{
parameters.Add("tor[srchIn][filenames]", "true");
parameters.Set("tor[srchIn][filenames]", "true");
}
var catList = Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories);
@@ -263,13 +263,28 @@ namespace NzbDrone.Core.Indexers.Definitions
var index = 0;
foreach (var cat in catList)
{
parameters.Add("tor[cat][" + index + "]", cat);
parameters.Set("tor[cat][" + index + "]", cat);
index++;
}
}
else
{
parameters.Add("tor[cat][]", "0");
parameters.Set("tor[cat][]", "0");
}
if (searchCriteria.MinSize is > 0)
{
parameters.Set("tor[minSize]", searchCriteria.MinSize.Value.ToString());
}
if (searchCriteria.MaxSize is > 0)
{
parameters.Set("tor[maxSize]", searchCriteria.MaxSize.Value.ToString());
}
if (searchCriteria.MinSize is > 0 || searchCriteria.MaxSize is > 0)
{
parameters.Set("tor[unit]", "1");
}
var searchUrl = Settings.BaseUrl + "tor/js/loadSearchJSONbasic.php";
@@ -394,6 +409,8 @@ namespace NzbDrone.Core.Indexers.Definitions
release.Title = item.Title;
release.Description = item.Description;
release.BookTitle = item.Title;
if (item.AuthorInfo != null)
{
var authorInfo = JsonConvert.DeserializeObject<Dictionary<string, string>>(item.AuthorInfo);
@@ -402,6 +419,7 @@ namespace NzbDrone.Core.Indexers.Definitions
if (author.IsNotNullOrWhiteSpace())
{
release.Title += " by " + author;
release.Author = author;
}
}

View File

@@ -426,7 +426,7 @@ namespace NzbDrone.Core.Indexers.Definitions
[FieldDefinition(3, Label = "Use Freeleech Tokens", Type = FieldType.Checkbox, HelpText = "Use freeleech tokens when available")]
public bool UseFreeleechToken { get; set; }
[FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 6 January 2024, 23:59 UTC.")]
[FieldDefinition(4, Label = "Freeload Only", Type = FieldType.Checkbox, Advanced = true, HelpTextWarning = "Search freeload torrents only. End date: 31 January 2024, 23:59 UTC.")]
public bool FreeloadOnly { get; set; }
public override NzbDroneValidationResult Validate()

View File

@@ -1,5 +1,5 @@
{
"Add": "Afegiu",
"Add": "Afegeix",
"Actions": "Accions",
"AcceptConfirmationModal": "Accepta el modal de confirmació",
"About": "Quant a",
@@ -33,7 +33,7 @@
"AddDownloadClient": "Afegeix un client de descàrrega",
"Added": "Afegit",
"Age": "Edat",
"All": "Tots",
"All": "Tot",
"Analytics": "Anàlisi",
"ApiKey": "Clau API",
"AppDataDirectory": "Directori AppData",
@@ -143,7 +143,7 @@
"SettingsShortDateFormat": "Format de data curta",
"BindAddress": "Adreça d'enllaç",
"Database": "Base de dades",
"Ended": "S'ha acabat",
"Ended": "Acabat",
"SettingsTimeFormat": "Format horari",
"YesCancel": "Si, cancel·la",
"Automatic": "Automàtic",
@@ -300,10 +300,10 @@
"View": "Visualitza",
"Yesterday": "Ahir",
"ApplicationStatusCheckSingleClientMessage": "Llistes no disponibles a causa d'errors: {0}",
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} 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.",
"AnalyticsEnabledHelpText": "Envieu informació anònima d'ús i errors als servidors de {appName}. Això inclou informació sobre el vostre navegador, quines pàgines {appName} WebUI feu servir, informes d'errors, així com el sistema operatiu i la versió de l'entorn d'execució. Utilitzarem aquesta informació per prioritzar les funcions i les correccions d'errors.",
"HistoryCleanupDaysHelpTextWarning": "Els fitxers de la paperera de reciclatge més antics que el nombre de dies seleccionat es netejaran automàticament",
"UnableToAddANewAppProfilePleaseTryAgain": "No es pot afegir un perfil de qualitat nou, torneu-ho a provar.",
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData del {appName}",
"BackupFolderHelpText": "Els camins relatius estaran sota el directori AppData de {appName}",
"AllIndexersHiddenDueToFilter": "Totes les pel·lícules estan ocultes a causa del filtre aplicat.",
"EnableRss": "Activa RSS",
"Grabs": "Captura",
@@ -312,7 +312,7 @@
"Application": "Aplicacions",
"Applications": "Aplicacions",
"ApplicationStatusCheckAllClientMessage": "Totes les llistes no estan disponibles a causa d'errors",
"AuthenticationMethodHelpText": "Requereix nom d'usuari i contrasenya per accedir al radar",
"AuthenticationMethodHelpText": "Es requereix nom d'usuari i contrasenya per accedir a {appName}",
"ApplicationLongTermStatusCheckAllClientMessage": "Tots els indexadors no estan disponibles a causa d'errors durant més de 6 hores",
"ApplicationLongTermStatusCheckSingleClientMessage": "Els indexadors no estan disponibles a causa d'errors durant més de 6 hores: {0}",
"BindAddressHelpText": "Adreça IP vàlida, localhost o '*' per a totes les interfícies",
@@ -347,7 +347,7 @@
"ApplicationUrlHelpText": "URL extern d'aquesta aplicació, inclòs http(s)://, port i URL base",
"ApplyTagsHelpTextAdd": "Afegeix: afegeix les etiquetes a la llista d'etiquetes existent",
"ApplyTagsHelpTextHowToApplyApplications": "Com aplicar etiquetes a les pel·lícules seleccionades",
"ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes a les pel·lícules seleccionades",
"ApplyTagsHelpTextHowToApplyIndexers": "Com aplicar etiquetes als indexadors seleccionats",
"ApplyTagsHelpTextRemove": "Eliminar: elimina les etiquetes introduïdes",
"DeleteSelectedApplicationsMessageText": "Esteu segur que voleu suprimir l'indexador '{0}'?",
"Label": "Etiqueta",
@@ -370,12 +370,45 @@
"minutes": "Minuts",
"DeleteAppProfileMessageText": "Esteu segur que voleu suprimir el perfil de qualitat {0}",
"NotificationStatusSingleClientHealthCheckMessage": "Llistes no disponibles a causa d'errors: {0}",
"AddConnection": "Edita la col·lecció",
"AddConnection": "Afegeix una connexió",
"NotificationStatusAllClientHealthCheckMessage": "Totes les llistes no estan disponibles a causa d'errors",
"AuthBasic": "Basic (finestra emergent del navegador)",
"AuthForm": "Formularis (pàgina d'inici de sessió)",
"DisabledForLocalAddresses": "Desactivat per a adreces locals",
"None": "Cap",
"ResetAPIKeyMessageText": "Esteu segur que voleu restablir la clau de l'API?",
"RestartProwlarr": "Reinicia {appName}"
"RestartProwlarr": "Reinicia {appName}",
"AuthenticationRequired": "Autenticació necessària",
"CountDownloadClientsSelected": "{count} client(s) de baixada seleccionat(s)",
"NoDownloadClientsFound": "No s'han trobat clients de baixada",
"AuthenticationRequiredWarning": "Per evitar l'accés remot sense autenticació, ara {appName} requereix que l'autenticació estigui activada. Opcionalment, podeu desactivar l'autenticació des d'adreces locals.",
"AppUpdatedVersion": "{appName} s'ha actualitzat a la versió `{version}`, per tal d'obtenir els darrers canvis, haureu de tornar a carregar {appName}",
"AppUpdated": "{appName} Actualitzada",
"ApplyChanges": "Aplica els canvis",
"Implementation": "Implementació",
"OnHealthRestored": "Al resoldre les incidències",
"ManageDownloadClients": "Gestiona els clients de descàrrega",
"AuthenticationRequiredHelpText": "Canvia per a quines sol·licituds cal autenticar. No canvieu tret que entengueu els riscos.",
"CountIndexersSelected": "S'han seleccionat {count} indexador(s)",
"EditDownloadClientImplementation": "Edita el client de baixada - {implementationName}",
"EditIndexerImplementation": "Edita l'indexador - {implementationName}",
"EditSelectedDownloadClients": "Editeu els clients de descàrrega seleccionats",
"EditSelectedIndexers": "Edita els indexadors seleccionats",
"IndexerDownloadClientHealthCheckMessage": "Indexadors amb clients de baixada no vàlids: {0}.",
"AddCustomFilter": "Afegeix un filtre personalitzat",
"AddDownloadClientImplementation": "Afegeix un client de descàrrega - {implementationName}",
"AddIndexerImplementation": "Afegeix un indexador - {implementationName}",
"AddConnectionImplementation": "Afegeix una connexió - {implementationName}",
"InvalidUILanguage": "La vostra IU està configurada en un idioma no vàlid, corregiu-lo i deseu la configuració",
"NoHistoryFound": "No s'ha trobat cap historial",
"NoIndexersFound": "No s'han trobat indexadors",
"OnHealthRestoredHelpText": "Al resoldre les incidències",
"AuthenticationMethod": "Mètode d'autenticació",
"AuthenticationMethodHelpTextWarning": "Seleccioneu un mètode d'autenticació vàlid",
"AuthenticationRequiredPasswordHelpTextWarning": "Introduïu una contrasenya nova",
"DefaultNameCopiedProfile": "{name} - Còpia",
"DownloadClientQbittorrentSettingsContentLayout": "Disseny de contingut",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si s'utilitza el disseny de contingut de qBittorrent s'utilitza el disseny original del torrent o es crea una subcarpeta (qBittorrent 4.3.2+)",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmeu la nova contrasenya",
"AuthenticationRequiredUsernameHelpTextWarning": "Introduïu un nom d'usuari nou"
}

View File

@@ -17,11 +17,11 @@
"Age": "Alter",
"All": "Alle",
"AllIndexersHiddenDueToFilter": "Alle Indexer sind durch den ausgewählten Filter ausgeblendet.",
"Analytics": "Analytik",
"AnalyticsEnabledHelpText": "Sende anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen über Browser, welche Seiten der {appName}-Weboberfläche aufgerufen wurden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
"Analytics": "Analysen",
"AnalyticsEnabledHelpText": "Senden Sie anonyme Nutzungs- und Fehlerinformationen an die Server von {appName}. Dazu gehören Informationen zu Ihrem Browser, welche {appName}-WebUI-Seiten Sie verwenden, Fehlerberichte sowie Betriebssystem- und Laufzeitversion. Wir werden diese Informationen verwenden, um Funktionen und Fehlerbehebungen zu priorisieren.",
"ApiKey": "API-Schlüssel",
"ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen",
"AppDataDirectory": "AppData Ordner",
"AppDataDirectory": "AppData-Verzeichnis",
"AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern",
"AppProfileInUse": "App-Profil im Einsatz",
"AppProfileSelectHelpText": "App-Profile werden verwendet, um die Einstellungen für RSS, automatische Suche und interaktive Suche bei der Anwendungssynchronisierung zu steuern",
@@ -33,53 +33,53 @@
"ApplicationStatusCheckSingleClientMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}",
"Applications": "Anwendungen",
"Apply": "Anwenden",
"ApplyTags": "Tags setzen",
"ApplyTags": "Schlagworte anwenden",
"Apps": "Anwendungen",
"AudioSearch": "Audio Suche",
"Auth": "Authentifizierung",
"Authentication": "Authentifizierung",
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich",
"AuthenticationMethodHelpText": "Für den Zugriff auf {appName} sind Benutzername und Passwort erforderlich.",
"Automatic": "Automatisch",
"AutomaticSearch": "Automatische Suche",
"Backup": "Backups",
"BackupFolderHelpText": "Relative Pfade befinden sich unter {appName}s AppData Ordner",
"BackupIntervalHelpText": "Intervall zum sichern der Datenbank und Einstellungen",
"Backup": "Sicherung",
"BackupFolderHelpText": "Relative Pfade befinden sich im AppData-Verzeichnis von {appName}",
"BackupIntervalHelpText": "Intervall zwischen automatischen Sicherungen",
"BackupNow": "Jetzt sichern",
"BackupRetentionHelpText": "Automatische Backups, die älter als die Aufbewahrungsfrist sind, werden automatisch gelöscht",
"BackupRetentionHelpText": "Automatische Backups, die älter als der Aufbewahrungszeitraum sind, werden automatisch bereinigt",
"Backups": "Sicherungen",
"BeforeUpdate": "Vor dem Update",
"BindAddress": "Adresse binden",
"BindAddressHelpText": "Gültige IP Adresse oder \"*\" für alle Netzwerke",
"BindAddressHelpText": "Gültige IP-Adresse, localhost oder „*“ für alle Schnittstellen",
"BookSearch": "Buch Suche",
"BookSearchTypes": "Buch-Suchtypen",
"Branch": "Git-Branch",
"Branch": "Branch",
"BranchUpdate": "Verwendeter Branch zur Aktualisierung von {appName}",
"BranchUpdateMechanism": "Git-Branch für den externen Updateablauf",
"BypassProxyForLocalAddresses": "Proxy für lokale Adressen umgehen",
"Cancel": "Abbrechen",
"CancelPendingTask": "Diese laufende Aufgabe wirklich abbrechen?",
"CancelPendingTask": "Möchten Sie diese ausstehende Aufgabe wirklich abbrechen?",
"Categories": "Kategorien",
"Category": "Kategorie",
"CertificateValidation": "Zertifikat Validierung",
"CertificateValidation": "Zertifikatsvalidierung",
"CertificateValidationHelpText": "Ändere wie streng die Validierung der HTTPS-Zertifizierung ist",
"ChangeHasNotBeenSavedYet": "Änderung wurde noch nicht gespeichert",
"Clear": "Leeren",
"ClearHistory": "Verlauf leeren",
"ClearHistoryMessageText": "Wirklich den ganzen {appName} Verlauf löschen?",
"ClientPriority": "Priorität",
"CloneProfile": "Profil kopieren",
"CloneProfile": "Profil klonen",
"Close": "Schließen",
"CloseCurrentModal": "Momentanes Modal schließen",
"Columns": "Spalten",
"Component": "Komponente",
"Connect": "Benachrichtigungen",
"ConnectSettings": "Eintellungen für Verbindungen",
"ConnectSettings": "Verbindungseinstellungen",
"ConnectSettingsSummary": "Benachrichtigungen und eigene Scripte",
"ConnectionLost": "Verbindung unterbrochen",
"Connections": "Verbindungen",
"CouldNotConnectSignalR": "Es konnte keine Verbindung zu SignalR hergestellt werden, die Benutzeroberfläche wird nicht aktualisiert",
"Custom": "Benutzerdefiniert",
"CustomFilters": "Eigene Filter",
"CustomFilters": "Benutzerdefinierte Filter",
"DBMigration": "DB Migration",
"Database": "Datenbank",
"Date": "Datum",
@@ -88,24 +88,24 @@
"DeleteAppProfile": "App-Profil löschen",
"DeleteApplication": "Applikation löschen",
"DeleteApplicationMessageText": "Wirklich die Applikation '{0}' löschen?",
"DeleteBackup": "Backup löschen",
"DeleteBackupMessageText": "Backup '{0}' wirkich löschen?",
"DeleteDownloadClient": "Downloader löschen",
"DeleteDownloadClientMessageText": "Downloader '{0}' wirklich löschen?",
"DeleteBackup": "Sicherung löschen",
"DeleteBackupMessageText": "Sind Sie sicher, dass Sie die Sicherung „{name}“ löschen möchten?",
"DeleteDownloadClient": "Download-Client löschen",
"DeleteDownloadClientMessageText": "Sind Sie sicher, dass Sie den Download-Client „{name}“ löschen möchten?",
"DeleteIndexerProxy": "Indexer Proxy löschen",
"DeleteIndexerProxyMessageText": "Tag '{0}' wirklich löschen?",
"DeleteNotification": "Benachrichtigung löschen",
"DeleteNotificationMessageText": "Benachrichtigung '{0}' wirklich löschen?",
"DeleteNotificationMessageText": "Sind Sie sicher, dass Sie die Benachrichtigung „{name}“ löschen möchten?",
"DeleteTag": "Tag löschen",
"DeleteTagMessageText": "Tag '{0}' wirklich löschen?",
"DeleteTagMessageText": "Sind Sie sicher, dass Sie das Tag „{label}“ löschen möchten?",
"Description": "Beschreibung",
"Details": "Details",
"Details": "Einzelheiten",
"DevelopmentSettings": "Entwicklungseinstellungen",
"Disabled": "Deaktiviert",
"Discord": "Discord",
"Docker": "Docker",
"Donations": "Spenden",
"DownloadClient": "Downloader",
"DownloadClient": "Download Client",
"DownloadClientSettings": "Downloader Einstellungen",
"DownloadClientStatusCheckAllClientMessage": "Alle Download Clients sind aufgrund von Fehlern nicht verfügbar",
"DownloadClientStatusCheckSingleClientMessage": "Download Clients aufgrund von Fehlern nicht verfügbar: {0}",
@@ -307,17 +307,17 @@
"Reload": "Neuladen",
"Remove": "Entfernen",
"RemoveFilter": "Filter entfernen",
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlage entfernt",
"RemovedFromTaskQueue": "Aus der Aufgabenwarteschlange entfernt",
"RemovingTag": "Tag entfernen",
"Replace": "Ersetzen",
"Reset": "Zurücksetzen",
"ResetAPIKey": "API-Schlüssel zurücksetzen",
"Restart": "Neustarten",
"Restart": "Neu starten",
"RestartNow": "Jetzt neustarten",
"RestartProwlarr": "{appName} Neustarten",
"RestartRequiredHelpTextWarning": "Erfordert einen Neustart",
"RestartRequiredHelpTextWarning": "Erfordert einen Neustart, damit die Aktion wirksam wird",
"Restore": "Wiederherstellen",
"RestoreBackup": "Backup einspielen",
"RestoreBackup": "Sicherung wiederherstellen",
"Result": "Ergebnis",
"Retention": "Aufbewahrung ( Retention )",
"SSLCertPassword": "SSL Zertifikat Passwort",
@@ -337,10 +337,10 @@
"SearchTypes": "Suchtyp",
"Security": "Sicherheit",
"Seeders": "Seeders",
"SelectAll": "Alle wählen",
"SelectAll": "Alles auswählen",
"SemiPrivate": "Halbprivat",
"SendAnonymousUsageData": "Anonyme Nutzungsdaten übertragen",
"SetTags": "Tags setzen",
"SendAnonymousUsageData": "Sende anonyme Nutzungsdaten",
"SetTags": "Tags festlegen",
"Settings": "Einstellungen",
"SettingsConsoleLogLevel": "Konsolen Log Level",
"SettingsEnableColorImpairedMode": "Farbbeeinträchtigter Modus aktivieren",
@@ -358,7 +358,7 @@
"SettingsShowRelativeDatesHelpText": "Relatives (z.B.: Heute, gestern, etc) oder absolutes Datum anzeigen",
"SettingsSqlLoggingHelpText": "Log alle SQL Abfragen von {appName}",
"SettingsTimeFormat": "Zeitformat",
"ShowAdvanced": "Einfache Ansicht",
"ShowAdvanced": "Erweitert anzeigen",
"ShowSearch": "Suche anzeigen",
"ShowSearchHelpText": "Suchbutton anzeigen beim draufzeigen",
"Shutdown": "Herunterfahren",
@@ -366,7 +366,7 @@
"Sort": "Sortieren",
"Source": "Quelle",
"StartTypingOrSelectAPathBelow": "Eingeben oder unten auswählen",
"Started": "gestartet",
"Started": "Gestartet",
"StartupDirectory": "Start-Verzeichnis",
"Stats": "Statistiken",
"Status": "Status",
@@ -387,13 +387,13 @@
"TagIsNotUsedAndCanBeDeleted": "Tag wird nicht benutzt und kann gelöscht werden",
"Tags": "Tags",
"TagsHelpText": "Wird auf Filme mit mindestens einem passenden Tag angewandt",
"TagsSettingsSummary": "Alle Tags und deren Benutzung anzeigen. Unbenutzte Tags können entfernt werden",
"TagsSettingsSummary": "Sehen Sie sich alle Tags und deren Verwendung an. Nicht verwendete Tags können entfernt werden",
"Tasks": "Aufgaben",
"Test": "Testen",
"TestAll": "Alle testen",
"Test": "Prüfen",
"TestAll": "Alle prüfen",
"TestAllApps": "Alle Apps testen",
"TestAllClients": "Alle testen",
"TestAllIndexers": "Alle testen",
"TestAllClients": "Prüfe alle Clients",
"TestAllIndexers": "Prüfe alle Indexer",
"TheLatestVersionIsAlreadyInstalled": "Die aktuellste Version ist bereits installiert",
"ThemeHelpText": "Ändere das UI-Theme der Anwendung. Das 'Auto'-Theme verwendet dein Betriebssystem-Theme, um den hellen oder dunklen Modus einzustellen. Inspiriert von {0}",
"Time": "Zeit",
@@ -419,7 +419,7 @@
"UnableToAddANewNotificationPleaseTryAgain": "Die neue Benachrichtigung konnte nicht hinzugefügt werden, bitte erneut probieren.",
"UnableToLoadAppProfiles": "App-Profile können nicht geladen werden",
"UnableToLoadApplicationList": "Anwendungsliste kann nicht geladen werden",
"UnableToLoadBackups": "Backups konnten nicht geladen werden",
"UnableToLoadBackups": "Sicherungen können nicht geladen werden",
"UnableToLoadDevelopmentSettings": "Entwicklereinstellungen konnten nicht geladen werden",
"UnableToLoadDownloadClients": "Downloader konnten nicht geladen werden",
"UnableToLoadGeneralSettings": "Allgemeine Einstellungen konnten nicht geladen werden",
@@ -429,41 +429,41 @@
"UnableToLoadNotifications": "Benachrichtigungen konnten nicht geladen werden",
"UnableToLoadTags": "Tags konnten nicht geladen werden",
"UnableToLoadUISettings": "Oberflächen Einstellungen konnten nicht geladen werden",
"UnsavedChanges": "Ungespeicherte Änderungen",
"UnselectAll": "Keine wählen",
"UpdateAutomaticallyHelpText": "Updates automatisch herunteraden und installieren. Es kann weiterhin unter \"System -> Updates\" ein manuelles Update angestoßen werden",
"UnsavedChanges": "Nicht gespeicherte Änderungen",
"UnselectAll": "Alle abwählen",
"UpdateAutomaticallyHelpText": "Updates automatisch herunterladen und installieren. Sie können weiterhin über System: Updates installieren",
"UpdateCheckStartupNotWritableMessage": "Update kann nicht installiert werden, da der Startordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.",
"UpdateCheckStartupTranslocationMessage": "Update kann nicht installiert werden, da sich der Startordner '{0}' in einem App Translocation-Ordner befindet.",
"UpdateCheckUINotWritableMessage": "Update kann nicht installiert werden, da der Benutzeroberflächenordner '{0}' vom Benutzer '{1}' nicht beschreibbar ist.",
"UpdateMechanismHelpText": "Benutze {appName}'s Built-In Updater oder ein Script",
"UpdateMechanismHelpText": "Verwenden Sie den integrierten Updater von {appName} oder ein Skript",
"UpdateScriptPathHelpText": "Pfad zu einem benutzerdefinierten Skript, das ein extrahiertes Update-Paket übernimmt und den Rest des Update-Prozesses abwickelt",
"Updates": "Updates",
"Uptime": "Laufzeit",
"Updates": "Aktualisierung",
"Uptime": "Betriebszeit",
"Url": "Url",
"UrlBaseHelpText": "Für Reverse-Proxy-Unterstützung. Die Standardeinstellung leer",
"UseProxy": "Proxy benutzen",
"UrlBaseHelpText": "Für die Reverse-Proxy-Unterstützung ist der Standardwert leer",
"UseProxy": "Verwende Proxy",
"Usenet": "Usenet",
"UserAgentProvidedByTheAppThatCalledTheAPI": "UserAgent von der App welcher die API aufgerufen hat",
"Username": "Benutzername",
"Username": "Nutzername",
"Version": "Version",
"View": "Ansicht",
"Warn": "Warnung",
"Warn": "Achtung",
"Website": "Webseite",
"Wiki": "Wiki",
"Yes": "Ja",
"YesCancel": "Ja, abbrechen",
"YesCancel": "Ja Abbrechen",
"Yesterday": "Gestern",
"OnHealthRestoredHelpText": "Bei Wiederherstellung des Zustands",
"OnHealthRestored": "Bei Wiederherstellung des Zustands",
"StopSelecting": "Auswahl stoppen",
"ApplicationURL": "Anwendungs-URL",
"ApplicationUrlHelpText": "Die externe URL der Anwendung inklusive http(s)://, Port und URL-Basis",
"ApplicationUrlHelpText": "Die externe URL dieser Anwendung, einschließlich http(s)://, Port und URL-Basis",
"ApplyChanges": "Änderungen anwenden",
"CountIndexersSelected": "{0} Indexer ausgewählt",
"CountIndexersSelected": "{count} Indexer ausgewählt",
"DeleteSelectedDownloadClients": "Lösche Download Client(s)",
"DeleteSelectedApplicationsMessageText": "Indexer '{0}' wirklich löschen?",
"DeleteSelectedDownloadClientsMessageText": "Indexer '{0}' wirklich löschen?",
"DeleteSelectedIndexersMessageText": "Indexer '{0}' wirklich löschen?",
"DeleteSelectedDownloadClientsMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte Download-Clients löschen möchten?",
"DeleteSelectedIndexersMessageText": "Sind Sie sicher, dass Sie {count} ausgewählte(n) Indexer löschen möchten?",
"EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten",
"Implementation": "Integration",
"ManageDownloadClients": "Verwalte Download Clienten",
@@ -471,11 +471,11 @@
"NoIndexersFound": "Keine Indexer gefunden",
"Theme": "Design",
"Season": "Staffel",
"ApplyTagsHelpTextAdd": "Hinzufügen: Füge neu Tags zu den existierenden Tags hinzu",
"ApplyTagsHelpTextAdd": "Hinzufügen: Fügen Sie die Tags der vorhandenen Tag-Liste hinzu",
"ApplyTagsHelpTextHowToApplyApplications": "Wie werden Tags zu ausgewählten Autoren zugeteilt",
"ApplyTagsHelpTextHowToApplyIndexers": "Wie werden Tags zu ausgewählten Indexern zugeteilt",
"ApplyTagsHelpTextRemove": "Entfernen: Eingegebene Tags entfernen",
"ApplyTagsHelpTextReplace": "Ersetzen: Nur eingegebene Tags übernehmen und vorhandene entfernen( keine Tags eingeben um alle zu entfernen )",
"ApplyTagsHelpTextHowToApplyIndexers": "So wenden Sie Tags auf die ausgewählten Indexer an",
"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).",
"DownloadClientPriorityHelpText": "Priorisiere mehrere Downloader. Rundlauf-Verfahren wird für Downloader mit der gleichen Priorität verwendet.",
"EditSelectedIndexers": "Ausgewähle Indexer bearbeiten",
"SelectIndexers": "Indexer suchen",
@@ -491,20 +491,20 @@
"Artist": "Künstler",
"Author": "Autor",
"Book": "Buch",
"ConnectionLostReconnect": "Radarr wird automatisch versuchen zu verbinden oder klicke unten auf neuladen.",
"ConnectionLostToBackend": "Radarr hat die Verbindung zum Backend verloren und muss neugeladen werden.",
"ConnectionLostReconnect": "{appName} wird versuchen, automatisch eine Verbindung herzustellen, oder Sie können unten auf „Neu laden“ klicken.",
"ConnectionLostToBackend": "{appName} hat die Verbindung zum Backend verloren und muss neu geladen werden, um die Funktionalität wiederherzustellen.",
"RecentChanges": "Kürzliche Änderungen",
"WhatsNew": "Was gibt's Neues?",
"WhatsNew": "Was ist neu?",
"minutes": "Minuten",
"DeleteAppProfileMessageText": "Qualitätsprofil '{0}' wirklich löschen?",
"AddConnection": "Verbindung hinzufügen",
"NotificationStatusAllClientHealthCheckMessage": "Wegen Fehlern sind keine Applikationen verfügbar",
"NotificationStatusSingleClientHealthCheckMessage": "Applikationen wegen folgender Fehler nicht verfügbar: {0}",
"AuthBasic": "Einfach (Browser Popup)",
"AuthForm": "Formular (Login Seite)",
"DisabledForLocalAddresses": "Für Lokale Adressen deaktivieren",
"AuthBasic": "Basis (Browser-Popup)",
"AuthForm": "Formulare (Anmeldeseite)",
"DisabledForLocalAddresses": "Für lokale Adressen deaktiviert",
"None": "Keine",
"ResetAPIKeyMessageText": "Bist du sicher, dass du den API-Schlüssel zurücksetzen willst?",
"ResetAPIKeyMessageText": "Sind Sie sicher, dass Sie Ihren API-Schlüssel zurücksetzen möchten?",
"AddCustomFilter": "Eigenen Filter hinzufügen",
"AddApplication": "Application hinzufügen",
"AddCategory": "Kategorie hinzufügen",
@@ -532,5 +532,15 @@
"AuthenticationRequiredUsernameHelpTextWarning": "Gib einen neuen Benutzernamen ein",
"AuthenticationMethodHelpTextWarning": "Bitte wähle eine gültige Authentifizierungsmethode aus",
"AuthenticationRequiredPasswordHelpTextWarning": "Gib ein neues Passwort ein",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen"
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Neues Passwort bestätigen",
"DefaultNameCopiedProfile": "{Name} Kopieren",
"AuthenticationMethod": "Authentifizierungsmethode",
"Clone": "Klonen",
"CountDownloadClientsSelected": "{count} Download-Client(s) ausgewählt",
"EditConnectionImplementation": "Verbindung hinzufügen - {implementationName}",
"EditDownloadClientImplementation": "Download-Client hinzufügen - {implementationName}",
"IndexerTagsHelpTextWarning": "Tags sollten mit Vorsicht verwendet werden, da sie ungewollte Effekte haben können. Eine Anwendung mit einem Tag synchronisiert nur Indexer die den Gleichen Tag haben.",
"EditIndexerImplementation": "Indexer hinzufügen - {implementationName}",
"EditApplicationImplementation": "Anwendung hinzufügen - {implementationName}",
"EditIndexerProxyImplementation": "Indexer Proxy hinzufügen - {implementationName}"
}

View File

@@ -173,6 +173,8 @@
"DownloadClient": "Download Client",
"DownloadClientCategory": "Download Client Category",
"DownloadClientPriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.",
"DownloadClientQbittorrentSettingsContentLayout": "Content Layout",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Whether to use qBittorrent's configured content layout, the original layout from the torrent or always create a subfolder (qBittorrent 4.3.2+)",
"DownloadClientSettings": "Download Client Settings",
"DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures",
"DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}",

View File

@@ -13,7 +13,7 @@
"DownloadClientStatusCheckSingleClientMessage": "Gestores de descargas no disponibles debido a errores: {0}",
"DownloadClientStatusCheckAllClientMessage": "Los gestores de descargas no están disponibles debido a errores",
"DownloadClients": "Gestores de Descargas",
"Delete": "Borrar",
"Delete": "Eliminar",
"Dates": "Fechas",
"Date": "Fecha",
"CustomFilters": "Filtros Personalizados",
@@ -137,7 +137,7 @@
"DeleteTag": "Borrar Etiqueta",
"DeleteNotification": "Borrar Notificación",
"DeleteDownloadClient": "Borrar Gestor de Descargas",
"DeleteBackup": "Borrar Backup",
"DeleteBackup": "Eliminar copia de seguridad",
"DBMigration": "Migración de DB",
"CloneProfile": "Clonar Perfil",
"ClientPriority": "Prioridad del Cliente",
@@ -351,7 +351,7 @@
"UserAgentProvidedByTheAppThatCalledTheAPI": "User-Agent proporcionado por la aplicación llamó a la API",
"InstanceName": "Nombre de Instancia",
"InstanceNameHelpText": "Nombre de instancia en pestaña y para nombre de aplicación en Syslog",
"Database": "Base de Datos",
"Database": "Base de datos",
"Duration": "Duración",
"LastDuration": "Duración",
"LastExecution": "Última ejecución",
@@ -492,5 +492,12 @@
"Id": "Id",
"EditCategory": "Editar categoría",
"EditSyncProfile": "Editar perfil de sincronización",
"EnableIndexer": "Habilitar indexador"
"EnableIndexer": "Habilitar indexador",
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
"DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido",
"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+)",
"EnableRssHelpText": "Habilitar feed Rss para indexador",
"days": "días",
"ElapsedTime": "Tiempo transcurrido",
"GrabTitle": "Capturar título"
}

View File

@@ -1,11 +1,11 @@
{
"IndexerProxyStatusCheckSingleClientMessage": "Välityspalvelimet eivät ole käytettävissä virheiden vuoksi: {0}",
"Logging": "Kirjaus",
"LogLevel": "Kirjauksen taso",
"LogLevel": "Lokikirjauksen laajuus",
"MovieIndexScrollTop": "Elokuvakirjasto: vieritä ylös",
"Apply": "Käytä",
"ClientPriority": "Lataustyökalun painotus",
"IndexerPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
"IndexerPriorityHelpText": "Tietolähteen painotus, 1 50 (korkein-alin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
"Manual": "Manuaalinen",
"Add": "Lisää",
"Reload": "Lataa uudelleen",
@@ -27,52 +27,52 @@
"Seeders": "Jakajat",
"TestAll": "Testaa kaikki",
"AddDownloadClient": "Lisää lataustyökalu",
"CustomFilters": "Mukautetut suodattimet",
"CustomFilters": "Omat suodattimet",
"DeleteTag": "Poista tunniste",
"EnableRss": "RSS-syöte",
"Filter": "Suodata",
"Filter": "Suodatus",
"Fixed": "Korjattu",
"FocusSearchBox": "Kohdista hakukenttä",
"ForMoreInformationOnTheIndividualDownloadClients": "Lue lisää lataustyökalusta painamalla 'Lisätietoja'.",
"HideAdvanced": "Piilota edistyneet",
"ForMoreInformationOnTheIndividualDownloadClients": "Saat yksittäisestä lataustyökalusta lisätietoja painamalla sen ohessa olevaa \"Lisätietoja\"-painiketta.",
"HideAdvanced": "Piilota lisäasetukset",
"History": "Historia",
"MIA": "Puuttuu",
"New": "Uusi",
"New": "Uutta",
"PageSizeHelpText": "Sivulla näytettävien kohteiden määrä",
"Proxy": "Välityspalvelin",
"ProxyBypassFilterHelpText": "Käytä erottimena ',' ja '*.' jokerimerkkinä aliverkkotunnuksille (esim. www.esimerkki.fi,*.esimerkki.fi)",
"Reddit": "Reddit",
"Refresh": "Päivitä",
"RefreshMovie": "Päivitä elokuva",
"ReleaseBranchCheckOfficialBranchMessage": "'{0}' ei ole kelvollinen {appName}-julkaisuhaara, et saa päivityksiä sen kautta",
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen.",
"ReleaseBranchCheckOfficialBranchMessage": "\"{0}\" ei ole kelvollinen {appName}-julkaisuhaara ja tämän vuoksi et saa päivityksiä.",
"RestartRequiredHelpTextWarning": "Käyttöönotto vaatii uudelleenkäynnistyksen",
"Result": "Tulos",
"Settings": "Asetukset",
"SettingsLongDateFormat": "Pitkän päiväyksen esitys",
"SettingsShortDateFormat": "Lyhyen päiväyksen esitys",
"UnselectAll": "Poista kaikkien valinta",
"UnselectAll": "Tyhjennä valinnat",
"UpdateCheckStartupTranslocationMessage": "Päivitystä ei voi asentaa, koska käynnistyskansio '{0}' sijaitsee 'App Translocation' -kansiossa.",
"UpdateCheckUINotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käyttöliittymäkansioon '{0}'.",
"UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai omaa komentosarjaasi.",
"UpdateCheckUINotWritableMessage": "Päivityksen asennus ei onnistu, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käyttöliittymäkansioon \"{0}\".",
"UpdateMechanismHelpText": "Käytä {appName}in sisäänrakennettua päivitystoimintoa tai komentosarjaa.",
"Enable": "Käytä",
"UI": "Käyttöliittymä",
"UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.",
"UrlBaseHelpText": "Lisää {appName}in URL-osoitteeseen jälkiliitteen, esim. \"http://[osoite]:[portti]/[URL-perusta]\". Oletusarvo on tyhjä.",
"Usenet": "Usenet",
"BackupNow": "Varmuuskopioi nyt",
"NoBackupsAreAvailable": "Varmuuskopioita ei ole saatavilla",
"UpdateCheckStartupNotWritableMessage": "Päivitystä ei voi asentaa, koska käyttäjällä '{1}' ei ole kirjoitusoikeutta käynnistyskansioon '{0}'.",
"NoBackupsAreAvailable": "Varmuuskopioita ei ole käytettävissä",
"UpdateCheckStartupNotWritableMessage": "Päivitystä ei voida asentaa, koska käyttäjällä \"{1}\" ei ole kirjoitusoikeutta käynnistyskansioon \"{0}\".",
"Updates": "Päivitykset",
"UpdateScriptPathHelpText": "Polku komentosarjaan, joka käsittelee puretun päivitystiedoston ja hoitaa asennuksen loppuosuuden.",
"Uptime": "Käyttöaika",
"URLBase": "URL-perusta",
"UseProxy": "Käytä välityspalvelinta",
"Username": "Käyttäjätunnus",
"YesCancel": "Kyllä, peruuta",
"YesCancel": "Kyllä, peru",
"NoTagsHaveBeenAddedYet": "Tunnisteita ei ole vielä lisätty.",
"ApplyTags": "Tunnistetoimenpide",
"Authentication": "Todennus",
"AuthenticationMethodHelpText": "Vaadi käyttäjätunnus ja salasana {appName}in käyttöön.",
"BindAddressHelpText": "Toimiva IP-osoite, \"localhost\" tai \"*\" (tähti) kaikille verkkoliitännöille.",
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.",
"BindAddressHelpText": "Toimiva IP-osoite, localhost tai * (tähti) kaikille verkkoliitännöille.",
"Close": "Sulje",
"DeleteNotification": "Poista kytkentä",
"Docker": "Docker",
@@ -81,11 +81,11 @@
"Search": "Haku",
"Details": "Tiedot",
"InteractiveSearch": "Vuorovaikutteinen haku",
"Interval": "Aikaväli",
"Interval": "Ajoitus",
"KeyboardShortcuts": "Pikanäppäimet",
"LastWriteTime": "Viimeisin kirjoitusaika",
"LastWriteTime": "Edellinen tallennusaika",
"LogFiles": "Lokitiedostot",
"LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulisi käyttää vain väliaikaisesti",
"LogLevelTraceHelpTextWarning": "Jäljityskirjausta tulee käyttää vain tilapäisesti.",
"Logs": "Lokitiedot",
"Mechanism": "Mekanismi",
"Name": "Nimi",
@@ -94,14 +94,14 @@
"Presets": "Esiasetukset",
"Priority": "Painotus",
"Protocol": "Protokolla",
"ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}",
"ProxyCheckBadRequestMessage": "Välityspalvelintesti epäonnistui. Tilakoodi: {0}.",
"ProxyCheckFailedToTestMessage": "Välityspalvelintesti epäonnistui: {0}",
"ProxyCheckResolveIpMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.",
"ProxyPasswordHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
"ProxyType": "Välityspalvelimen tyyppi",
"ProxyUsernameHelpText": "Käyttäjätunnus ja salasana tulee syöttää vain tarvittaessa. Muussa tapauksessa jätä kentät tyhjiksi.",
"Queue": "Jono",
"ReadTheWikiForMoreInformation": "Lue lisätietoja Wikistä",
"ReadTheWikiForMoreInformation": "Wikistä löydät lisää tietoja",
"ReleaseStatus": "Julkaisutila",
"RemovedFromTaskQueue": "Poistettu tehtäväjonosta",
"RemoveFilter": "Poista suodatin",
@@ -117,15 +117,15 @@
"Security": "Suojaus",
"SuggestTranslationChange": "Ehdota käännösmuutosta",
"System": "Järjestelmä",
"SystemTimeCheckMessage": "Järjestelmän aika on pielessä yli vuorokauden. Ajoitetut tehtävät eivät luultavasti toimi oikein ennen sen korjausta.",
"SystemTimeCheckMessage": "Järjestelmän ajassa on ainakin vuorokauden heitto eivätkä ajoitetut tehtävät tämän vuoksi toimi oikein ennen kuin se on korjattu.",
"TagCannotBeDeletedWhileInUse": "Tunnistetta ei voi poistaa, koska se on käytössä",
"TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.",
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa sellaiset tunnisteet, joita ei ole määritetty millekään kohteelle.",
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.",
"Tasks": "Tehtävät",
"Test": "Kokeile",
"TestAllClients": "Testaa kaikki lataustyökalut",
"Time": "Aika",
"Title": "Nimi",
"Title": "Nimike",
"Tomorrow": "Huomenna",
"Torrent": "Torrent",
"Torrents": "Torrentit",
@@ -133,29 +133,29 @@
"UILanguage": "Käyttöliittymän kieli",
"UnableToAddANewApplicationPleaseTryAgain": "Uuden sovelluksen lisäys epäonnistui. Yritä uudelleen.",
"UnableToAddANewIndexerPleaseTryAgain": "Uuden tietolähteen lisäys epäonnistui. Yritä uudelleen.",
"UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tietolähdevälityspalvelimen lisäys epäonnistui. Yritä uudelleen.",
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui.",
"UnableToLoadDownloadClients": "Lataustyökalujen lataus eonnistui.",
"UnableToAddANewIndexerProxyPleaseTryAgain": "Uuden tiedonhaun välityspalvelimen lisäys epäonnistui. Yritä uudelleen.",
"UnableToLoadBackups": "Varmuuskopioiden lataus epäonnistui",
"UnableToLoadDownloadClients": "Lataustyökalujen lataus ei onistu",
"UnableToLoadGeneralSettings": "Yleisten asetusten lataus epäonnistui.",
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit edelleen asentaa ne myös lähteestä System:Updates.",
"Added": "Lisätty",
"UpdateAutomaticallyHelpText": "Lataa ja asenna päivitykset automaattisesti. Voit myös edelleen suorittaa asennuksen järjestelmäasetusten päivitykset-osiosta.",
"Added": "Lisäysaika",
"AddIndexer": "Lisää tietolähde",
"AddingTag": "Tunniste lisätään",
"Age": "Ikä",
"All": "Kaikki",
"AllIndexersHiddenDueToFilter": "Aktiivinen suodatin on piilottanut kaikki tietolähteet.",
"Analytics": "Analytiikka",
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja palvelimillemme. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
"AnalyticsEnabledHelpText": "Lähetä nimettömiä käyttö- ja virhetietoja {appName}in palvelimille. Tämä sisältää tietoja selaimestasi, käyttöliittymän sivujen käytöstä, virheraportoinnista, käyttöjärjestelmästä ja suoritusalustasta. Käytämme näitä tietoja ominaisuuksien ja vikakorjausten painotukseen.",
"ApiKey": "API-avain",
"AppDataDirectory": "AppData-kansio",
"DBMigration": "Tietokannan siirto",
"Delete": "Poista",
"DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa välityspalvelimen '{0}'?",
"DeleteNotificationMessageText": "Haluatko varmasti poistaa kytkennän '{0}'?",
"DeleteIndexerProxyMessageText": "Haluatko varmasti poistaa tietolähdevälityspalvelimen \"{name}\"?",
"DeleteNotificationMessageText": "Haluatko varmasti poistaa ilmoituspalvelun \"{name}\"?",
"Disabled": "Ei käytössä",
"DownloadClients": "Lataustyökalut",
"DownloadClientSettings": "Lataustyökalujen asetukset",
"DownloadClientStatusCheckAllClientMessage": "Yhtään lataustyökalua ei ole virheiden vuoksi käytettävissä",
"DownloadClientStatusCheckAllClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä",
"Mode": "Tila",
"MoreInfo": "Lisätietoja",
"SelectAll": "Valitse kaikki",
@@ -166,30 +166,30 @@
"ShowSearchHelpText": "Näytä hakupainike osoitettaessa.",
"Shutdown": "Sammuta",
"Size": "Koko",
"Sort": "Järjestä",
"Sort": "Järjestys",
"UnableToAddANewDownloadClientPleaseTryAgain": "Uuden lataustyökalun lisäys epäonnistui. Yitä uudelleen.",
"AppDataLocationHealthCheckMessage": "Päivitystä ei sallita, jotta AppData-kansion poisto päivityksen yhteydessä voidaan estää.",
"AppDataLocationHealthCheckMessage": "Päivityksiä ei sallita, jotta AppData-kansion poistaminen päivityksen yhteydessä voidaan estää.",
"UnableToLoadHistory": "Historian lataus epäonnistui.",
"UnableToLoadNotifications": "Kytkentöjen lataus epäonnistui.",
"UnableToLoadTags": "Tunnisteiden lataus eonnistui.",
"UnableToLoadTags": "Tunnisteiden lataus ei onnistu",
"UnableToLoadUISettings": "Käyttöliittymän asetuksien lataus epäonnistui.",
"UnsavedChanges": "Tallentamattomia muutoksia",
"Yesterday": "Eilen",
"ConnectionLost": "Yhteys on katkennut",
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun '{0}'?",
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen '{0}'?",
"DeleteDownloadClientMessageText": "Haluatko varmasti poistaa lataustyökalun \"{name}\"?",
"DeleteTagMessageText": "Haluatko varmasti poistaa tunnisteen \"{label}\"?",
"Discord": "Discord",
"Donations": "Lahjoitukset",
"Edit": "Muokkaa",
"EnableAutomaticSearchHelpText": "Profiilia käytetään automaattihauille, jotka suoritetaan käyttöliittymästä tai {appName}in toimesta.",
"Enabled": "Käytössä",
"EventType": "Tapahtumatyyppi",
"EventType": "Tapahtuman tyyppi",
"Exception": "Poikkeus",
"FeatureRequests": "Kehitysehdotukset",
"Grabbed": "Siepattu",
"IgnoredAddresses": "Ohitetut osoitteet",
"IllRestartLater": "Käynnistän uudelleen myöhemmin",
"Info": "Tiedot",
"Info": "Informatiivinen",
"LaunchBrowserHelpText": " Avaa {appName}in verkkokäyttöliittymä verkkoselaimeen sovelluksen käynnistyksen yhteydessä.",
"NoChanges": "Ei muutoksia",
"NoLeaveIt": "Ei, anna olla",
@@ -198,36 +198,36 @@
"Save": "Tallenna",
"SaveChanges": "Tallenna muutokset",
"SaveSettings": "Tallenna asetukset",
"Scheduled": "Ajoitettu",
"SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin",
"Scheduled": "Ajoitukset",
"SettingsEnableColorImpairedModeHelpText": "Vaihtoehtoinen tyyli, joka auttaa erottamaan värikoodatut tiedot paremmin.",
"SettingsShowRelativeDates": "Suhteellisten päiväysten esitys",
"SettingsShowRelativeDatesHelpText": "Näytä suhteutetut (tänään/eilen/yms.) absoluuttisten sijaan",
"ShowSearch": "Näytä haku",
"Source": "Lähde",
"Source": "Lähdekoodi",
"SSLPort": "SSL-portti",
"StartTypingOrSelectAPathBelow": "Aloita kirjoitus tai valitse sijainti alta",
"StartupDirectory": "Käynnistyskansio",
"TableOptions": "Taulukkoasetukset",
"TableOptions": "Taulukkonäkymän asetukset",
"TableOptionsColumnsMessage": "Valitse näytettävät sarakkeet ja niiden järjestys",
"TagsHelpText": "Käytetään vähintään yhdellä täsmäävällä tunnisteella merkityille tietolähteille. Käytä kaikille jättämällä tyhjäksi.",
"UnableToAddANewAppProfilePleaseTryAgain": "Uuden sovellusprofiilin lisäys epäonnistui. Yritä uudelleen.",
"UnableToAddANewNotificationPleaseTryAgain": "Kytkennän lisäys epäonnistui. Yritä uudelleen.",
"Version": "Versio",
"View": "Näytä",
"Warn": "Varoita",
"View": "Näkymä",
"Warn": "Varoitus",
"Wiki": "Wiki",
"Port": "Portti",
"Automatic": "Automaattinen",
"AutomaticSearch": "Automaattihaku",
"Backup": "Varmuuskopio",
"BackupFolderHelpText": "Suhteelliset polut kohdistuvat sovelluksen AppData-kansioon.",
"BackupIntervalHelpText": "Automaattisen varmuuskopioinnin aikaväli",
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat automaattiset varmuuskopiot poistetaan automaattisesti.",
"Backup": "Varmuuskopiointi",
"BackupFolderHelpText": "Suhteelliset tiedostosijainnit ovat {appName}in AppData-kansiossa.",
"BackupIntervalHelpText": "Tietokannan ja asetusten automaattisen varmuuskopioinnin ajoitus.",
"BackupRetentionHelpText": "Säilytysjaksoa vanhemmat varmuuskopiot siivotaan automaattisesti.",
"Backups": "Varmuuskopiot",
"BeforeUpdate": "Ennen päivitystä",
"BindAddress": "Sidososoite",
"Branch": "Kehityshaara",
"BranchUpdate": "Sovelluksen versiopäivityksiin käytettävä kehityshaara.",
"BranchUpdate": "{appName}in versiopäivityksiin käytettävä kehityshaara.",
"BranchUpdateMechanism": "Ulkoisen päivitysratkaisun käyttämä kehityshaara.",
"BypassProxyForLocalAddresses": "Ohjaa paikalliset osoitteet välityspalvelimen ohi",
"Cancel": "Peruuta",
@@ -244,19 +244,19 @@
"ConnectSettings": "Kytkentöjen asetukset",
"CouldNotConnectSignalR": "SignalR-kirjastoa ei tavoitettu, eikä käyttöliittymää päivitetä",
"Custom": "Mukautettu",
"DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{0}\"?",
"DeleteApplicationMessageText": "Haluatko varmasti poistaa sovelluksen \"{name}\"?",
"DeleteBackup": "Poista varmuuskopio",
"DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion '{0}'?",
"DeleteBackupMessageText": "Haluatko varmasti poistaa varmuuskopion \"{name}\"?",
"DeleteDownloadClient": "Poista lataustyökalu",
"DownloadClientStatusCheckSingleClientMessage": "Lataustyökalut eivät ole virheiden vuoksi käytettävissä: {0}",
"DownloadClientStatusCheckSingleClientMessage": "Lataustyökaluja ei ole ongelmien vuoksi käytettävissä: {0}",
"EditIndexer": "Muokkaa tietolähdettä",
"EnableAutomaticSearch": "Automaattihaku",
"EnableInteractiveSearch": "Vuorovaikutteinen haku",
"EnableAutomaticSearch": "Käytä automaattihakua",
"EnableInteractiveSearch": "Käytä vuorovaikutteista hakua",
"EnableInteractiveSearchHelpText": "Profiilia käytetään vuorovaikutteisen haun yhteydessä.",
"EnableSSL": "SSL-salaus",
"EnableSslHelpText": " Käyttöönotto edellyttää uudelleenkäynnistystä järjestelmänvalvojan oikeuksilla.",
"EnableSslHelpText": " Käyttöönotto vaatii uudelleenkäynnistyksen järjestelmänvavojan oikeuksilla.",
"Error": "Virhe",
"ErrorLoadingContents": "Sisällönlatauksen virhe",
"ErrorLoadingContents": "Virhe ladattaessa sisältöjä",
"Events": "Tapahtumat",
"ExistingTag": "Olemassa oleva tunniste",
"Failed": "Epäonnistui",
@@ -267,9 +267,9 @@
"GeneralSettings": "Yleiset asetukset",
"GeneralSettingsSummary": "Portti, SSL-salaus, käyttäjänimi ja salasana, välityspalvelin, analytiikka ja päivitykset.",
"Grabs": "Sieppaukset",
"Health": "Kunto",
"Health": "Terveys",
"Level": "Taso",
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia.",
"HealthNoIssues": "Kokoonpanossasi ei ole ongelmia",
"HomePage": "Verkkosivusto",
"Host": "Osoite",
"Hostname": "Osoite",
@@ -283,7 +283,7 @@
"IndexerStatusCheckAllClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi",
"IndexerStatusCheckSingleClientMessage": "Tietolähteet eivät ole käytettävissä virheiden vuoksi: {0}",
"NoChange": "Ei muutosta",
"NoLogFiles": "Ei lokitiedostoja",
"NoLogFiles": "Lokitiedostoja ei ole",
"SSLCertPasswordHelpText": "PFX-tiedoston salasana",
"SSLCertPath": "SSL-varmenteen sijainti",
"SSLCertPathHelpText": "PFX-tiedoston sijainti",
@@ -295,28 +295,28 @@
"OnHealthIssueHelpText": "Kuntoon liittyvä ongelma",
"OpenBrowserOnStart": "Avaa selain käynnistettäessä",
"OpenThisModal": "Avaa tämä ikkuna",
"Options": "Valinnat",
"PackageVersion": "Pakettiversio",
"Options": "Asetukset",
"PackageVersion": "Paketin versio",
"PageSize": "Sivun koko",
"Password": "Salasana",
"PendingChangesDiscardChanges": "Hylkää muutokset ja poistu",
"PortNumber": "Portti",
"PortNumber": "Portin numero",
"RestoreBackup": "Palauta varmuuskopio",
"Retention": "Säilytys",
"UILanguageHelpText": "Käyttöliittymä näytetään tällä kielellä.",
"UILanguageHelpTextWarning": "Käyttöönotto vaatii selaimen sivupäivityksen.",
"UILanguageHelpText": "{appName}in käyttöliittymän kieli.",
"UILanguageHelpTextWarning": "Selaimen sivupäivitys vaaditaan",
"UISettings": "Käyttöliittymän asetukset",
"DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävien lataustyökalujen määritykset.",
"DownloadClientsSettingsSummary": "{appName}in käyttöliittymästä suoritettavien hakujen yhteydessä käytettävät lataustyökalumääritykset.",
"ProwlarrSupportsAnyDownloadClient": "{appName} tukee alla listatuja lataustyökaluja.",
"AddDownloadClientToProwlarr": "Lisäämällä lataustyökalun {appName} voi käynnistää lataukset suoraan käyttöliittymästä manuaalisen haun yhteydessä.",
"RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja ohjaa sieppaus suoraan sen sijaan, että se välitettäisiin Prowlarin kautta.",
"RedirectHelpText": "Uudelleenohjaa tietolähteeltä saapuvat latauspyynnöt ja välitä sieppaus suoraan {appName}-välityksen sijaan.",
"FullSync": "Täysi synkronointi",
"SyncLevelFull": "Täysi synkronointi: Pitää sovelluksen tietolähteet täysin synkronoituna. Tietolähteisiin {appName}issa tehdyt muutokset synkronoidaan etäsovelluksen kanssa ja kaikki etäsovelluksessa tehdyt muutokset korvataan seuraavan synkronoinnin yhteydessä.",
"EnableIndexer": "Tietolähteen tila",
"FilterPlaceHolder": "Suodata tietolähteitä",
"IndexerHealthCheckNoIndexers": "Yhtään tietolähdettä ei ole käytössä, eikä {appName} tämän vuoksi löydä tuloksia.",
"IndexerObsoleteCheckMessage": "Tietolähteet ovat vanhentuneita tai niitä on päivitetty: {0}. Poista ja/tai lisää ne Prowlariin uudelleen.",
"IndexerProxy": "Tietolähteen välityspalvelin",
"IndexerObsoleteCheckMessage": "Tietolähteet ovat poistuneet tai ne ovat muuttuneet: {0}. Poista ja/tai lisää ne {appName}iin uudelleen.",
"IndexerProxy": "Tiedonhaun välityspalvelin",
"IndexerSettingsSummary": "Määritä useita globaaleita tietolähdeasetuksia, kuten välityspalvelimia.",
"IndexerVipCheckExpiringClientMessage": "Tietolähteen VIP-edut erääntyvät pian: {0}",
"ProwlarrSupportsAnyIndexer": "{appName} tukee Newznab- ja Torznab-yhteensopivien tietolähteiden ohella myös useita muita lähteitä vaihtoehdoilla \"Yleinen Newznab\" (Usenetille) ja 'Yleinen Torznab' (torrenteille).",
@@ -324,7 +324,7 @@
"AddIndexerProxy": "Lisää tiedonhaun välityspalvelin",
"UISettingsSummary": "Kalenterin, päiväyksen ja kellonajan sekä kielen ja heikentyneelle värinäölle sopivan tilan asetukset.",
"SettingsIndexerLoggingHelpText": "Kirjaa tarkempia tietoja tietolähteiden toiminnasta, mukaanlukien vastaukset",
"IndexerTagsHelpText": "Tunnisteiden avulla voit määrittää tiedonhaun välityspalvelimet, mihin sovelluksiin tietolähteet synkronoidaan tai yksikertaisesti järjestellä tietolähteitäsi.",
"IndexerTagsHelpText": "Tunnisteilla voit kohdistaa tiedonhaun välityspalvelimia ja määrittää mihin sovelluksiin ne synkronoidaan.",
"UnableToLoadAppProfiles": "Sovellusprofiilien lataus epäonnistui",
"AppProfileSelectHelpText": "Sovellusprofiilieilla määritetään tietolähteelle sovellussynkronoinnin yhteydessä aktivoitavat hakutavat (RSS/automaatti/vuorovaikutteinen).",
"IndexerQuery": "Tietolähteen kysely",
@@ -340,7 +340,7 @@
"SyncLevelAddRemove": "Vain lisäys/poisto: Kun {appName}in tietolähteitä lisätään tai poistetaan, päivittyy myös etäsovellus.",
"SyncAppIndexers": "Synkronoi tietolähteet",
"TestAllApps": "Testaa kaikki sovellukset",
"UnableToLoadIndexerProxies": "Tietolähdevälityspalvelimien lataus epäonnistui",
"UnableToLoadIndexerProxies": "Tiedonhaun välityspalvelimia ei voitu ladata",
"AddedToDownloadClient": "Julkaisu lisättiin lataustyökaluun",
"AddNewIndexer": "Lisää uusi tietolähde",
"AddToDownloadClient": "Lisää julkaisu lataustyökaluun",
@@ -356,7 +356,7 @@
"DevelopmentSettings": "Kehittäjäasetukset",
"Description": "Kuvaus",
"Id": "Tunniste",
"SettingsConsoleLogLevel": "Valvontalokin taso",
"SettingsConsoleLogLevel": "Valvontalokin laajuus",
"SettingsFilterSentryEvents": "Suodata analytiikan tapahtumia",
"SettingsFilterSentryEventsHelpText": "Suodata tunnetut käyttäjävirheet pois analytiikkalähetyksistä",
"Applications": "Sovellukset",
@@ -367,10 +367,10 @@
"ClearHistory": "Tyhjennä historia",
"ClearHistoryMessageText": "Haluatko varmasti tyhjentää kaiken {appName}-historian?",
"Connect": "Kytkennät",
"EnableRssHelpText": "Tietolähde sisällytetään RSS-syötteeseen.",
"EnableRssHelpText": "Käytä tietolähteelle RSS-syötettä.",
"DeleteApplication": "Poista sovellus",
"DeleteAppProfile": "Poista sovellusprofiili",
"IndexerProxies": "Tietolähteiden välityspalvelimet",
"IndexerProxies": "Tiedonhaun välityspalvelimet",
"IndexerAuth": "Tietolähteen todennus",
"Notifications": "Kytkennät",
"NotificationTriggersHelpText": "Valitse tapahtumat, jotka aiheuttavat ilmoituksen.",
@@ -386,7 +386,7 @@
"QueryOptions": "Kyselyasetukset",
"TvSearch": "Etsi televisiosarjoja",
"Filters": "Suodattimet",
"OnGrab": "Kun elokuva siepataan",
"OnGrab": "Kun julkaisu siepataan",
"OnHealthIssue": "Kun havaitaan kuntoon liittyvä ongelma",
"HistoryCleanupDaysHelpText": "Poista automaattinen tyhjennys käytöstä asettamalla arvoksi '0'.",
"HistoryCleanupDaysHelpTextWarning": "Tässä määritettyä aikaa vanhemmat tiedostot poistetaan automaattisesti roskakorista pysyvästi.",
@@ -435,17 +435,17 @@
"EditSyncProfile": "Muokkaa synkronointiprofiilia",
"InstanceName": "Instanssin nimi",
"InstanceNameHelpText": "Instanssin nimi välilehdellä ja järjestelmälokissa",
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasu. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
"ThemeHelpText": "Vaihda sovelluksen käyttöliittymän ulkoasua. \"Automaattinen\" vaihtaa vaalean ja tumman tilan välillä järjestelmän teeman mukaan. Innoittanut Theme.Park.",
"Duration": "Kesto",
"ElapsedTime": "Kulunut aika",
"EnabledRedirected": "Kulunut, uudelleenohjattu",
"Ended": "Päättynyt",
"Ended": "Päättyi",
"GrabTitle": "Sieppaa nimike",
"LastExecution": "Edellinen suoritus",
"LastDuration": "Edellinen kesto",
"NextExecution": "Seuraava suoritus",
"Parameters": "Parametrit",
"Queued": "Jonossa",
"Queued": "Lisätty jonoon",
"Started": "Alkoi",
"ApplicationLongTermStatusCheckAllClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi.",
"ApplicationLongTermStatusCheckSingleClientMessage": "Sovellukset eivät ole käytettävissä yli 6 tuntia kestäneiden virheiden vuoksi: {0}",
@@ -457,26 +457,26 @@
"Remove": "Poista",
"Replace": "Korvaa",
"TheLatestVersionIsAlreadyInstalled": "{appName}in uusin versio on jo asennettu",
"ApplicationURL": "Sovelluksen URL-osoite",
"ApplicationUrlHelpText": "Sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.",
"Track": "Jäljitys",
"CountIndexersSelected": "{0} valittua tietolähdettä",
"DeleteSelectedDownloadClients": "Poista lataustyökalu",
"DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
"DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
"DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa tietolähteen '{0}'?",
"ApplicationURL": "Sovelluksen URL",
"ApplicationUrlHelpText": "Tämän sovelluksen ulkoinen URL-osoite, johon sisältyy http(s)://, portti ja URL-perusta.",
"Track": "Valvo",
"CountIndexersSelected": "{count} tietolähde(ttä) on valittu",
"DeleteSelectedDownloadClients": "Poista lataustyökalu(t)",
"DeleteSelectedApplicationsMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) sovellu(sta/ksen)?",
"DeleteSelectedDownloadClientsMessageText": "Haluatko varmasti poistaa {count} valit(n/tua) lataustyökalu(n/a)?",
"DeleteSelectedIndexersMessageText": "Haluatko varmasti poistaa {count} valit(un/tua) tietoläh(teen/dettä)?",
"Publisher": "Julkasija",
"SelectIndexers": "Etsi tietolähteistä",
"SelectIndexers": "Valitse tietolähteet",
"Year": "Vuosi",
"Genre": "Tyylilajit",
"Genre": "Lajityyppi",
"More": "Lisää",
"Season": "Kausi",
"ApplyTagsHelpTextAdd": " 'Lisää' syötetyt tunnisteet aiempiin tunnisteisiin",
"ApplyTagsHelpTextHowToApplyApplications": "Tunnistetoimenpiteiden selitykset:",
"ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteisiin kohdistettavat toimenpiteet:",
"ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet.",
"ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi.",
"DownloadClientPriorityHelpText": "Tietolähteen painotus: 1 (korkein) - 50 (matalin). Oletusarvo on 25. Käytetään muutoin tasaveroisten julkaisujen sieppauspäätökseen. Kaikkia käytössä olevia tietolähteitä käytetään edelleen RSS-synkronointiin ja hakuun.",
"ApplyTagsHelpTextAdd": " \"Lisää\" syötetyt tunnisteet aiempiin tunnisteisiin",
"ApplyTagsHelpTextHowToApplyApplications": "Tunnisteiden käyttäminen valituille sovelluksille",
"ApplyTagsHelpTextHowToApplyIndexers": "Tunnisteiden käyttö valituissa tietolähteissä",
"ApplyTagsHelpTextRemove": "- \"Poista\" tyhjentää syötetyt tunnisteet",
"ApplyTagsHelpTextReplace": "- \"Korvaa\" nykyiset tunnisteet syötetyillä tai tyhjennä kaikki tunnisteet jättämällä tyhjäksi",
"DownloadClientPriorityHelpText": "Määritä useiden lataustyökalujen painotus. Tasaveroiset lataajat erotetaan Round-Robin-tekniikalla.",
"Album": "Albumi",
"Artist": "Esittäjä",
"Author": "Kirjailija",
@@ -485,24 +485,47 @@
"Episode": "Jakso",
"Label": "Tunniste",
"Theme": "Teema",
"ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai sitä voidaan yrittää manuaalisesti painamalla alta \"Lataa uudelleen\".",
"DeleteAppProfileMessageText": "Haluatko varmasti poistaa laatuprofiilin '{0}'?",
"RecentChanges": "Viimeaikaiset muutokset",
"WhatsNew": "Mikä on uutta?",
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja käytettävyyden palauttamiseksi se on ladattava uudelleen.",
"minutes": "Minuuttia",
"ConnectionLostReconnect": "{appName} pyrkii ajoittain muodostamaan yhteyden automaattisesti tai voit painaa alta \"Lataa uudelleen\".",
"DeleteAppProfileMessageText": "Haluatko varmasti poistaa sovellusprofiilin \"{name}\"?",
"RecentChanges": "Viimeisimmät muutokset",
"WhatsNew": "Mi uutta?",
"ConnectionLostToBackend": "{appName} kadotti yhteyden taustajärjestelmään ja se on käynnistettävä uudelleen.",
"minutes": "minuuttia",
"AddConnection": "Lisää yhteys",
"NotificationStatusAllClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi",
"NotificationStatusSingleClientHealthCheckMessage": "Sovellukset eivät ole käytettävissä virheiden vuoksi: {0}",
"AuthBasic": "Perus (selaimen ponnahdus)",
"NotificationStatusAllClientHealthCheckMessage": "Kaikki ilmoitukset eivät ole ongelmien vuoksi käytettävissä",
"NotificationStatusSingleClientHealthCheckMessage": "Ilmoitukset eivät ole ongelmien vuoksi käytettävissä: {0}",
"AuthBasic": "Perus (ponnahdusikkuna)",
"AuthForm": "Lomake (kirjautumissivu)",
"DisabledForLocalAddresses": "Ei käytetä paikallisille osoittelle",
"DisabledForLocalAddresses": "Ei käytetä paikallisille osoitteille",
"None": "Ei mitään",
"ResetAPIKeyMessageText": "Haluatko varmasti uudistaa API-avaimesi?",
"TotalIndexerSuccessfulGrabs": "Onnistuneiden tietolähdesieppausten kokonaismäärä",
"AppUpdated": "{appName} on päivitetty",
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on ladattava uudelleen.",
"AppUpdatedVersion": "{appName} on päivitetty versioon {version} ja muutosten käyttöönottamiseksi se on käynnistettävä uudelleen.",
"IndexerDownloadClientHelpText": "Määritä tämän tietolähteen kanssa käytettävä lataustyökalu",
"AuthenticationRequiredWarning": "Etäkäytön estämiseksi ilman tunnistautumista {appName} vaatii nyt todennuksen käyttöönoton. Todennus voidaan poistaa käytöstä paikallisille osoitteille.",
"TotalGrabs": "Sieppausten kokonaismäärä"
"TotalGrabs": "Sieppausten kokonaismäärä",
"AddDownloadClientImplementation": "Lisäätään lataustyökalua - {implementationName}",
"AddIndexerImplementation": "Lisätään tietolähdettä - {implementationName}",
"OnGrabHelpText": "Kun julkaisu siepataan",
"ManageDownloadClients": "Hallitse lataustyökaluja",
"NoDownloadClientsFound": "Lataustyökaluja ei löytynyt",
"CountDownloadClientsSelected": "{count} lataustyökalu(a) on valittu",
"EditSelectedDownloadClients": "Muokkaa valittuja lataustyökaluja",
"IndexerDownloadClientHealthCheckMessage": "Tietolähteet virheellisillä lataustyökaluilla: {0}.",
"AddIndexerProxyImplementation": "Lisää tiedonhaun välityspalvelin - {implementationName}",
"EditIndexerProxyImplementation": "Muokkaa tiedonhaun välityspalvelinta - {implementationName}",
"EditDownloadClientImplementation": "Muokataan lataustyökalua - {implementationName}",
"AddCustomFilter": "Lisää oma suodatin",
"ApplyChanges": "Toteuta muutokset",
"EditSelectedIndexers": "Muokkaa valittuja sisältölähteitä",
"NoHistoryFound": "Historiaa ei löytynyt",
"NoIndexersFound": "Tietolähteitä ei löytynyt",
"StopSelecting": "Lopeta valitseminen",
"EditConnectionImplementation": "Muokataan kytköstä - {implementationName}",
"AddConnectionImplementation": "Lisätään kytköstä - {implementationName}",
"DownloadClientQbittorrentSettingsContentLayout": "Sisällön asettelu",
"EditIndexerImplementation": "Muokataan tietolähdettä - {implementationName}",
"AuthenticationRequiredUsernameHelpTextWarning": "Syötä uusi käyttäjätunnus",
"DefaultNameCopiedProfile": "{name} - Kopioi"
}

View File

@@ -28,14 +28,14 @@
"About": "À propos",
"IndexerStatusCheckSingleClientMessage": "Indexeurs indisponibles en raison d'échecs : {0}",
"DownloadClientStatusCheckSingleClientMessage": "Clients de Téléchargement indisponibles en raison d'échecs: {0}",
"SetTags": "Définir des balises",
"SetTags": "Définir des étiquettes",
"ReleaseStatus": "Statut de la version",
"UpdateCheckUINotWritableMessage": "Impossible d'installer la mise à jour car le dossier d'interface utilisateur '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.",
"UpdateCheckStartupTranslocationMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' se trouve dans un dossier App Translocation.",
"UpdateCheckStartupNotWritableMessage": "Impossible d'installer la mise à jour car le dossier de démarrage '{0}' n'est pas accessible en écriture par l'utilisateur '{1}'.",
"UnselectAll": "Tout désélectionner",
"UISettingsSummary": "Date, langue, et perceptions des couleurs",
"TagsSettingsSummary": "Voir toutes les balises et comment elles sont utilisées. Les balises inutilisées peuvent être supprimées",
"TagsSettingsSummary": "Voir toutes les étiquettes et comment elles sont utilisées. Les étiquettes inutilisées peuvent être supprimées",
"Style": "Style",
"Status": "État",
"Sort": "Trier",
@@ -107,7 +107,7 @@
"Reload": "Recharger",
"Peers": "Peers",
"PageSize": "Pagination",
"Ok": "Ok",
"Ok": "OK",
"OAuthPopupMessage": "Les pop-ups sont bloquées par votre navigateur",
"Name": "Nom",
"Message": "Message",
@@ -482,7 +482,7 @@
"Author": "Auteur",
"AverageResponseTimesMs": "Temps de réponse moyen des indexeurs (ms)",
"IndexerFailureRate": "Taux d'échec de l'indexeur",
"Label": "Label",
"Label": "Libel",
"More": "Plus",
"Publisher": "Éditeur",
"Season": "Saison",
@@ -595,7 +595,7 @@
"AuthenticationRequiredUsernameHelpTextWarning": "Saisir un nouveau nom d'utilisateur",
"Clone": "Cloner",
"PackSeedTime": "Temps de Seed",
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune balise ou qui ont une ou plusieurs balises correspondantes",
"ApplicationTagsHelpText": "Synchroniser les indexeurs avec cette application qui n'ont aucune étiquette ou qui ont une ou plusieurs étiquettes correspondantes",
"OnHealthRestored": "Sur la santé restaurée",
"OnHealthRestoredHelpText": "Sur la santé restaurée",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmer le nouveau mot de passe",

View File

@@ -1,7 +1,7 @@
{
"About": "Névjegy",
"Analytics": "Analitika",
"AddIndexer": "Indexer hozzáadása",
"AddIndexer": "Indexe hozzáadása",
"AddingTag": "Címke hozzáadása",
"Error": "Hiba",
"DeleteTag": "Címke Törlése",
@@ -9,7 +9,7 @@
"EnableAutomaticSearch": "Engedélyezd az Automatikus Keresést",
"Enable": "Aktiválás",
"EditIndexer": "Indexer Szerkesztése",
"Edit": "Szerkesztés",
"Edit": "szerkeszt",
"DownloadClientStatusCheckSingleClientMessage": "Letöltőkliens hiba miatt nem elérhető: {0}",
"DownloadClientStatusCheckAllClientMessage": "Az összes letöltőkliens elérhetetlen, hiba miatt",
"DownloadClientsSettingsSummary": "Letöltőkliens konfigurációja a {appName} felhasználói felület keresésbe történő integráláshoz",
@@ -17,15 +17,15 @@
"DownloadClients": "Letöltőkliensek",
"DownloadClient": "Letöltési Kliens",
"Docker": "Docker",
"Disabled": "Letiltott",
"Details": "Részletek",
"Disabled": "Tiltva",
"Details": "részletek",
"DeleteTagMessageText": "Biztosan törlöd a(z) „{0}” címkét?",
"DeleteNotificationMessageText": "Biztosan törlöd a(z) „{0}” értesítést?",
"DeleteNotification": "Értesítés Törlése",
"DeleteDownloadClientMessageText": "Biztosan törlöd a(z) „{0}” letöltő klienst?",
"DeleteDownloadClient": "Letöltőkliens Törlése",
"DeleteBackupMessageText": "Biztosan törlöd a(z) „{0}” biztonsági mentést?",
"DeleteBackup": "Biztonsági Mentés Törlése",
"DeleteDownloadClient": "Letöltőkliens törlése",
"DeleteBackupMessageText": "Biztosan törli a '{name}' biztonsági mentést?",
"DeleteBackup": "Biztonsági Mentés törlése",
"Delete": "Törlés",
"DBMigration": "DB Migráció",
"Dates": "Dátumok",
@@ -46,7 +46,7 @@
"ChangeHasNotBeenSavedYet": "A változások még nem lettek elmentve",
"CertificateValidationHelpText": "Módosítsa a HTTPS tanúsítás szigorúságát",
"CertificateValidation": "Tanúsítvány érvényesítése",
"CancelPendingTask": "Biztosan törlöd ezt a függőben lévő feladatot?",
"CancelPendingTask": "Biztosan törölni szeretné ezt a függőben lévő feladatot?",
"Cancel": "Mégse",
"BypassProxyForLocalAddresses": "Proxy megkerülése a helyi hálózatos címekhez",
"BranchUpdateMechanism": "A külső frissítési mechanizmus által használt ágazat",
@@ -54,13 +54,13 @@
"Branch": "Ágazat",
"BindAddressHelpText": "Érvényes IP-cím, localhost vagy '*' minden interfészhez",
"BindAddress": "Kapcsolási Cím",
"BeforeUpdate": "Alkalmazásfrissítés előtt",
"BeforeUpdate": "Frissítés előtt",
"Backups": "Biztonsági mentések",
"BackupRetentionHelpText": "A megőrzési idől régebbi automatikus biztonsági másolatok automatikusan törlésre kerülnek",
"BackupNow": "Biztonsági Mentés Most",
"BackupIntervalHelpText": "Időeltérés a biztonsági mentések között",
"BackupRetentionHelpText": "A megőrzési időszaknál régebbi automatikus biztonsági másolatok automatikusan törlődnek",
"BackupNow": "Biztonsági Mentés",
"BackupIntervalHelpText": "Az automatikus biztonsági mentések közötti időköz",
"BackupFolderHelpText": "Az elérési útvonalak a {appName} AppData könyvtárában lesznek",
"Backup": "Biztonsági Mentés",
"Backup": "biztonsági mentés",
"AutomaticSearch": "Automatikus keresés",
"Automatic": "Automatikus",
"AnalyticsEnabledHelpText": "Küldjön névtelen használati és hibainformációkat a {appName} szervereire. Ez magában foglalja a böngészőjéről szóló információkat, mely {appName} WebUI oldalakat használja, a hibajelentést, valamint az operációs rendszer adatait. Ezeket az információkat a funkciók és a hibajavítások rangsorolására használjuk fel.",
@@ -71,12 +71,12 @@
"ApiKey": "API Kulcs",
"All": "Összes",
"AcceptConfirmationModal": "Változás Megerősítése",
"Apply": "Alkalmazás",
"Apply": "Alkamaz",
"AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges anélkül hogy az AppData ne törlődjön",
"AppDataDirectory": "AppData Mappa",
"AppDataDirectory": "AppData Könyvtár",
"Added": "Hozzáadva",
"Actions": "Teendők",
"History": "Történet",
"History": "Előzmény",
"HideAdvanced": "Haladó Elrejtése",
"HealthNoIssues": "Nincs hiba a konfigurációval",
"Health": "Állapot",
@@ -84,11 +84,11 @@
"ForMoreInformationOnTheIndividualDownloadClients": "Ha többet szeretnél megtudni a különböző letöltési kliensekről, kattints az információs gombokra.",
"Folder": "Mappa",
"FocusSearchBox": "Fókusz Keresőmező",
"Fixed": "Kijavítva",
"Fixed": "Rögzített",
"FilterPlaceHolder": "Filmek Keresése",
"Filter": "Szűrő",
"Files": "Fájl",
"Filename": "Fájlnév",
"Filename": "Fájl név",
"Failed": "Sikertelen",
"ExistingTag": "Meglévő Címke",
"Exception": "Kivétel",
@@ -136,7 +136,7 @@
"Save": "Mentés",
"RSSIsNotSupportedWithThisIndexer": "Az RSS nem támogatott ezzel az indexerrel",
"Retention": "Visszatartás",
"Result": "Eredmények",
"Result": "Eredmény",
"RestoreBackup": "Biztonsági mentés visszaállítása",
"Restore": "Visszaállítás",
"RestartRequiredHelpTextWarning": "Újraindítás szükséges a hatálybalépéshez",
@@ -177,7 +177,7 @@
"PageSizeHelpText": "Az egyes oldalakon megjelenítendő elemek száma",
"PageSize": "Oldal mérete",
"PackageVersion": "Csomagverzió",
"Options": "Opciók",
"Options": "Lehetőségek",
"OpenThisModal": "Nyissa meg ezt a modált",
"OpenBrowserOnStart": "Indításkor nyissa meg a böngészőt",
"OnHealthIssueHelpText": "Állapotprobléma",
@@ -200,9 +200,9 @@
"MIA": "MIA",
"Message": "Üzenet",
"Mechanism": "Mechanizmus",
"Manual": "Manuális",
"Manual": "Kézi",
"MaintenanceRelease": "Karbantartási frissítés: hibajavítások és egyéb fejlesztések. További részletekért lásd: Github Commit History",
"Logs": "Logok",
"Logs": "Naplók",
"LogLevelTraceHelpTextWarning": "A nyomkövetést csak ideiglenesen szabad engedélyezni",
"LogLevel": "Log Szint",
"Logging": "Loggolás",
@@ -239,13 +239,13 @@
"Title": "Cím",
"Time": "Idő",
"TestAllClients": "Összes kliens tesztelése",
"TestAll": "Összes tesztelése",
"TestAll": "Összes Tesztelése",
"Test": "Teszt",
"Tasks": "Feladatok",
"TagsSettingsSummary": "Tekintse meg az összes címkét és azok használatát. A használatlan címkék eltávolíthatók",
"TagsHelpText": "Legalább egy megfelelő címkével rendelkező filmekre vonatkozik",
"Tags": "Címkék",
"TagIsNotUsedAndCanBeDeleted": "A címkét nincs használatban, és törölhető",
"TagIsNotUsedAndCanBeDeleted": "A címke nincs használatban, törölhető",
"TagCannotBeDeletedWhileInUse": "Használat közben nem törölhető",
"TableOptionsColumnsMessage": "Válasszd ki, mely oszlopok legyenek láthatóak, és milyen sorrendben jelenjenek meg",
"SystemTimeCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően",
@@ -257,7 +257,7 @@
"Indexer": "Indexelő",
"IncludeHealthWarningsHelpText": "Tartalmazza a Állapot Figyelmeztetéseket",
"IllRestartLater": "Később Újraindítom",
"IgnoredAddresses": "Ignorált Címek",
"IgnoredAddresses": "Ignorált címek",
"YesCancel": "Igen, Mégsem",
"Warn": "Figyelmeztet",
"View": "Nézet",
@@ -280,7 +280,7 @@
"UnableToLoadUISettings": "Nem sikerült betölteni a felhasználói felület beállításait",
"UnableToLoadTags": "Nem sikerült betölteni a címkéket",
"UnableToLoadNotifications": "Nem sikerült betölteni az Értesítéseket",
"TableOptions": "Táblázat beállításai",
"TableOptions": "Táblázat Beállítások",
"ShowSearch": "Keresés(ek) megjelenítése",
"SetTags": "Címkék beállítása",
"NotificationTriggers": "Értesítés(ek) kiváltója",
@@ -332,7 +332,7 @@
"AppProfileSelectHelpText": "Az alkalmazásprofilok az RSS vezérlésére szolgálnak, Automatikus keresés és Interaktív keresés beállításai az alkalmazás szinkronizálásakor",
"UnableToAddANewApplicationPleaseTryAgain": "Nem lehet új alkalmazást hozzáadni, próbálkozzon újra.",
"UnableToAddANewAppProfilePleaseTryAgain": "Nem lehet új alkalmazásprofilt hozzáadni, próbálkozzon újra.",
"AddDownloadClient": "Letöltőkliens hozzáadása",
"AddDownloadClient": "Letöltési kliens hozzáadása",
"Applications": "Alkalmazások",
"AppProfileInUse": "Használatban lévő alkalmazásprofil",
"Apps": "Appok",
@@ -466,9 +466,9 @@
"ApplyChanges": "Változások alkalmazása",
"ApplyTagsHelpTextReplace": "Csere: Cserélje ki a címkéket a beírt címkékre (az összes címke törléséhez ne adjon meg címkéket)",
"EditSelectedIndexers": "Kiválasztott indexelők szerkesztése",
"ApplyTagsHelpTextAdd": "Hozzáadás: Új címkék hozzáadása a meglévő címkékhez",
"ApplyTagsHelpTextAdd": "Hozzáadás: Adja hozzá a címkéket a meglévő címkék listájához",
"ApplyTagsHelpTextHowToApplyApplications": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez",
"ApplyTagsHelpTextHowToApplyIndexers": "Hogyan adjunk hozzá címkéket a kiválasztott filmhez",
"ApplyTagsHelpTextHowToApplyIndexers": "Címkék alkalmazása a kiválasztott indexelőkre",
"ApplyTagsHelpTextRemove": "Eltávolítás: Távolítsa el a beírt címkéket",
"CountIndexersSelected": "{0} Indexelő(k) kiválasztva",
"DeleteSelectedDownloadClients": "Letöltőkliens Törlése",
@@ -494,14 +494,28 @@
"WhatsNew": "Mi az újdonság?",
"ConnectionLostToBackend": "A Radarr elvesztette kapcsolatát a háttérrendszerrel, a funkciók helyreállításához frissíts.",
"minutes": "percek",
"AddConnection": "Gyűjtemény módosítása",
"AddConnection": "Csatlakozás hozzáadása",
"NotificationStatusAllClientHealthCheckMessage": "Összes alkalmazás elérhetetlen hiba miatt",
"NotificationStatusSingleClientHealthCheckMessage": "Az alkalmazás nem áll rendelkezésre az alábbi hibák miatt: {0}",
"AuthBasic": "Alap (Böngésző felugró ablak)",
"AuthForm": "Felhasználó (Bejelentkezési oldal)",
"AuthBasic": "Alap (böngésző előugró ablak)",
"AuthForm": "Űrlapok (bejelentkezési oldal)",
"DisabledForLocalAddresses": "Letiltva a helyi címeknél",
"None": "Nincs",
"ResetAPIKeyMessageText": "Biztos hogy vissza szeretnéd állítani az API-Kulcsod?",
"AuthenticationRequiredPasswordHelpTextWarning": "Adjon meg új jelszót",
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet"
"AuthenticationRequiredUsernameHelpTextWarning": "Adjon meg új felhasználónevet",
"AppUpdated": "{appName} frissítve",
"AddApplication": "Alkalmazás hozzáadása",
"AddCustomFilter": "Egyéni szűrő hozzáadása",
"Clone": "Klón",
"Implementation": "Végrehajtás",
"AddConnectionImplementation": "Csatlakozás hozzáadása - {implementationName}",
"AddDownloadClientImplementation": "Letöltési kliens hozzáadása {implementationName}",
"AddIndexerImplementation": "Indexelő hozzáadása - {implementationName}",
"ActiveApps": "Aktív alkalmazások",
"ActiveIndexers": "Indexerek",
"AuthenticationMethod": "Hitelesítési Módszer",
"AuthenticationMethodHelpTextWarning": "Kérjük, válasszon érvényes hitelesítési módot",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Erősítsd meg az új jelszót",
"DefaultNameCopiedProfile": "{name} - Másolat"
}

View File

@@ -452,8 +452,8 @@
"NotificationStatusSingleClientHealthCheckMessage": "Applicaties onbeschikbaar door fouten",
"AddConnection": "Voeg connectie toe",
"NotificationStatusAllClientHealthCheckMessage": "Alle applicaties onbeschikbaar door fouten",
"AuthBasic": "Basis (Browser Pop-up)",
"AuthForm": "Formulier (Login Pagina)",
"AuthBasic": "Basic (Browser Pop-up)",
"AuthForm": "Formulier (inlogpagina)",
"DisabledForLocalAddresses": "Uitgeschakeld voor lokale adressen",
"None": "Geen",
"ResetAPIKeyMessageText": "Bent u zeker dat u uw API-sleutel wilt resetten?",
@@ -476,5 +476,10 @@
"EditIndexerProxyImplementation": "Indexeerder toevoegen - {implementationName}",
"AuthenticationMethod": "Authenticatiemethode",
"AuthenticationRequired": "Verificatie vereist",
"AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode"
"AuthenticationMethodHelpTextWarning": "Selecteer een geldige verificatie methode",
"AuthenticationRequiredHelpText": "Pas aan welke requests verificatie nodig hebben. Pas niets aan als je de risico's niet begrijpt.",
"AuthenticationRequiredPasswordHelpTextWarning": "Voer een nieuw wachtwoord in",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Bevestig het nieuwe wachtwoord",
"AuthenticationRequiredUsernameHelpTextWarning": "Voeg een nieuwe gebruikersnaam in",
"AuthenticationRequiredWarning": "Om toegang zonder authenticatie te voorkomen vereist {appName} nu verificatie. Je kan dit optioneel uitschakelen voor lokale adressen."
}

View File

@@ -6,7 +6,7 @@
"Analytics": "Analityka",
"All": "Wszystkie",
"Added": "Dodane",
"Actions": "Aktywności",
"Actions": "Akcje",
"About": "O",
"Logging": "Logowanie",
"EnableSslHelpText": " Wymaga ponownego uruchomienia jako administrator, aby odniosło skutek",
@@ -22,7 +22,7 @@
"Automatic": "Automatyczny",
"ApplyTags": "Zastosuj tagi",
"BackupIntervalHelpText": "Odstęp czasu między automatycznymi kopiami zapasowymi",
"Close": "Blisko",
"Close": "Zamknij",
"CloseCurrentModal": "Zamknij bieżący tryb",
"Delete": "Usunąć",
"Discord": "Niezgoda",
@@ -54,7 +54,7 @@
"ApiKey": "Klucz API",
"UI": "UI",
"AcceptConfirmationModal": "Zaakceptuj tryb potwierdzenia",
"AddIndexer": "Dodaj indeksator",
"AddIndexer": "Dodaj indekser",
"AddingTag": "Dodawanie tagu",
"Age": "Wiek",
"CertificateValidationHelpText": "Zmień ścisłą walidację certyfikatu HTTPS",

View File

@@ -120,7 +120,7 @@
"Clear": "Limpar",
"Cancel": "Cancelar",
"BackupNow": "Criar cópia de segurança",
"Backup": "Cópia de segurança",
"Backup": "Backup",
"Apply": "Aplicar",
"Analytics": "Análises",
"All": "Todos",
@@ -181,7 +181,7 @@
"BindAddressHelpText": "Endereço de IP válido, localhost ou \"*\" para todas as interfaces",
"BindAddress": "Endereço de vínculo",
"Backups": "Cópias de segurança",
"BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do {appName}",
"BackupFolderHelpText": "Caminhos relativos estarão no diretório AppData do {appName}",
"BackupIntervalHelpText": "Intervalo entre cópias de segurança automáticas",
"BackupRetentionHelpText": "Cópias de segurança automáticas anteriores ao período de retenção serão eliminadas automaticamente",
"ClientPriority": "Prioridade do cliente",
@@ -472,5 +472,6 @@
"EditSelectedDownloadClients": "Editar Clientes de Transferência Selecionados",
"Album": "álbum",
"Artist": "artista",
"DefaultNameCopiedProfile": "{name} - Copiar"
"DefaultNameCopiedProfile": "{name} - Copiar",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirmar nova senha"
}

View File

@@ -601,5 +601,7 @@
"NoIndexerCategories": "Nenhuma categoria encontrada para este indexador",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha",
"PasswordConfirmation": "Confirmação Da Senha",
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações"
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)",
"DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo"
}

View File

@@ -13,10 +13,10 @@
"Filter": "Filter",
"Files": "Filer",
"Events": "Händelser",
"Edit": "Redigera",
"Edit": "Ändra",
"DownloadClientStatusCheckSingleClientMessage": "Otillgängliga nedladdningsklienter på grund av misslyckade anslutningsförsök: {0}",
"DownloadClientStatusCheckAllClientMessage": "Samtliga nedladdningsklienter är otillgängliga på grund av misslyckade anslutningsförsök",
"DownloadClients": "Nedladdningsklienter",
"DownloadClients": "Nerladdningsklienter",
"Delete": "Radera",
"Dates": "Datum",
"Date": "Datum",
@@ -196,7 +196,7 @@
"IncludeHealthWarningsHelpText": "Inkludera hälsovarningar",
"IndexerFlags": "Indexerflaggor",
"AddDownloadClient": "Lägg till nedladdningsklient",
"AddIndexer": "Lägg till indexerare",
"AddIndexer": "Lägg till index",
"AddingTag": "Lägg till tagg",
"Enabled": "Aktiverad",
"Exception": "Undantag",
@@ -394,7 +394,7 @@
"No": "Nej",
"ApplicationLongTermStatusCheckAllClientMessage": "Alla indexerare är inte tillgängliga på grund av fel i mer än 6 timmar",
"ApplicationLongTermStatusCheckSingleClientMessage": "Indexatorer är inte tillgängliga på grund av misslyckanden i mer än sex timmar: {0}",
"Duration": "Tid",
"Duration": "Längd",
"Ended": "Avslutad",
"LastDuration": "lastDuration",
"LastExecution": "Senaste avrättningen",
@@ -437,5 +437,6 @@
"AuthForm": "Blanketter (inloggningssida)",
"DisabledForLocalAddresses": "Inaktiverad för lokala adresser",
"None": "Ingen",
"ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?"
"ResetAPIKeyMessageText": "Är du säker på att du vill nollställa din API-nyckel?",
"AddCustomFilter": "Lägg till anpassat filter"
}

View File

@@ -495,7 +495,7 @@
"ApplyTagsHelpTextAdd": "添加: 添加标签至已有的标签列表中",
"CountDownloadClientsSelected": "已选择 {count} 个下载客户端",
"CountIndexersSelected": "已选择 {count} 个索引器",
"DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?",
"DeleteSelectedDownloadClientsMessageText": "您确定要删除 {count}选定的下载客户端吗?",
"DeleteSelectedIndexersMessageText": "您确定要删除{count}选定的索引器吗?",
"EditSelectedDownloadClients": "编辑选定的下载客户端",
"Implementation": "执行",
@@ -600,5 +600,8 @@
"PackSeedTime": "做种时间",
"PasswordConfirmation": "确认密码",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码",
"InvalidUILanguage": "语言"
"InvalidUILanguage": "您的UI设置为无效语言请纠正并保存设置",
"NoIndexerCategories": "没有找到此索引器的分类",
"DownloadClientQbittorrentSettingsContentLayout": "内容布局",
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局使用种子的原始布局或始终创建子文件夹qBittorrent 4.3.2+"
}

View File

@@ -104,5 +104,9 @@
"AppDataDirectory": "AppData 路徑",
"Applications": "應用程式",
"AuthBasic": "基礎(瀏覽器彈出視窗)",
"AuthForm": "表單(登入頁面)"
"AuthForm": "表單(登入頁面)",
"AddConnection": "新增連接",
"AddConnectionImplementation": "新增連接 - {implementationName}",
"AddDownloadClientImplementation": "新增下載用戶端 - {implementationName}",
"AddIndexerImplementation": "新增索引 - {implementationName}"
}

View File

@@ -24,6 +24,7 @@ using NzbDrone.Common.Instrumentation;
using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Datastore.Extensions;
using Prowlarr.Http.ClientSchema;
using PostgresOptions = NzbDrone.Core.Datastore.PostgresOptions;
namespace NzbDrone.Host
@@ -147,6 +148,8 @@ namespace NzbDrone.Host
.AddNzbDroneLogger()
.AddDatabase()
.AddStartupContext(context);
SchemaBuilder.Initialize(c);
})
.ConfigureServices(services =>
{

View File

@@ -1,4 +1,5 @@
using Prowlarr.Api.V1.Indexers;
using System.Collections.Generic;
using Prowlarr.Api.V1.Indexers;
using RestSharp;
namespace NzbDrone.Integration.Test.Client
@@ -9,5 +10,11 @@ namespace NzbDrone.Integration.Test.Client
: base(restClient, apiKey)
{
}
public List<IndexerResource> Schema()
{
var request = BuildRequest("/schema");
return Get<List<IndexerResource>>(request);
}
}
}

View File

@@ -1,13 +1,14 @@
using System;
using System.Linq;
using System.Threading;
using NLog;
using NUnit.Framework;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Datastore.Migration.Framework;
using NzbDrone.Core.Indexers.Definitions.FileList;
using NzbDrone.Core.Indexers.Newznab;
using NzbDrone.Test.Common;
using NzbDrone.Test.Common.Datastore;
using Prowlarr.Http.ClientSchema;
namespace NzbDrone.Integration.Test
{
@@ -49,16 +50,19 @@ namespace NzbDrone.Integration.Test
{
WaitForCompletion(() => Tasks.All().SelectList(x => x.TaskName).Contains("CheckHealth"), 20000);
Indexers.Post(new Prowlarr.Api.V1.Indexers.IndexerResource
var indexer = Indexers.Schema().FirstOrDefault(i => i.Implementation == nameof(Newznab));
if (indexer == null)
{
Enable = false,
ConfigContract = nameof(FileListSettings),
Implementation = nameof(FileList),
Name = "NewznabTest",
Protocol = Core.Indexers.DownloadProtocol.Usenet,
AppProfileId = 1,
Fields = SchemaBuilder.ToSchema(new FileListSettings())
});
throw new NullReferenceException("Expected valid indexer schema, found null");
}
indexer.Enable = false;
indexer.ConfigContract = nameof(NewznabSettings);
indexer.Implementation = nameof(Newznab);
indexer.Name = "NewznabTest";
indexer.Protocol = Core.Indexers.DownloadProtocol.Usenet;
indexer.AppProfileId = 1;
// Change Console Log Level to Debug so we get more details.
var config = HostConfig.Get(1);

View File

@@ -23,6 +23,8 @@ namespace NzbDrone.Test.Common.AutoMoq
SetupAutoMoqer(CreateTestContainer(new Container()));
}
public IContainer Container => _container;
public virtual T Resolve<T>()
{
var result = _container.Resolve<T>();

View File

@@ -1,6 +1,9 @@
using System.Collections.Generic;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Localization;
using NzbDrone.Test.Common;
using Prowlarr.Http.ClientSchema;
@@ -9,6 +12,16 @@ namespace NzbDrone.Api.Test.ClientSchemaTests
[TestFixture]
public class SchemaBuilderFixture : TestBase
{
[SetUp]
public void Setup()
{
Mocker.GetMock<ILocalizationService>()
.Setup(s => s.GetLocalizedString(It.IsAny<string>(), It.IsAny<Dictionary<string, object>>()))
.Returns<string, Dictionary<string, object>>((s, d) => s);
SchemaBuilder.Initialize(Mocker.Container);
}
[Test]
public void should_return_field_for_every_property()
{

View File

@@ -3,17 +3,25 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.Json;
using DryIoc;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Reflection;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Annotations;
using NzbDrone.Core.Localization;
namespace Prowlarr.Http.ClientSchema
{
public static class SchemaBuilder
{
private static Dictionary<Type, FieldMapping[]> _mappings = new Dictionary<Type, FieldMapping[]>();
private static ILocalizationService _localizationService;
public static void Initialize(IContainer container)
{
_localizationService = container.Resolve<ILocalizationService>();
}
public static List<Field> ToSchema(object model)
{
@@ -93,13 +101,27 @@ namespace Prowlarr.Http.ClientSchema
if (propertyInfo.PropertyType.IsSimpleType())
{
var fieldAttribute = property.Item2;
var label = fieldAttribute.Label.IsNotNullOrWhiteSpace()
? _localizationService.GetLocalizedString(fieldAttribute.Label,
GetTokens(type, fieldAttribute.Label, TokenField.Label))
: fieldAttribute.Label;
var helpText = fieldAttribute.HelpText.IsNotNullOrWhiteSpace()
? _localizationService.GetLocalizedString(fieldAttribute.HelpText,
GetTokens(type, fieldAttribute.Label, TokenField.HelpText))
: fieldAttribute.HelpText;
var helpTextWarning = fieldAttribute.HelpTextWarning.IsNotNullOrWhiteSpace()
? _localizationService.GetLocalizedString(fieldAttribute.HelpTextWarning,
GetTokens(type, fieldAttribute.Label, TokenField.HelpTextWarning))
: fieldAttribute.HelpTextWarning;
var field = new Field
{
Name = prefix + GetCamelCaseName(propertyInfo.Name),
Label = fieldAttribute.Label,
Label = label,
Unit = fieldAttribute.Unit,
HelpText = fieldAttribute.HelpText,
HelpTextWarning = fieldAttribute.HelpTextWarning,
HelpText = helpText,
HelpTextWarning = helpTextWarning,
HelpLink = fieldAttribute.HelpLink,
Order = fieldAttribute.Order,
Advanced = fieldAttribute.Advanced,
@@ -158,6 +180,24 @@ namespace Prowlarr.Http.ClientSchema
.ToArray();
}
private static Dictionary<string, object> GetTokens(Type type, string label, TokenField field)
{
var tokens = new Dictionary<string, object>();
foreach (var propertyInfo in type.GetProperties())
{
foreach (var attribute in propertyInfo.GetCustomAttributes(true))
{
if (attribute is FieldTokenAttribute fieldTokenAttribute && fieldTokenAttribute.Field == field && fieldTokenAttribute.Label == label)
{
tokens.Add(fieldTokenAttribute.Token, fieldTokenAttribute.Value);
}
}
}
return tokens;
}
private static List<SelectOption> GetSelectOptions(Type selectOptions)
{
if (selectOptions.IsEnum)