Compare commits

...

21 Commits

Author SHA1 Message Date
Bogdan
f861e54139 Rename MusicbrainzId references to ForeignId 2025-01-20 16:45:27 +02:00
jcassette
279e1029e0 New: reflink support for ZFS
(cherry picked from commit a840bb542362d58006b6cc27affd58ee6b965b80)
2025-01-19 17:18:38 +02:00
Bogdan
b9ed39175b Bump version to 0.4.10 2025-01-19 17:15:27 +02:00
Bogdan
faba3ada95 Bump Polly, System.Buffers and System.Memory
Closes #3952
2025-01-15 18:23:01 +02:00
Qstick
e8647aee05 Bump SonarCloud azure extension to 3.X
(cherry picked from commit 7b8e352d876cd8f8e5b6296f0c3938bed4db8bb8)

Bump SonarCloud azure extension for UI analysis to 3.X

(cherry picked from commit 396b2ae7c10c7df749ea23ea93608b56482175a1)
2025-01-15 18:13:04 +02:00
Weblate
eaf5ce52bc Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: 1 <1228553526@qq.com>
Co-authored-by: Alexander Balya <alexander.balya@gmail.com>
Co-authored-by: Ano10 <Ano10@users.noreply.translate.servarr.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Matti Meikäläinen <diefor-93@hotmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Tommy Au <smarttommyau@gmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: marapavelka <mara.pavelka@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_TW/
Translation: Servarr/Readarr
2025-01-12 15:18:43 +02:00
Bogdan
73ab2760e4 Bump version to 0.4.9 2025-01-12 15:17:47 +02:00
Bogdan
3bb036e8c6 Fixed warning for central package version management 2025-01-09 22:09:48 +02:00
Bogdan
6e05456d6a Set minor version for core-js in babel/preset-env
(cherry picked from commit 2e83d59f61957cbc2171bef097fe2410e72729ad)

Closes #3941
2025-01-05 14:41:58 +02:00
Bogdan
8563a42822 Update core-js 2025-01-05 14:41:51 +02:00
Mark McDowall
841d38f4a5 Upgrade babel to 7.26.0
(cherry picked from commit bfcd017012730c97eb587ae2d2e91f72ee7a1de3)

Closes #3943
2025-01-05 14:40:02 +02:00
Mark McDowall
9326d88eb6 Upgrade Font Awesome to 6.7.1
(cherry picked from commit 016b5718386593c030f14fcac307c93ee1ceeca6)

Closes #3944
2025-01-05 14:38:03 +02:00
Bogdan
015da61004 Bump MailKit to 4.8.0 and Microsoft.Data.SqlClient to 2.1.7
Closes #3951
2025-01-05 14:37:16 +02:00
Mark McDowall
d02ea4b121 Don't send session information to Sentry
(cherry picked from commit fae24e98fb9230c2f3701caef457332952c6723f)

Closes #3957
2025-01-05 14:31:17 +02:00
Bruno Garcia
7bc9d700f9 Update Sentry SDK add features
Co-authored-by: Stefan Jandl <reg@bitfox.at>
(cherry picked from commit 6377c688fc7b35749d608bf62796446bb5bcb11b)
2025-01-05 14:30:42 +02:00
Stevie Robinson
661d72ef9b Fixed: Listening on all IPv4 Addresses
(cherry picked from commit 035c474f10c257331a5f47e863d24af82537e335)
2025-01-05 14:26:30 +02:00
Stevie Robinson
258a8d1c95 Fixed: qBittorrent Ratio Limit Check
(cherry picked from commit 4dcc015fb19ceb57d2e8f4985c5137e765829d1c)
2025-01-05 14:26:17 +02:00
Bogdan
d4459b9475 Bump version to 0.4.8 2025-01-05 14:26:01 +02:00
Bogdan
a550c6554f Check if backup folder is writable on backup
(cherry picked from commit 8aad79fd3e14eb885724a5e5790803c289be2f25)

Closes #3961
2024-12-31 12:21:54 +02:00
Bogdan
c1b26eec8d Suggest adding IP to RPC whitelist for on failed Transmission auth
(cherry picked from commit f05e552e8e6dc02cd26444073ab9a678dcb36492)
2024-12-31 12:20:58 +02:00
Bogdan
ffe5ede55d Bump version to 0.4.7 2024-12-22 13:25:47 +02:00
33 changed files with 1323 additions and 1028 deletions

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests' testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '0.4.6' majorVersion: '0.4.10'
minorVersion: $[counter('minorVersion', 1)] minorVersion: $[counter('minorVersion', 1)]
readarrVersion: '$(majorVersion).$(minorVersion)' readarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(readarrVersion)' buildName: '$(Build.SourceBranchName).$(readarrVersion)'
@@ -1102,19 +1102,19 @@ stages:
vmImage: ${{ variables.windowsImage }} vmImage: ${{ variables.windowsImage }}
steps: steps:
- checkout: self # Need history for Sonar analysis - checkout: self # Need history for Sonar analysis
- task: SonarCloudPrepare@2 - task: SonarCloudPrepare@3
env: env:
SONAR_SCANNER_OPTS: '' SONAR_SCANNER_OPTS: ''
inputs: inputs:
SonarCloud: 'SonarCloud' SonarCloud: 'SonarCloud'
organization: 'readarr' organization: 'readarr'
scannerMode: 'CLI' scannerMode: 'cli'
configMode: 'manual' configMode: 'manual'
cliProjectKey: 'readarrui' cliProjectKey: 'readarrui'
cliProjectName: 'ReadarrUI' cliProjectName: 'ReadarrUI'
cliProjectVersion: '$(readarrVersion)' cliProjectVersion: '$(readarrVersion)'
cliSources: './frontend' cliSources: './frontend'
- task: SonarCloudAnalyze@2 - task: SonarCloudAnalyze@3
- job: Api_Docs - job: Api_Docs
displayName: API Docs displayName: API Docs
@@ -1190,12 +1190,12 @@ stages:
submodules: true submodules: true
- powershell: Set-Service SCardSvr -StartupType Manual - powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service displayName: Enable Windows Test Service
- task: SonarCloudPrepare@2 - task: SonarCloudPrepare@3
condition: eq(variables['System.PullRequest.IsFork'], 'False') condition: eq(variables['System.PullRequest.IsFork'], 'False')
inputs: inputs:
SonarCloud: 'SonarCloud' SonarCloud: 'SonarCloud'
organization: 'readarr' organization: 'readarr'
scannerMode: 'MSBuild' scannerMode: 'dotnet'
projectKey: 'Readarr_Readarr' projectKey: 'Readarr_Readarr'
projectName: 'Readarr' projectName: 'Readarr'
projectVersion: '$(readarrVersion)' projectVersion: '$(readarrVersion)'
@@ -1208,7 +1208,7 @@ stages:
./build.sh --backend -f net6.0 -r win-x64 ./build.sh --backend -f net6.0 -r win-x64
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage
displayName: Coverage Unit Tests displayName: Coverage Unit Tests
- task: SonarCloudAnalyze@2 - task: SonarCloudAnalyze@3
condition: eq(variables['System.PullRequest.IsFork'], 'False') condition: eq(variables['System.PullRequest.IsFork'], 'False')
displayName: Publish SonarCloud Results displayName: Publish SonarCloud Results
- task: reportgenerator@5.3.11 - task: reportgenerator@5.3.11

View File

@@ -182,7 +182,7 @@ module.exports = (env) => {
loose: true, loose: true,
debug: false, debug: false,
useBuiltIns: 'entry', useBuiltIns: 'entry',
corejs: 3 corejs: '3.39'
} }
] ]
] ]

View File

@@ -76,7 +76,7 @@ function EditImportListExclusionModalContent(props) {
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>
{translate('MusicbrainzId')} {translate('ForeignId')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup

View File

@@ -25,10 +25,10 @@
"defaults" "defaults"
], ],
"dependencies": { "dependencies": {
"@fortawesome/fontawesome-free": "6.6.0", "@fortawesome/fontawesome-free": "6.7.1",
"@fortawesome/fontawesome-svg-core": "6.6.0", "@fortawesome/fontawesome-svg-core": "6.7.1",
"@fortawesome/free-regular-svg-icons": "6.6.0", "@fortawesome/free-regular-svg-icons": "6.7.1",
"@fortawesome/free-solid-svg-icons": "6.6.0", "@fortawesome/free-solid-svg-icons": "6.7.1",
"@fortawesome/react-fontawesome": "0.2.2", "@fortawesome/react-fontawesome": "0.2.2",
"@microsoft/signalr": "6.0.25", "@microsoft/signalr": "6.0.25",
"@sentry/browser": "7.119.1", "@sentry/browser": "7.119.1",
@@ -86,13 +86,13 @@
"typescript": "5.1.6" "typescript": "5.1.6"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.25.8", "@babel/core": "7.26.0",
"@babel/eslint-parser": "7.25.8", "@babel/eslint-parser": "7.25.9",
"@babel/plugin-proposal-export-default-from": "7.25.8", "@babel/plugin-proposal-export-default-from": "7.25.9",
"@babel/plugin-syntax-dynamic-import": "7.8.3", "@babel/plugin-syntax-dynamic-import": "7.8.3",
"@babel/preset-env": "7.25.8", "@babel/preset-env": "7.26.0",
"@babel/preset-react": "7.25.7", "@babel/preset-react": "7.26.3",
"@babel/preset-typescript": "7.25.7", "@babel/preset-typescript": "7.26.0",
"@types/lodash": "4.14.195", "@types/lodash": "4.14.195",
"@types/react-lazyload": "3.2.3", "@types/react-lazyload": "3.2.3",
"@types/redux-actions": "2.6.5", "@types/redux-actions": "2.6.5",
@@ -102,7 +102,7 @@
"babel-loader": "9.2.1", "babel-loader": "9.2.1",
"babel-plugin-inline-classnames": "2.0.1", "babel-plugin-inline-classnames": "2.0.1",
"babel-plugin-transform-react-remove-prop-types": "0.4.24", "babel-plugin-transform-react-remove-prop-types": "0.4.24",
"core-js": "3.38.1", "core-js": "3.39.0",
"css-loader": "6.8.1", "css-loader": "6.8.1",
"css-modules-typescript-loader": "4.0.1", "css-modules-typescript-loader": "4.0.1",
"eslint": "8.57.1", "eslint": "8.57.1",

View File

@@ -99,6 +99,35 @@
<RootNamespace Condition="'$(ReadarrProject)'=='true'">$(MSBuildProjectName.Replace('Readarr','NzbDrone'))</RootNamespace> <RootNamespace Condition="'$(ReadarrProject)'=='true'">$(MSBuildProjectName.Replace('Readarr','NzbDrone'))</RootNamespace>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition="'$(TestProject)'!='true'">
<!-- Annotates .NET assemblies with repository information including SHA -->
<!-- Sentry uses this to link directly to GitHub at the exact version/file/line -->
<!-- This is built-in on .NET 8 and can be removed once the project is updated -->
<PackageReference Include="Microsoft.SourceLink.GitHub" />
</ItemGroup>
<!-- Sentry specific configuration: Only in Release mode -->
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<!-- https://docs.sentry.io/platforms/dotnet/configuration/msbuild/ -->
<!-- OrgSlug, ProjectSlug and AuthToken are required.
They can be set below, via argument to 'msbuild -p:' or environment variable -->
<SentryOrg></SentryOrg>
<SentryProject></SentryProject>
<SentryUrl></SentryUrl> <!-- If empty, assumed to be sentry.io -->
<SentryAuthToken></SentryAuthToken> <!-- Use env var instead: SENTRY_AUTH_TOKEN -->
<!-- Upload PDBs to Sentry, enabling stack traces with line numbers and file paths
without the need to deploy the application with PDBs -->
<SentryUploadSymbols>true</SentryUploadSymbols>
<!-- Source Link settings -->
<!-- https://github.com/dotnet/sourcelink/blob/main/docs/README.md#publishrepositoryurl -->
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<!-- Embeds all source code in the respective PDB. This can make it a bit bigger but since it'll be uploaded
to Sentry and not distributed to run on the server, it helps debug crashes while making releases smaller -->
<EmbedAllSources>true</EmbedAllSources>
</PropertyGroup>
<!-- Standard testing packages --> <!-- Standard testing packages -->
<ItemGroup Condition="'$(TestProject)'=='true'"> <ItemGroup Condition="'$(TestProject)'=='true'">
<PackageReference Include="Microsoft.NET.Test.Sdk" /> <PackageReference Include="Microsoft.NET.Test.Sdk" />

View File

@@ -9,7 +9,7 @@
<PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" /> <PackageVersion Include="DryIoc.Microsoft.DependencyInjection" Version="6.2.0" />
<PackageVersion Include="Equ" Version="2.3.0" /> <PackageVersion Include="Equ" Version="2.3.0" />
<PackageVersion Include="FluentAssertions" Version="5.10.3" /> <PackageVersion Include="FluentAssertions" Version="5.10.3" />
<PackageVersion Include="Polly" Version="8.5.0" /> <PackageVersion Include="Polly" Version="8.5.1" />
<PackageVersion Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" /> <PackageVersion Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />
<PackageVersion Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" /> <PackageVersion Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
<PackageVersion Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" /> <PackageVersion Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
@@ -17,14 +17,16 @@
<PackageVersion Include="Ical.Net" Version="4.3.1" /> <PackageVersion Include="Ical.Net" Version="4.3.1" />
<PackageVersion Include="ImpromptuInterface" Version="7.0.1" /> <PackageVersion Include="ImpromptuInterface" Version="7.0.1" />
<PackageVersion Include="LazyCache" Version="2.4.0" /> <PackageVersion Include="LazyCache" Version="2.4.0" />
<PackageVersion Include="Mailkit" Version="3.6.0" /> <PackageVersion Include="Mailkit" Version="4.8.0" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.35" /> <PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="6.0.35" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="2.1.7" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.2" /> <PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.2" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" /> <PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" /> <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
<PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" /> <PackageVersion Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" /> <PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" /> <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
<PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" /> <PackageVersion Include="Microsoft.Win32.Registry" Version="5.0.0" />
<PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr22" /> <PackageVersion Include="Mono.Posix.NETStandard" Version="5.20.1.34-servarr22" />
<PackageVersion Include="Moq" Version="4.17.2" /> <PackageVersion Include="Moq" Version="4.17.2" />
@@ -43,19 +45,19 @@
<PackageVersion Include="RestSharp" Version="106.15.0" /> <PackageVersion Include="RestSharp" Version="106.15.0" />
<PackageVersion Include="Selenium.Support" Version="3.141.0" /> <PackageVersion Include="Selenium.Support" Version="3.141.0" />
<PackageVersion Include="Selenium.WebDriver.ChromeDriver" Version="91.0.4472.10100" /> <PackageVersion Include="Selenium.WebDriver.ChromeDriver" Version="91.0.4472.10100" />
<PackageVersion Include="Sentry" Version="3.31.0" /> <PackageVersion Include="Sentry" Version="4.0.2" />
<PackageVersion Include="SharpZipLib" Version="1.4.2" /> <PackageVersion Include="SharpZipLib" Version="1.4.2" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.6" /> <PackageVersion Include="SixLabors.ImageSharp" Version="3.1.6" />
<PackageVersion Include="StyleCop.Analyzers" Version="1.1.118" /> <PackageVersion Include="StyleCop.Analyzers" Version="1.1.118" />
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.6.2" /> <PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.6.2" />
<PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" /> <PackageVersion Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.6.2" />
<PackageVersion Include="System.Buffers" Version="4.5.1" /> <PackageVersion Include="System.Buffers" Version="4.6.0" />
<PackageVersion Include="System.Configuration.ConfigurationManager" Version="6.0.1" /> <PackageVersion Include="System.Configuration.ConfigurationManager" Version="6.0.1" />
<PackageVersion Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" /> <PackageVersion Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageVersion Include="System.IO.Abstractions.TestingHelpers" Version="17.0.24" /> <PackageVersion Include="System.IO.Abstractions.TestingHelpers" Version="17.0.24" />
<PackageVersion Include="System.IO.Abstractions" Version="17.0.24" /> <PackageVersion Include="System.IO.Abstractions" Version="17.0.24" />
<PackageVersion Include="System.IO.FileSystem.AccessControl" Version="5.0.0" /> <PackageVersion Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageVersion Include="System.Memory" Version="4.5.5" /> <PackageVersion Include="System.Memory" Version="4.6.0" />
<PackageVersion Include="System.Reflection.TypeExtensions" Version="4.7.0" /> <PackageVersion Include="System.Reflection.TypeExtensions" Version="4.7.0" />
<PackageVersion Include="System.Resources.Extensions" Version="6.0.0" /> <PackageVersion Include="System.Resources.Extensions" Version="6.0.0" />
<PackageVersion Include="System.Runtime.Loader" Version="4.3.0" /> <PackageVersion Include="System.Runtime.Loader" Version="4.3.0" />

View File

@@ -4,6 +4,7 @@ using System.Linq;
using FluentAssertions; using FluentAssertions;
using NLog; using NLog;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Instrumentation.Sentry; using NzbDrone.Common.Instrumentation.Sentry;
using NzbDrone.Test.Common; using NzbDrone.Test.Common;
@@ -27,7 +28,7 @@ namespace NzbDrone.Common.Test.InstrumentationTests
[SetUp] [SetUp]
public void Setup() public void Setup()
{ {
_subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111"); _subject = new SentryTarget("https://aaaaaaaaaaaaaaaaaaaaaaaaaa@sentry.io/111111", Mocker.GetMock<IAppFolderInfo>().Object);
} }
private LogEventInfo GivenLogEvent(LogLevel level, Exception ex, string message) private LogEventInfo GivenLogEvent(LogLevel level, Exception ex, string message)

View File

@@ -42,17 +42,18 @@ namespace NzbDrone.Common
public void CreateZip(string path, IEnumerable<string> files) public void CreateZip(string path, IEnumerable<string> files)
{ {
using (var zipFile = ZipFile.Create(path)) _logger.Debug("Creating archive {0}", path);
using var zipFile = ZipFile.Create(path);
zipFile.BeginUpdate();
foreach (var file in files)
{ {
zipFile.BeginUpdate(); zipFile.Add(file, Path.GetFileName(file));
foreach (var file in files)
{
zipFile.Add(file, Path.GetFileName(file));
}
zipFile.CommitUpdate();
} }
zipFile.CommitUpdate();
} }
private void ExtractZip(string compressedFile, string destination) private void ExtractZip(string compressedFile, string destination)

View File

@@ -342,10 +342,11 @@ namespace NzbDrone.Common.Disk
var isCifs = targetDriveFormat == "cifs"; var isCifs = targetDriveFormat == "cifs";
var isBtrfs = sourceDriveFormat == "btrfs" && targetDriveFormat == "btrfs"; var isBtrfs = sourceDriveFormat == "btrfs" && targetDriveFormat == "btrfs";
var isZfs = sourceDriveFormat == "zfs" && targetDriveFormat == "zfs";
if (mode.HasFlag(TransferMode.Copy)) if (mode.HasFlag(TransferMode.Copy))
{ {
if (isBtrfs) if (isBtrfs || isZfs)
{ {
if (_diskProvider.TryCreateRefLink(sourcePath, targetPath)) if (_diskProvider.TryCreateRefLink(sourcePath, targetPath))
{ {
@@ -359,7 +360,7 @@ namespace NzbDrone.Common.Disk
if (mode.HasFlag(TransferMode.Move)) if (mode.HasFlag(TransferMode.Move))
{ {
if (isBtrfs) if (isBtrfs || isZfs)
{ {
if (isSameMount && _diskProvider.TryRenameFile(sourcePath, targetPath)) if (isSameMount && _diskProvider.TryRenameFile(sourcePath, targetPath))
{ {

View File

@@ -41,7 +41,7 @@ namespace NzbDrone.Common.Instrumentation
RegisterDebugger(); RegisterDebugger();
} }
RegisterSentry(updateApp); RegisterSentry(updateApp, appFolderInfo);
if (updateApp) if (updateApp)
{ {
@@ -62,7 +62,7 @@ namespace NzbDrone.Common.Instrumentation
LogManager.ReconfigExistingLoggers(); LogManager.ReconfigExistingLoggers();
} }
private static void RegisterSentry(bool updateClient) private static void RegisterSentry(bool updateClient, IAppFolderInfo appFolderInfo)
{ {
string dsn; string dsn;
@@ -77,7 +77,7 @@ namespace NzbDrone.Common.Instrumentation
: "https://31e00a6c63ea42c8b5fe70358526a30d@sentry.servarr.com/4"; : "https://31e00a6c63ea42c8b5fe70358526a30d@sentry.servarr.com/4";
} }
var target = new SentryTarget(dsn) var target = new SentryTarget(dsn, appFolderInfo)
{ {
Name = "sentryTarget", Name = "sentryTarget",
Layout = "${message}" Layout = "${message}"

View File

@@ -9,6 +9,7 @@ using NLog;
using NLog.Common; using NLog.Common;
using NLog.Targets; using NLog.Targets;
using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using Sentry; using Sentry;
namespace NzbDrone.Common.Instrumentation.Sentry namespace NzbDrone.Common.Instrumentation.Sentry
@@ -99,7 +100,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
public bool FilterEvents { get; set; } public bool FilterEvents { get; set; }
public bool SentryEnabled { get; set; } public bool SentryEnabled { get; set; }
public SentryTarget(string dsn) public SentryTarget(string dsn, IAppFolderInfo appFolderInfo)
{ {
_sdk = SentrySdk.Init(o => _sdk = SentrySdk.Init(o =>
{ {
@@ -107,9 +108,33 @@ namespace NzbDrone.Common.Instrumentation.Sentry
o.AttachStacktrace = true; o.AttachStacktrace = true;
o.MaxBreadcrumbs = 200; o.MaxBreadcrumbs = 200;
o.Release = $"{BuildInfo.AppName}@{BuildInfo.Release}"; o.Release = $"{BuildInfo.AppName}@{BuildInfo.Release}";
o.BeforeSend = x => SentryCleanser.CleanseEvent(x); o.SetBeforeSend(x => SentryCleanser.CleanseEvent(x));
o.BeforeBreadcrumb = x => SentryCleanser.CleanseBreadcrumb(x); o.SetBeforeBreadcrumb(x => SentryCleanser.CleanseBreadcrumb(x));
o.Environment = BuildInfo.Branch; o.Environment = BuildInfo.Branch;
// Crash free run statistics (sends a ping for healthy and for crashes sessions)
o.AutoSessionTracking = false;
// Caches files in the event device is offline
// Sentry creates a 'sentry' sub directory, no need to concat here
o.CacheDirectoryPath = appFolderInfo.GetAppDataPath();
// default environment is production
if (!RuntimeInfo.IsProduction)
{
if (RuntimeInfo.IsDevelopment)
{
o.Environment = "development";
}
else if (RuntimeInfo.IsTesting)
{
o.Environment = "testing";
}
else
{
o.Environment = "other";
}
}
}); });
InitializeScope(); InitializeScope();
@@ -127,7 +152,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
{ {
SentrySdk.ConfigureScope(scope => SentrySdk.ConfigureScope(scope =>
{ {
scope.User = new User scope.User = new SentryUser
{ {
Id = HashUtil.AnonymousToken() Id = HashUtil.AnonymousToken()
}; };
@@ -169,9 +194,7 @@ namespace NzbDrone.Common.Instrumentation.Sentry
private void OnError(Exception ex) private void OnError(Exception ex)
{ {
var webException = ex as WebException; if (ex is WebException webException)
if (webException != null)
{ {
var response = webException.Response as HttpWebResponse; var response = webException.Response as HttpWebResponse;
var statusCode = response?.StatusCode; var statusCode = response?.StatusCode;
@@ -290,13 +313,21 @@ namespace NzbDrone.Common.Instrumentation.Sentry
} }
} }
var level = LoggingLevelMap[logEvent.Level];
var sentryEvent = new SentryEvent(logEvent.Exception) var sentryEvent = new SentryEvent(logEvent.Exception)
{ {
Level = LoggingLevelMap[logEvent.Level], Level = level,
Logger = logEvent.LoggerName, Logger = logEvent.LoggerName,
Message = logEvent.FormattedMessage Message = logEvent.FormattedMessage
}; };
if (level is SentryLevel.Fatal && logEvent.Exception is not null)
{
// Usages of 'fatal' here indicates the process will crash. In Sentry this is represented with
// the 'unhandled' exception flag
logEvent.Exception.SetSentryMechanism("Logger.Fatal", "Logger.Fatal was called", false);
}
sentryEvent.SetExtras(extras); sentryEvent.SetExtras(extras);
sentryEvent.SetFingerprint(fingerPrint); sentryEvent.SetFingerprint(fingerPrint);

View File

@@ -711,6 +711,30 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
item.CanMoveFiles.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue();
} }
[TestCase("pausedUP")]
[TestCase("stoppedUP")]
public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_after_rounding_and_paused(string state)
{
GivenGlobalSeedLimits(1.0f);
GivenCompletedTorrent(state, ratio: 1.1006066990976857f);
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeTrue();
item.CanMoveFiles.Should().BeTrue();
}
[TestCase("pausedUP")]
[TestCase("stoppedUP")]
public void should_be_removable_and_should_allow_move_files_if_just_under_max_ratio_reached_after_rounding_and_paused(string state)
{
GivenGlobalSeedLimits(1.0f);
GivenCompletedTorrent(state, ratio: 0.9999f);
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeTrue();
item.CanMoveFiles.Should().BeTrue();
}
[TestCase("pausedUP")] [TestCase("pausedUP")]
[TestCase("stoppedUP")] [TestCase("stoppedUP")]
public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused(string state) public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused(string state)
@@ -723,6 +747,30 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
item.CanMoveFiles.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue();
} }
[TestCase("pausedUP")]
[TestCase("stoppedUP")]
public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_after_rounding_and_paused(string state)
{
GivenGlobalSeedLimits(2.0f);
GivenCompletedTorrent(state, ratio: 1.1006066990976857f, ratioLimit: 1.1f);
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeTrue();
item.CanMoveFiles.Should().BeTrue();
}
[TestCase("pausedUP")]
[TestCase("stoppedUP")]
public void should_be_removable_and_should_allow_move_files_if_just_under_overridden_max_ratio_reached_after_rounding_and_paused(string state)
{
GivenGlobalSeedLimits(2.0f);
GivenCompletedTorrent(state, ratio: 0.9999f, ratioLimit: 1.0f);
var item = Subject.GetItems().Single();
item.CanBeRemoved.Should().BeTrue();
item.CanMoveFiles.Should().BeTrue();
}
[TestCase("pausedUP")] [TestCase("pausedUP")]
[TestCase("stoppedUP")] [TestCase("stoppedUP")]
public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused(string state) public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused(string state)

View File

@@ -66,12 +66,19 @@ namespace NzbDrone.Core.Backup
{ {
_logger.ProgressInfo("Starting Backup"); _logger.ProgressInfo("Starting Backup");
var backupFolder = GetBackupFolder(backupType);
_diskProvider.EnsureFolder(_backupTempFolder); _diskProvider.EnsureFolder(_backupTempFolder);
_diskProvider.EnsureFolder(GetBackupFolder(backupType)); _diskProvider.EnsureFolder(backupFolder);
if (!_diskProvider.FolderWritable(backupFolder))
{
throw new UnauthorizedAccessException($"Backup folder {backupFolder} is not writable");
}
var dateNow = DateTime.Now; var dateNow = DateTime.Now;
var backupFilename = $"readarr_backup_v{BuildInfo.Version}_{dateNow:yyyy.MM.dd_HH.mm.ss}.zip"; var backupFilename = $"readarr_backup_v{BuildInfo.Version}_{dateNow:yyyy.MM.dd_HH.mm.ss}.zip";
var backupPath = Path.Combine(GetBackupFolder(backupType), backupFilename); var backupPath = Path.Combine(backupFolder, backupFilename);
Cleanup(); Cleanup();

View File

@@ -102,9 +102,9 @@ namespace NzbDrone.Core.Books
_logger.Error("ReadarrId {0} was not found, it may have been removed from Goodreads.", newAuthor.Metadata.Value.ForeignAuthorId); _logger.Error("ReadarrId {0} was not found, it may have been removed from Goodreads.", newAuthor.Metadata.Value.ForeignAuthorId);
throw new ValidationException(new List<ValidationFailure> throw new ValidationException(new List<ValidationFailure>
{ {
new ValidationFailure("MusicbrainzId", "An author with this ID was not found", newAuthor.Metadata.Value.ForeignAuthorId) new ("ForeignAuthorId", "An author with this ID was not found", newAuthor.Metadata.Value.ForeignAuthorId)
}); });
} }
author.ApplyChanges(newAuthor); author.ApplyChanges(newAuthor);

View File

@@ -620,14 +620,14 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
{ {
if (torrent.RatioLimit >= 0) if (torrent.RatioLimit >= 0)
{ {
if (torrent.Ratio >= torrent.RatioLimit) if (torrent.RatioLimit - torrent.Ratio <= 0.001f)
{ {
return true; return true;
} }
} }
else if (torrent.RatioLimit == -2 && config.MaxRatioEnabled) else if (torrent.RatioLimit == -2 && config.MaxRatioEnabled)
{ {
if (Math.Round(torrent.Ratio, 2) >= config.MaxRatio) if (config.MaxRatio - torrent.Ratio <= 0.001f)
{ {
return true; return true;
} }

View File

@@ -4,6 +4,7 @@ using System.Net;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NLog; using NLog;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
@@ -208,7 +209,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission
private void AuthenticateClient(HttpRequestBuilder requestBuilder, TransmissionSettings settings, bool reauthenticate = false) private void AuthenticateClient(HttpRequestBuilder requestBuilder, TransmissionSettings settings, bool reauthenticate = false)
{ {
var authKey = string.Format("{0}:{1}", requestBuilder.BaseUrl, settings.Password); var authKey = $"{requestBuilder.BaseUrl}:{settings.Password}";
var sessionId = _authSessionIDCache.Find(authKey); var sessionId = _authSessionIDCache.Find(authKey);
@@ -220,24 +221,26 @@ namespace NzbDrone.Core.Download.Clients.Transmission
authLoginRequest.SuppressHttpError = true; authLoginRequest.SuppressHttpError = true;
var response = _httpClient.Execute(authLoginRequest); var response = _httpClient.Execute(authLoginRequest);
if (response.StatusCode == HttpStatusCode.MovedPermanently)
{
var url = response.Headers.GetSingleValue("Location");
throw new DownloadClientException("Remote site redirected to " + url); switch (response.StatusCode)
}
else if (response.StatusCode == HttpStatusCode.Conflict)
{ {
sessionId = response.Headers.GetSingleValue("X-Transmission-Session-Id"); case HttpStatusCode.MovedPermanently:
var url = response.Headers.GetSingleValue("Location");
if (sessionId == null) throw new DownloadClientException("Remote site redirected to " + url);
{ case HttpStatusCode.Forbidden:
throw new DownloadClientException("Remote host did not return a Session Id."); throw new DownloadClientException($"Failed to authenticate with Transmission. It may be necessary to add {BuildInfo.AppName}'s IP address to RPC whitelist.");
} case HttpStatusCode.Conflict:
} sessionId = response.Headers.GetSingleValue("X-Transmission-Session-Id");
else
{ if (sessionId == null)
throw new DownloadClientAuthenticationException("Failed to authenticate with Transmission."); {
throw new DownloadClientException("Remote host did not return a Session Id.");
}
break;
default:
throw new DownloadClientAuthenticationException("Failed to authenticate with Transmission.");
} }
_logger.Debug("Transmission authentication succeeded."); _logger.Debug("Transmission authentication succeeded.");

View File

@@ -4,24 +4,24 @@ namespace NzbDrone.Core.Exceptions
{ {
public class AuthorNotFoundException : NzbDroneException public class AuthorNotFoundException : NzbDroneException
{ {
public string MusicBrainzId { get; set; } public string ForeignAuthorId { get; set; }
public AuthorNotFoundException(string musicbrainzId) public AuthorNotFoundException(string foreignAuthorId)
: base(string.Format("Author with id {0} was not found, it may have been removed from the metadata server.", musicbrainzId)) : base($"Author with id {foreignAuthorId} was not found, it may have been removed from the metadata server.")
{ {
MusicBrainzId = musicbrainzId; ForeignAuthorId = foreignAuthorId;
} }
public AuthorNotFoundException(string musicbrainzId, string message, params object[] args) public AuthorNotFoundException(string foreignAuthorId, string message, params object[] args)
: base(message, args) : base(message, args)
{ {
MusicBrainzId = musicbrainzId; ForeignAuthorId = foreignAuthorId;
} }
public AuthorNotFoundException(string musicbrainzId, string message) public AuthorNotFoundException(string foreignAuthorId, string message)
: base(message) : base(message)
{ {
MusicBrainzId = musicbrainzId; ForeignAuthorId = foreignAuthorId;
} }
} }
} }

View File

@@ -4,24 +4,24 @@ namespace NzbDrone.Core.Exceptions
{ {
public class BookNotFoundException : NzbDroneException public class BookNotFoundException : NzbDroneException
{ {
public string MusicBrainzId { get; set; } public string ForeignBookId { get; set; }
public BookNotFoundException(string musicbrainzId) public BookNotFoundException(string foreignBookId)
: base(string.Format("Book with id {0} was not found, it may have been removed from metadata server.", musicbrainzId)) : base($"Book with id {foreignBookId} was not found, it may have been removed from metadata server.")
{ {
MusicBrainzId = musicbrainzId; ForeignBookId = foreignBookId;
} }
public BookNotFoundException(string musicbrainzId, string message, params object[] args) public BookNotFoundException(string foreignBookId, string message, params object[] args)
: base(message, args) : base(message, args)
{ {
MusicBrainzId = musicbrainzId; ForeignBookId = foreignBookId;
} }
public BookNotFoundException(string musicbrainzId, string message) public BookNotFoundException(string foreignBookId, string message)
: base(message) : base(message)
{ {
MusicBrainzId = musicbrainzId; ForeignBookId = foreignBookId;
} }
} }
} }

View File

@@ -4,24 +4,24 @@ namespace NzbDrone.Core.Exceptions
{ {
public class EditionNotFoundException : NzbDroneException public class EditionNotFoundException : NzbDroneException
{ {
public string MusicBrainzId { get; set; } public string ForeignEditionId { get; set; }
public EditionNotFoundException(string musicbrainzId) public EditionNotFoundException(string foreignEditionId)
: base(string.Format("Edition with id {0} was not found, it may have been removed from metadata server.", musicbrainzId)) : base($"Edition with id {foreignEditionId} was not found, it may have been removed from metadata server.")
{ {
MusicBrainzId = musicbrainzId; ForeignEditionId = foreignEditionId;
} }
public EditionNotFoundException(string musicbrainzId, string message, params object[] args) public EditionNotFoundException(string foreignEditionId, string message, params object[] args)
: base(message, args) : base(message, args)
{ {
MusicBrainzId = musicbrainzId; ForeignEditionId = foreignEditionId;
} }
public EditionNotFoundException(string musicbrainzId, string message) public EditionNotFoundException(string foreignEditionId, string message)
: base(message) : base(message)
{ {
MusicBrainzId = musicbrainzId; ForeignEditionId = foreignEditionId;
} }
} }
} }

View File

@@ -13,26 +13,26 @@
"60MinutesSixty": "60 minut: {0}", "60MinutesSixty": "60 minut: {0}",
"About": "O aplikaci", "About": "O aplikaci",
"AddListExclusion": "Přidat vyloučení seznamu", "AddListExclusion": "Přidat vyloučení seznamu",
"AddingTag": "Přidání značky", "AddingTag": "Přidáštítku",
"AgeWhenGrabbed": "Stáří (kdy bylo získáno)", "AgeWhenGrabbed": "Stáří (kdy bylo získáno)",
"AlreadyInYourLibrary": "Již máte ve své knihovně", "AlreadyInYourLibrary": "Již máte ve své knihovně",
"AlternateTitles": "Alternativní název", "AlternateTitles": "Alternativní název",
"Analytics": "Analýzy", "Analytics": "Analýzy",
"AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery {appName}u. To zahrnuje informace o vašem prohlížeči, které stránky {appName} WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.", "AnalyticsEnabledHelpText": "Odesílejte anonymní informace o použití a chybách na servery {appName}u. To zahrnuje informace o vašem prohlížeči, které stránky {appName} WebUI používáte, hlášení chyb a také verzi operačního systému a běhového prostředí. Tyto informace použijeme k upřednostnění funkcí a oprav chyb.",
"AppDataDirectory": "Adresář AppData", "AppDataDirectory": "Adresář AppData",
"ApplyTags": "Použít značky", "ApplyTags": "Použít štítky",
"Authentication": "Ověřování", "Authentication": "Ověřování",
"AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k {appName}", "AuthenticationMethodHelpText": "Vyžadovat uživatelské jméno a heslo pro přístup k {appName}u",
"AuthorClickToChangeBook": "Kliknutím změníte film", "AuthorClickToChangeBook": "Kliknutím změníte film",
"AutoRedownloadFailedHelpText": "Automatické vyhledání a pokus o stažení jiného vydání", "AutoRedownloadFailedHelpText": "Automatické vyhledání a pokus o stažení jiného vydání",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Filmy odstraněné z disku jsou automaticky sledovány v {appName}u", "AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Filmy odstraněné z disku jsou automaticky sledovány v {appName}u",
"Automatic": "Automatický", "Automatic": "Automatický",
"BackupFolderHelpText": "Relativní cesty budou v adresáři AppData společnosti {appName}", "BackupFolderHelpText": "Relativní cesty budou v adresáři AppData společnosti {appName}",
"BackupNow": "Ihned zálohovat", "BackupNow": "Zálohovat nyní",
"BackupRetentionHelpText": "Automatické zálohy starší než doba uchovávání budou automaticky vyčištěny", "BackupRetentionHelpText": "Automatické zálohy starší než doba uchovávání budou automaticky vyčištěny",
"Backups": "Zálohy", "Backups": "Zálohy",
"BindAddress": "Vázat adresu", "BindAddress": "Vázat adresu",
"BindAddressHelpText": "Platná IP adresa, localhost nebo '*' pro všechna rozhraní", "BindAddressHelpText": "Platná IP adresa, localhost nebo * pro všechna rozhraní",
"BindAddressHelpTextWarning": "Vyžaduje restart, aby se projevilo", "BindAddressHelpTextWarning": "Vyžaduje restart, aby se projevilo",
"BookIsDownloading": "Film se stahuje", "BookIsDownloading": "Film se stahuje",
"BookIsDownloadingInterp": "Film se stahuje - {0}% {1}", "BookIsDownloadingInterp": "Film se stahuje - {0}% {1}",
@@ -41,8 +41,8 @@
"Calendar": "Kalendář", "Calendar": "Kalendář",
"CalendarWeekColumnHeaderHelpText": "Zobrazuje se nad každým sloupcem, když je aktivní zobrazení týden", "CalendarWeekColumnHeaderHelpText": "Zobrazuje se nad každým sloupcem, když je aktivní zobrazení týden",
"Cancel": "Zrušit", "Cancel": "Zrušit",
"CancelPendingTask": "Opravdu chcete zrušit tento nevyřízený úkol?", "CancelPendingTask": "Opravdu chcete zrušit tento úkol čekající na vyřízení?",
"CertificateValidation": "Ověření certifikátu", "CertificateValidation": "Ověřování certifikátu",
"CertificateValidationHelpText": "Změňte přísnost ověřování certifikátů HTTPS. Neměňte, pokud nerozumíte rizikům.", "CertificateValidationHelpText": "Změňte přísnost ověřování certifikátů HTTPS. Neměňte, pokud nerozumíte rizikům.",
"ChangeFileDate": "Změnit datum souboru", "ChangeFileDate": "Změnit datum souboru",
"ChangeHasNotBeenSavedYet": "Změna ještě nebyla uložena", "ChangeHasNotBeenSavedYet": "Změna ještě nebyla uložena",
@@ -51,7 +51,7 @@
"ChmodFolderHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient správně nastavil oprávnění.", "ChmodFolderHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient správně nastavil oprávnění.",
"ChownGroupHelpText": "Název skupiny nebo gid. Použijte gid pro vzdálené systémy souborů.", "ChownGroupHelpText": "Název skupiny nebo gid. Použijte gid pro vzdálené systémy souborů.",
"ChownGroupHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient používal stejnou skupinu jako {appName}.", "ChownGroupHelpTextWarning": "Funguje to pouze v případě, že je uživatel souboru {appName} vlastníkem souboru. Je lepší zajistit, aby stahovací klient používal stejnou skupinu jako {appName}.",
"Clear": "Vyčistit", "Clear": "Vymazat",
"ClickToChangeQuality": "Kliknutím změníte kvalitu", "ClickToChangeQuality": "Kliknutím změníte kvalitu",
"ClientPriority": "Priorita klienta", "ClientPriority": "Priorita klienta",
"CloneIndexer": "Klonovat indexátor", "CloneIndexer": "Klonovat indexátor",
@@ -68,7 +68,7 @@
"CutoffHelpText": "Jakmile je této kvality dosaženo, {appName} již nebude stahovat filmy", "CutoffHelpText": "Jakmile je této kvality dosaženo, {appName} již nebude stahovat filmy",
"CutoffUnmet": "Mezní hodnota nesplněna", "CutoffUnmet": "Mezní hodnota nesplněna",
"DatabaseMigration": "Migrace databáze", "DatabaseMigration": "Migrace databáze",
"Dates": "Termíny", "Dates": "Data",
"DelayProfile": "Profil zpoždění", "DelayProfile": "Profil zpoždění",
"DelayProfiles": "Profily zpoždění", "DelayProfiles": "Profily zpoždění",
"DelayingDownloadUntilInterp": "Zpoždění stahování do {0} o {1}", "DelayingDownloadUntilInterp": "Zpoždění stahování do {0} o {1}",
@@ -429,8 +429,8 @@
"UsenetDelay": "Usenet Zpoždění", "UsenetDelay": "Usenet Zpoždění",
"UsenetDelayHelpText": "Zpoždění v minutách čekání před uvolněním z Usenetu", "UsenetDelayHelpText": "Zpoždění v minutách čekání před uvolněním z Usenetu",
"Username": "Uživatelské jméno", "Username": "Uživatelské jméno",
"BranchUpdate": "Pobočka, která se má použít k aktualizaci {appName}", "BranchUpdate": "Větev použitá k aktualizaci {appName}u",
"BranchUpdateMechanism": "Pobočka používaná mechanismem externí aktualizace", "BranchUpdateMechanism": "Větev použitá externím aktualizačním mechanismem",
"Version": "Verze", "Version": "Verze",
"WeekColumnHeader": "Záhlaví sloupce týdne", "WeekColumnHeader": "Záhlaví sloupce týdne",
"Year": "Rok", "Year": "Rok",
@@ -593,12 +593,12 @@
"NoChange": "Žádná změna", "NoChange": "Žádná změna",
"RemovingTag": "Odebírání značky", "RemovingTag": "Odebírání značky",
"SetTags": "Nastavit značky", "SetTags": "Nastavit značky",
"ApplyTagsHelpTextAdd": "Přidat: Přidá značky k již existujícímu seznamu", "ApplyTagsHelpTextAdd": "Přidat: Přidat štítky do existujícího seznamu štítků",
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování", "ApplyTagsHelpTextHowToApplyDownloadClients": "Jak použít značky na vybrané klienty pro stahování",
"ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané seznamy k importu", "ApplyTagsHelpTextHowToApplyImportLists": "Jak použít značky na vybrané seznamy k importu",
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít značky na vybrané indexery", "ApplyTagsHelpTextHowToApplyIndexers": "Jak použít štítky na vybrané indexery",
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané značky", "ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané štítky",
"ApplyTagsHelpTextReplace": "Nahradit: Nahradit značky zadanými značkami (prázdné pole vymaže všechny značky)", "ApplyTagsHelpTextReplace": "Nahradit: Nahradit štítky zadanými štítky (prázdné pole vymaže všechny štítky)",
"DeleteSelectedDownloadClients": "Odstranit klienta pro stahování", "DeleteSelectedDownloadClients": "Odstranit klienta pro stahování",
"DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?", "DeleteSelectedIndexersMessageText": "Opravdu chcete smazat {count} vybraný(ch) indexer(ů)?",
"Yes": "Ano", "Yes": "Ano",
@@ -618,9 +618,9 @@
"FreeSpace": "Volný prostor", "FreeSpace": "Volný prostor",
"System": "Systém", "System": "Systém",
"TotalSpace": "Celkový prostor", "TotalSpace": "Celkový prostor",
"ConnectionLost": "Spojení ztraceno", "ConnectionLost": "Ztráta spojení",
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.", "ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude třebaho znovu načíst.", "ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude potřeba ho znovu načíst.",
"Large": "Velký", "Large": "Velký",
"LastDuration": "lastDuration", "LastDuration": "lastDuration",
"Ui": "UI", "Ui": "UI",
@@ -630,7 +630,7 @@
"NextExecution": "Další spuštění", "NextExecution": "Další spuštění",
"ClickToChangeReleaseGroup": "Kliknutím změníte skupinu vydání", "ClickToChangeReleaseGroup": "Kliknutím změníte skupinu vydání",
"ApplicationURL": "URL aplikace", "ApplicationURL": "URL aplikace",
"ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základní adresy URL", "ApplicationUrlHelpText": "Externí adresa URL této aplikace včetně http(s)://, portu a základu URL",
"Continuing": "Pokračující", "Continuing": "Pokračující",
"AutomaticUpdatesDisabledDocker": "Automatické aktualizace nejsou při použití aktualizačního mechanismu Docker přímo podporovány. Obraz kontejneru je nutné aktualizovat mimo {appName} nebo použít skript", "AutomaticUpdatesDisabledDocker": "Automatické aktualizace nejsou při použití aktualizačního mechanismu Docker přímo podporovány. Obraz kontejneru je nutné aktualizovat mimo {appName} nebo použít skript",
"AppUpdated": "{appName} aktualizován", "AppUpdated": "{appName} aktualizován",
@@ -688,7 +688,7 @@
"AutoRedownloadFailedFromInteractiveSearch": "Opětovné stažení z interaktivního vyhledávání selhalo", "AutoRedownloadFailedFromInteractiveSearch": "Opětovné stažení z interaktivního vyhledávání selhalo",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Automaticky vyhledat a pokusit se o stažení jiného vydání, pokud bylo neúspěšné vydání zachyceno z interaktivního vyhledávání", "AutoRedownloadFailedFromInteractiveSearchHelpText": "Automaticky vyhledat a pokusit se o stažení jiného vydání, pokud bylo neúspěšné vydání zachyceno z interaktivního vyhledávání",
"SelectDropdown": "'Vybrat...", "SelectDropdown": "'Vybrat...",
"CustomFilter": "Vlastní filtry", "CustomFilter": "Vlastní filtr",
"SelectQuality": "Vyberte kvalitu", "SelectQuality": "Vyberte kvalitu",
"IndexerFlags": "Příznaky indexeru", "IndexerFlags": "Příznaky indexeru",
"InteractiveSearchModalHeader": "Interaktivní vyhledávání", "InteractiveSearchModalHeader": "Interaktivní vyhledávání",
@@ -702,13 +702,13 @@
"ConnectionSettingsUrlBaseHelpText": "Přidá předponu do {connectionName} url, jako např. {url}", "ConnectionSettingsUrlBaseHelpText": "Přidá předponu do {connectionName} url, jako např. {url}",
"AuthBasic": "Základní (vyskakovací okno prohlížeče)", "AuthBasic": "Základní (vyskakovací okno prohlížeče)",
"AuthenticationMethod": "Metoda ověřování", "AuthenticationMethod": "Metoda ověřování",
"AuthenticationMethodHelpTextWarning": "Prosím vyberte platnou metodu ověřování", "AuthenticationMethodHelpTextWarning": "Vyberte platnou metodu ověřování",
"AuthenticationRequired": "Vyžadované ověření", "AuthenticationRequired": "Vyžadováno ověření",
"AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Pokud nerozumíte rizikům, neměňte je.", "AuthenticationRequiredHelpText": "Změnit, pro které požadavky je vyžadováno ověření. Neměňte, pokud nerozumíte rizikům.",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo", "AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Potvrďte nové heslo",
"AuthenticationRequiredPasswordHelpTextWarning": "Vložte nové heslo", "AuthenticationRequiredPasswordHelpTextWarning": "Zadejte nové heslo",
"AuthenticationRequiredUsernameHelpTextWarning": "Vložte nové uživatelské jméno", "AuthenticationRequiredUsernameHelpTextWarning": "Zadejte nové uživatelské jméno",
"AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName} povolení ověření. Ověřování z místních adres můžete volitelně zakázat.", "AuthenticationRequiredWarning": "Aby se zabránilo vzdálenému přístupu bez ověření, vyžaduje nyní {appName}, aby bylo povoleno ověřování. Volitelně můžete zakázat ověřování z místních adres.",
"BlocklistOnlyHint": "Blokovat a nehledat náhradu", "BlocklistOnlyHint": "Blokovat a nehledat náhradu",
"Enabled": "Povoleno", "Enabled": "Povoleno",
"ApiKey": "Klíč API", "ApiKey": "Klíč API",
@@ -724,5 +724,7 @@
"InstallLatest": "Nainstalujte nejnovější", "InstallLatest": "Nainstalujte nejnovější",
"CurrentlyInstalled": "Aktuálně nainstalováno", "CurrentlyInstalled": "Aktuálně nainstalováno",
"UnmappedFiles": "Nezmapované složky", "UnmappedFiles": "Nezmapované složky",
"AptUpdater": "K instalaci aktualizace použijte apt" "AptUpdater": "K instalaci aktualizace používat apt",
"Author": "Autor",
"Book": "Kniha"
} }

View File

@@ -669,5 +669,6 @@
"DockerUpdater": "opdater docker-containeren for at modtage opdateringen", "DockerUpdater": "opdater docker-containeren for at modtage opdateringen",
"ExternalUpdater": "{appName} er konfigureret til at bruge en ekstern opdateringsmekanisme", "ExternalUpdater": "{appName} er konfigureret til at bruge en ekstern opdateringsmekanisme",
"OnLatestVersion": "Den seneste version af {appName} er allerede installeret", "OnLatestVersion": "Den seneste version af {appName} er allerede installeret",
"WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien »{name}«?" "WouldYouLikeToRestoreBackup": "Vil du gendanne sikkerhedskopien »{name}«?",
"MetadataProfile": "metadataprofil"
} }

View File

@@ -394,7 +394,7 @@
"ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "For more information on the individual indexers, click on the info buttons.", "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "For more information on the individual indexers, click on the info buttons.",
"ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "For more information on the individual lists, click on the info buttons.", "ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "For more information on the individual lists, click on the info buttons.",
"ForeignId": "Foreign ID", "ForeignId": "Foreign ID",
"ForeignIdHelpText": "The Musicbrainz Id of the author/book to exclude", "ForeignIdHelpText": "The Foreign Id of the author/book to exclude",
"Formats": "Formats", "Formats": "Formats",
"FreeSpace": "Free Space", "FreeSpace": "Free Space",
"FutureBooks": "Future Books", "FutureBooks": "Future Books",
@@ -619,7 +619,6 @@
"MusicBrainzRecordingID": "MusicBrainz Recording ID", "MusicBrainzRecordingID": "MusicBrainz Recording ID",
"MusicBrainzReleaseID": "MusicBrainz Release ID", "MusicBrainzReleaseID": "MusicBrainz Release ID",
"MusicBrainzTrackID": "MusicBrainz Track ID", "MusicBrainzTrackID": "MusicBrainz Track ID",
"MusicbrainzId": "Musicbrainz Id",
"MustContain": "Must Contain", "MustContain": "Must Contain",
"MustNotContain": "Must Not Contain", "MustNotContain": "Must Not Contain",
"NETCore": ".NET Core", "NETCore": ".NET Core",

File diff suppressed because it is too large Load Diff

View File

@@ -328,11 +328,11 @@
"ShortDateFormat": "Format de date courte", "ShortDateFormat": "Format de date courte",
"ShowCutoffUnmetIconHelpText": "Afficher l'icône des fichiers lorsque la limite n'a pas été atteinte", "ShowCutoffUnmetIconHelpText": "Afficher l'icône des fichiers lorsque la limite n'a pas été atteinte",
"ShowDateAdded": "Afficher la date d'ajout", "ShowDateAdded": "Afficher la date d'ajout",
"ShowMonitored": "Afficher le chemin", "ShowMonitored": "Afficher l'état de surveillance",
"ShowMonitoredHelpText": "Afficher l'état de surveillance sous le poster", "ShowMonitoredHelpText": "Affiche l'état de surveillance sous le poster",
"ShowPath": "Afficher le chemin", "ShowPath": "Afficher le chemin",
"ShowQualityProfile": "Afficher le profil de qualité", "ShowQualityProfile": "Afficher le profil de qualité",
"ShowQualityProfileHelpText": "Afficher le profil de qualité sous l'affiche", "ShowQualityProfileHelpText": "Affiche le profil de qualité sous l'affiche",
"ShowRelativeDates": "Afficher les dates relatives", "ShowRelativeDates": "Afficher les dates relatives",
"ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/Hier/etc) ou absolues", "ShowRelativeDatesHelpText": "Afficher les dates relatives (Aujourd'hui/Hier/etc) ou absolues",
"ShowSearch": "Afficher la recherche", "ShowSearch": "Afficher la recherche",
@@ -456,7 +456,7 @@
"ReleaseTitle": "Titre de la version", "ReleaseTitle": "Titre de la version",
"ShowBookTitleHelpText": "Affiche le titre du livre sous l'affiche", "ShowBookTitleHelpText": "Affiche le titre du livre sous l'affiche",
"ShowReleaseDate": "Afficher la date de sortie", "ShowReleaseDate": "Afficher la date de sortie",
"ShowTitle": "Montrer le titre", "ShowTitle": "Afficher le titre",
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Le dossier '{0}' et son contenu vont être supprimés.", "TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Le dossier '{0}' et son contenu vont être supprimés.",
"ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non coché, Readarr les supprimera", "ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non coché, Readarr les supprimera",
"Level": "Niveau", "Level": "Niveau",

View File

@@ -725,7 +725,7 @@
"AppUpdated": "{appName} Aggiornato", "AppUpdated": "{appName} Aggiornato",
"AllResultsAreHiddenByTheAppliedFilter": "Tutti i risultati sono nascosti dal filtro applicato", "AllResultsAreHiddenByTheAppliedFilter": "Tutti i risultati sono nascosti dal filtro applicato",
"AutoRedownloadFailed": "Download fallito", "AutoRedownloadFailed": "Download fallito",
"AddListExclusion": "Aggiungi Lista esclusioni", "AddListExclusion": "Aggiungi elenco esclusioni",
"Location": "Posizione", "Location": "Posizione",
"ListsSettingsSummary": "Liste", "ListsSettingsSummary": "Liste",
"RecentChanges": "Cambiamenti Recenti", "RecentChanges": "Cambiamenti Recenti",

View File

@@ -643,5 +643,6 @@
"ApiKeyValidationHealthCheckMessage": "API 키를 {length}자 이상으로 업데이트하세요. 설정 또는 구성 파일을 통해 이 작업을 수행할 수 있습니다.", "ApiKeyValidationHealthCheckMessage": "API 키를 {length}자 이상으로 업데이트하세요. 설정 또는 구성 파일을 통해 이 작업을 수행할 수 있습니다.",
"AppUpdated": "{appName} 업데이트", "AppUpdated": "{appName} 업데이트",
"AppUpdatedVersion": "{appName}이 버전 `{version}`으로 업데이트되었습니다. 최신 변경 사항을 받으려면 {appName}을 다시 로드해야 합니다", "AppUpdatedVersion": "{appName}이 버전 `{version}`으로 업데이트되었습니다. 최신 변경 사항을 받으려면 {appName}을 다시 로드해야 합니다",
"WouldYouLikeToRestoreBackup": "'{name}' 백업을 복원하시겠습니까?" "WouldYouLikeToRestoreBackup": "'{name}' 백업을 복원하시겠습니까?",
"UseSSL": "SSL 사용"
} }

View File

@@ -676,7 +676,7 @@
"Medium": "Средний", "Medium": "Средний",
"NotificationStatusAllClientHealthCheckMessage": "Все уведомления недоступны из-за ошибок", "NotificationStatusAllClientHealthCheckMessage": "Все уведомления недоступны из-за ошибок",
"TotalSpace": "Общее сводное место", "TotalSpace": "Общее сводное место",
"Ui": "Пользовательский интерфейс", "Ui": "Интерфейс",
"Backup": "Резервное копирование", "Backup": "Резервное копирование",
"Events": "События", "Events": "События",
"FreeSpace": "Свободное место", "FreeSpace": "Свободное место",

View File

@@ -8,7 +8,7 @@
"AddingTag": "Etiket ekleniyor", "AddingTag": "Etiket ekleniyor",
"AnalyticsEnabledHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir", "AnalyticsEnabledHelpTextWarning": "Etkili olması için yeniden başlatma gerektirir",
"Columns": "Sütunlar", "Columns": "Sütunlar",
"DeleteIndexer": "Dizinleyiciyi Sil", "DeleteIndexer": "İndeksleyiciyi Sil",
"DeleteRootFolderMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?", "DeleteRootFolderMessageText": "Dizin oluşturucuyu '{0}' silmek istediğinizden emin misiniz?",
"Ended": "Biten", "Ended": "Biten",
"Group": "Grup", "Group": "Grup",
@@ -28,7 +28,7 @@
"Authentication": "Doğrulama", "Authentication": "Doğrulama",
"AuthenticationMethodHelpText": "{appName}'e erişmek için Kullanıcı Adı ve Parola gereklidir", "AuthenticationMethodHelpText": "{appName}'e erişmek için Kullanıcı Adı ve Parola gereklidir",
"AuthorClickToChangeBook": "Filmi değiştirmek için tıklayın", "AuthorClickToChangeBook": "Filmi değiştirmek için tıklayın",
"AutoRedownloadFailedHelpText": "Otomatik olarak farklı bir Yayın arayın ve indirmeye çalışın", "AutoRedownloadFailedHelpText": "Farklı bir sürümü otomatik olarak ara ve indirmeyi dene",
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Diskten silinen filmler otomatik olarak {appName}'da izlenmez", "AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Diskten silinen filmler otomatik olarak {appName}'da izlenmez",
"Automatic": "Otomatik", "Automatic": "Otomatik",
"BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır", "BackupFolderHelpText": "Göreli yollar {appName}'ın AppData dizini altında olacaktır",
@@ -87,7 +87,7 @@
"DeleteImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil", "DeleteImportListExclusion": "İçe Aktarma Listesi Hariç Tutmasını Sil",
"DeleteImportListExclusionMessageText": "Bu içe aktarma listesi hariç tutma işlemini silmek istediğinizden emin misiniz?", "DeleteImportListExclusionMessageText": "Bu içe aktarma listesi hariç tutma işlemini silmek istediğinizden emin misiniz?",
"DeleteImportListMessageText": "'{name}' listesini silmek istediğinizden emin misiniz?", "DeleteImportListMessageText": "'{name}' listesini silmek istediğinizden emin misiniz?",
"DeleteIndexerMessageText": "'{name}' dizinleyicisini silmek istediğinizden emin misiniz?", "DeleteIndexerMessageText": "'{name}' indeksleyicisini silmek istediğinizden emin misiniz?",
"DeleteMetadataProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}", "DeleteMetadataProfileMessageText": "Kalite profilini silmek istediğinizden emin misiniz {0}",
"DeleteNotification": "Bildirimi Sil", "DeleteNotification": "Bildirimi Sil",
"DeleteNotificationMessageText": "'{name}' bildirimini silmek istediğinizden emin misiniz?", "DeleteNotificationMessageText": "'{name}' bildirimini silmek istediğinizden emin misiniz?",
@@ -112,7 +112,7 @@
"DownloadPropersAndRepacksHelpTexts1": "Propers / Repacks'e otomatik olarak yükseltme yapılıp yapılmayacağı", "DownloadPropersAndRepacksHelpTexts1": "Propers / Repacks'e otomatik olarak yükseltme yapılıp yapılmayacağı",
"DownloadWarningCheckDownloadClientForMoreDetails": "İndirme uyarısı: Daha fazla ayrıntı için indirme istemcisini kontrol edin", "DownloadWarningCheckDownloadClientForMoreDetails": "İndirme uyarısı: Daha fazla ayrıntı için indirme istemcisini kontrol edin",
"Edit": "Düzenle", "Edit": "Düzenle",
"Edition": "Baskı", "Edition": "Versiyon",
"Enable": "etkinleştirme", "Enable": "etkinleştirme",
"EnableAutomaticAdd": "Otomatik Eklemeyi Etkinleştir", "EnableAutomaticAdd": "Otomatik Eklemeyi Etkinleştir",
"EnableAutomaticSearch": "Otomatik Aramayı Etkinleştir", "EnableAutomaticSearch": "Otomatik Aramayı Etkinleştir",
@@ -133,7 +133,7 @@
"FileNames": "Dosya Adları", "FileNames": "Dosya Adları",
"Filename": "Dosya adı", "Filename": "Dosya adı",
"Files": "Dosyalar", "Files": "Dosyalar",
"FirstDayOfWeek": "Haftanın ilk günü", "FirstDayOfWeek": "Haftanın İlk Günü",
"Fixed": "Düzeltilen", "Fixed": "Düzeltilen",
"Folder": "Klasör", "Folder": "Klasör",
"Folders": "Klasörler", "Folders": "Klasörler",
@@ -170,10 +170,10 @@
"IncludeHealthWarningsHelpText": "Sağlık Uyarılarını Dahil Et", "IncludeHealthWarningsHelpText": "Sağlık Uyarılarını Dahil Et",
"IncludeUnknownAuthorItemsHelpText": "Kuyrukta film olmayan öğeleri gösterin. Bu, kaldırılan filmleri veya {appName}'ın kategorisindeki herhangi bir şeyi içerebilir", "IncludeUnknownAuthorItemsHelpText": "Kuyrukta film olmayan öğeleri gösterin. Bu, kaldırılan filmleri veya {appName}'ın kategorisindeki herhangi bir şeyi içerebilir",
"IncludeUnmonitored": "Takip Edilmeyenleri Dahil Et", "IncludeUnmonitored": "Takip Edilmeyenleri Dahil Et",
"Indexer": "Dizinleyici", "Indexer": "İndeksleyici",
"IndexerPriority": "Dizinleyici Önceliği", "IndexerPriority": "İndeksleyici Önceliği",
"IndexerSettings": "Dizinleyici Ayarları", "IndexerSettings": "İndeksleyici Ayarları",
"Indexers": "Dizinleyiciler", "Indexers": "İndeksleyiciler",
"Interval": "Periyot", "Interval": "Periyot",
"IsCutoffCutoff": "Ayırmak", "IsCutoffCutoff": "Ayırmak",
"IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Bu kalite karşılanana veya aşılana kadar yükseltin", "IsCutoffUpgradeUntilThisQualityIsMetOrExceeded": "Bu kalite karşılanana veya aşılana kadar yükseltin",
@@ -217,9 +217,9 @@
"NoBackupsAreAvailable": "Kullanılabilir yedek yok", "NoBackupsAreAvailable": "Kullanılabilir yedek yok",
"NoLeaveIt": "Hayır, Bırak", "NoLeaveIt": "Hayır, Bırak",
"NoLimitForAnyRuntime": "Herhangi bir çalışma zamanı için sınır yok", "NoLimitForAnyRuntime": "Herhangi bir çalışma zamanı için sınır yok",
"NoLogFiles": "Log kayıt dosyası henüz yok", "NoLogFiles": "Log kayıt dosyası henüz oluşturulmadı",
"NoMinimumForAnyRuntime": "Herhangi bir çalışma süresi için minimum değer yok", "NoMinimumForAnyRuntime": "Herhangi bir çalışma süresi için minimum değer yok",
"NoUpdatesAreAvailable": "Güncelleme yok", "NoUpdatesAreAvailable": "Güncelleme bulunamadı",
"NotificationTriggers": "Bildirim Tetikleyicileri", "NotificationTriggers": "Bildirim Tetikleyicileri",
"OnGrabHelpText": "Yakalandığında", "OnGrabHelpText": "Yakalandığında",
"OnHealthIssueHelpText": "Sağlık Sorunu Hakkında", "OnHealthIssueHelpText": "Sağlık Sorunu Hakkında",
@@ -333,8 +333,8 @@
"ShowPath": "Yolu Göster", "ShowPath": "Yolu Göster",
"ShowQualityProfile": "Kalite Profilini Göster", "ShowQualityProfile": "Kalite Profilini Göster",
"ShowQualityProfileHelpText": "Poster altında kalite profilini göster", "ShowQualityProfileHelpText": "Poster altında kalite profilini göster",
"ShowRelativeDates": "Göreli Tarihleri Göster", "ShowRelativeDates": "İlgili Tarihleri Göster",
"ShowRelativeDatesHelpText": "Göreli (Bugün / Dün / vb.) Veya mutlak tarihleri göster", "ShowRelativeDatesHelpText": "Göreceli (Bugün/Dün/vb.) veya mutlak tarihleri göster",
"ShowSearch": "Aramayı Göster", "ShowSearch": "Aramayı Göster",
"ShowSearchActionHelpText": "Fareyle üzerine gelindiğinde arama düğmesini göster", "ShowSearchActionHelpText": "Fareyle üzerine gelindiğinde arama düğmesini göster",
"ShowSizeOnDisk": "Diskte Boyutu Göster", "ShowSizeOnDisk": "Diskte Boyutu Göster",
@@ -354,7 +354,7 @@
"StartupDirectory": "Başlangıç Dizini", "StartupDirectory": "Başlangıç Dizini",
"Status": "Durum", "Status": "Durum",
"StatusEndedEnded": "Bitti", "StatusEndedEnded": "Bitti",
"Style": "Tarz", "Style": "Stil",
"SuccessMyWorkIsDoneNoFilesToRename": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.", "SuccessMyWorkIsDoneNoFilesToRename": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.",
"SuccessMyWorkIsDoneNoFilesToRetag": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.", "SuccessMyWorkIsDoneNoFilesToRetag": "Başarılı! İşim bitti, yeniden adlandırılacak dosya yok.",
"SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor", "SupportsRssvalueRSSIsNotSupportedWithThisIndexer": "RSS, bu indeksleyici ile desteklenmiyor",
@@ -366,7 +366,7 @@
"Tasks": "Görevler", "Tasks": "Görevler",
"TestAll": "Tümünü Test Et", "TestAll": "Tümünü Test Et",
"TestAllClients": "Tüm İstemcileri Test Et", "TestAllClients": "Tüm İstemcileri Test Et",
"TestAllIndexers": "Dizinleyicileri Test Et", "TestAllIndexers": "İndeksleyicileri Test Et",
"TestAllLists": "Tüm Listeleri Test Et", "TestAllLists": "Tüm Listeleri Test Et",
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Bu, tüm dizin oluşturucular için geçerli olacaktır, lütfen onlar tarafından belirlenen kurallara uyun", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Bu, tüm dizin oluşturucular için geçerli olacaktır, lütfen onlar tarafından belirlenen kurallara uyun",
"TimeFormat": "Zaman formatı", "TimeFormat": "Zaman formatı",
@@ -382,7 +382,7 @@
"URLBase": "URL Tabanı", "URLBase": "URL Tabanı",
"UnableToAddANewDownloadClientPleaseTryAgain": "Yeni bir indirme istemcisi eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewDownloadClientPleaseTryAgain": "Yeni bir indirme istemcisi eklenemiyor, lütfen tekrar deneyin.",
"UnableToAddANewImportListExclusionPleaseTryAgain": "Yeni bir liste dışlaması eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewImportListExclusionPleaseTryAgain": "Yeni bir liste dışlaması eklenemiyor, lütfen tekrar deneyin.",
"UnableToAddANewIndexerPleaseTryAgain": "Yeni bir dizinleyici eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewIndexerPleaseTryAgain": "Yeni bir indeksleyici eklenemiyor, lütfen tekrar deneyin.",
"UnableToAddANewListPleaseTryAgain": "Yeni bir liste eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewListPleaseTryAgain": "Yeni bir liste eklenemiyor, lütfen tekrar deneyin.",
"UnableToAddANewMetadataProfilePleaseTryAgain": "Yeni bir kaliteli profil eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewMetadataProfilePleaseTryAgain": "Yeni bir kaliteli profil eklenemiyor, lütfen tekrar deneyin.",
"UnableToAddANewNotificationPleaseTryAgain": "Yeni bir bildirim eklenemiyor, lütfen tekrar deneyin.", "UnableToAddANewNotificationPleaseTryAgain": "Yeni bir bildirim eklenemiyor, lütfen tekrar deneyin.",
@@ -397,7 +397,7 @@
"UnableToLoadHistory": "Geçmiş yüklenemiyor", "UnableToLoadHistory": "Geçmiş yüklenemiyor",
"UnableToLoadImportListExclusions": "Hariç Tutulanlar Listesi yüklenemiyor", "UnableToLoadImportListExclusions": "Hariç Tutulanlar Listesi yüklenemiyor",
"UnableToLoadIndexerOptions": "Dizin oluşturucu seçenekleri yüklenemiyor", "UnableToLoadIndexerOptions": "Dizin oluşturucu seçenekleri yüklenemiyor",
"UnableToLoadIndexers": "Dizinleyiciler yüklenemiyor", "UnableToLoadIndexers": "İndeksleyiciler yüklenemiyor",
"UnableToLoadLists": "Listeler yüklenemiyor", "UnableToLoadLists": "Listeler yüklenemiyor",
"UnableToLoadMediaManagementSettings": "Medya Yönetimi ayarları yüklenemiyor", "UnableToLoadMediaManagementSettings": "Medya Yönetimi ayarları yüklenemiyor",
"UnableToLoadMetadata": "Meta Veriler yüklenemiyor", "UnableToLoadMetadata": "Meta Veriler yüklenemiyor",
@@ -437,12 +437,12 @@
"YesCancel": "Evet İptal", "YesCancel": "Evet İptal",
"DownloadClientCheckDownloadingToRoot": "İndirme istemcisi {0}, indirmeleri kök klasöre yerleştirir {1}. Bir kök klasöre indirmemelisiniz.", "DownloadClientCheckDownloadingToRoot": "İndirme istemcisi {0}, indirmeleri kök klasöre yerleştirir {1}. Bir kök klasöre indirmemelisiniz.",
"NotAvailable": "Müsait değil", "NotAvailable": "Müsait değil",
"ReleaseTitle": "Yayin Başlığı", "ReleaseTitle": "Yayın Başlığı",
"ShowReleaseDate": ıkış Tarihini Göster", "ShowReleaseDate": ıkış Tarihini Göster",
"ReplaceIllegalCharactersHelpText": "Geçersiz karakterleri değiştirin. İşaretli değilse, {appName} onları kaldıracaktır.", "ReplaceIllegalCharactersHelpText": "Geçersiz karakterleri değiştirin. İşaretli değilse, {appName} onları kaldıracaktır.",
"BookAvailableButMissing": "Film Mevcut, ancak Eksik", "BookAvailableButMissing": "Film Mevcut, ancak Eksik",
"NotMonitored": "Takip Edilmeyen", "NotMonitored": "Takip Edilmeyen",
"OutputPath": "Çıkış yolu", "OutputPath": "İndirilen Yol",
"Progress": "İlerleme", "Progress": "İlerleme",
"ShowBookTitleHelpText": "Film başlığını posterin altında göster", "ShowBookTitleHelpText": "Film başlığını posterin altında göster",
"ShowTitle": "Başlığı göster", "ShowTitle": "Başlığı göster",
@@ -477,18 +477,18 @@
"CreateEmptyAuthorFolders": "Boş film klasörleri oluşturun", "CreateEmptyAuthorFolders": "Boş film klasörleri oluşturun",
"General": "Genel", "General": "Genel",
"GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analizler ve güncellemeler", "GeneralSettingsSummary": "Port, SSL, kullanıcı adı/şifre, proxy, analizler ve güncellemeler",
"ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", "ImportListStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indeksleyiciler kullanılamıyor",
"ImportListStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}", "ImportListStatusCheckSingleClientMessage": "Hatalar nedeniyle kullanılamayan listeler: {0}",
"ImportMechanismHealthCheckMessage": "Tamamlanan İndirme İşlemini Etkinleştir", "ImportMechanismHealthCheckMessage": "Tamamlanan İndirme İşlemini Etkinleştir",
"IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm dizinleyiciler kullanılamıyor", "IndexerLongTermStatusCheckAllClientMessage": "6 saatten uzun süren arızalar nedeniyle tüm indeksleyiciler kullanılamıyor",
"IndexerLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}", "IndexerLongTermStatusCheckSingleClientMessage": "6 saatten uzun süredir yaşanan arızalar nedeniyle dizinleyiciler kullanılamıyor: {0}",
"IndexerRssHealthCheckNoAvailableIndexers": "Son zamanlardaki dizinleyici hataları nedeniyle tüm rss uyumlu dizinleyiciler geçici olarak kullanılamıyor", "IndexerRssHealthCheckNoAvailableIndexers": "Son zamanlardaki indeksleyici hataları nedeniyle tüm rss uyumlu indeksleyiciler geçici olarak kullanılamıyor",
"IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni sürümleri otomatik olarak almayacak", "IndexerRssHealthCheckNoIndexers": "RSS senkronizasyonunun etkin olduğu dizinleyici yok, {appName} yeni sürümleri otomatik olarak almayacak",
"IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinken indeksleyici yok, {appName} herhangi bir otomatik arama sonucu sağlamayacak", "IndexerSearchCheckNoAutomaticMessage": "Otomatik Arama etkinken indeksleyici yok, {appName} herhangi bir otomatik arama sonucu sağlamayacak",
"IndexerSearchCheckNoAvailableIndexersMessage": "Son zamanlardaki dizinleyici hataları nedeniyle tüm arama yeteneğine sahip dizinleyiciler geçici olarak kullanılamıyor", "IndexerSearchCheckNoAvailableIndexersMessage": "Son zamanlardaki indeksleyici hataları nedeniyle tüm arama yeteneğine sahip indeksleyiciler geçici olarak kullanılamıyor",
"IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinken indeksleyici yok, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır", "IndexerSearchCheckNoInteractiveMessage": "Etkileşimli Arama etkinken indeksleyici yok, {appName} herhangi bir etkileşimli arama sonucu sağlamayacaktır",
"IndexersSettingsSummary": "Dizinleyiciler ve yayımlama kısıtlamaları", "IndexersSettingsSummary": "İndeksleyiciler ve yayımlama kısıtlamaları",
"IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm dizinleyiciler kullanılamıyor", "IndexerStatusCheckAllClientMessage": "Hatalar nedeniyle tüm indeksleyiciler kullanılamıyor",
"IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}", "IndexerStatusCheckSingleClientMessage": "Hatalar nedeniyle dizinleyiciler kullanılamıyor: {0}",
"MediaManagement": "Medya Yönetimi", "MediaManagement": "Medya Yönetimi",
"MissingFromDisk": "{appName} dosyayı diskte bulamadı, bu yüzden kaldırıldı", "MissingFromDisk": "{appName} dosyayı diskte bulamadı, bu yüzden kaldırıldı",
@@ -595,7 +595,7 @@
"ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın", "ApplyTagsHelpTextRemove": "Kaldır: Girilen etiketleri kaldırın",
"ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)", "ApplyTagsHelpTextReplace": "Değiştir: Etiketleri girilen etiketlerle değiştirin (tüm etiketleri kaldırmak için etiket girmeyin)",
"DeleteSelectedDownloadClients": "İndirme İstemcilerini Sil", "DeleteSelectedDownloadClients": "İndirme İstemcilerini Sil",
"DeleteSelectedIndexers": "Dizinleyicileri Sil", "DeleteSelectedIndexers": "İndeksleyicileri Sil",
"ExistingTag": "Mevcut etiket", "ExistingTag": "Mevcut etiket",
"No": "Hayır", "No": "Hayır",
"NoChange": "Değişiklik yok", "NoChange": "Değişiklik yok",
@@ -652,10 +652,10 @@
"ClickToChangeReleaseGroup": "Yayım grubunu değiştirmek için tıklayın", "ClickToChangeReleaseGroup": "Yayım grubunu değiştirmek için tıklayın",
"CloneCondition": "Klon Durumu", "CloneCondition": "Klon Durumu",
"CustomFilter": "Özel Filtre", "CustomFilter": "Özel Filtre",
"AutoRedownloadFailed": "Yeniden İndirme Başarısız", "AutoRedownloadFailed": "Başarısız İndirmeleri Yenile",
"AutoRedownloadFailedFromInteractiveSearchHelpText": "Başarısız indirmeler, etkileşimli aramada bulunduğunda otomatik olarak farklı bir versiyonu arayın ve indirmeyi deneyin", "AutoRedownloadFailedFromInteractiveSearchHelpText": "Etkileşimli aramadan başarısız bir sürüm alındığında otomatik olarak farklı bir sürümü arayın ve indirmeye çalışın",
"ChangeCategoryHint": "İndirme İstemcisi'nden indirme işlemini 'İçe Aktarma Sonrası Kategorisi' olarak değiştirir", "ChangeCategoryHint": "İndirme İstemcisi'nden indirme işlemini 'İçe Aktarma Sonrası Kategorisi' olarak değiştirir",
"AutoRedownloadFailedFromInteractiveSearch": "Etkileşimli Aramadan Yeniden İndirme Başarısız Oldu", "AutoRedownloadFailedFromInteractiveSearch": "Etkileşimli Arama'dan Başarısız İndirmeleri Yenile",
"AutomaticAdd": "Otomatik Ekle", "AutomaticAdd": "Otomatik Ekle",
"DeleteCondition": "Koşulu Sil", "DeleteCondition": "Koşulu Sil",
"DeleteSelectedImportListsMessageText": "Seçilen {count} içe aktarma listesini silmek istediğinizden emin misiniz?", "DeleteSelectedImportListsMessageText": "Seçilen {count} içe aktarma listesini silmek istediğinizden emin misiniz?",
@@ -664,7 +664,7 @@
"DeleteSelectedImportLists": "İçe Aktarma Listelerini Sil", "DeleteSelectedImportLists": "İçe Aktarma Listelerini Sil",
"DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?", "DeleteSelectedDownloadClientsMessageText": "Seçilen {count} indirme istemcisini silmek istediğinizden emin misiniz?",
"DeleteRootFolder": "Kök Klasörü Sil", "DeleteRootFolder": "Kök Klasörü Sil",
"DeleteSelectedIndexersMessageText": "Seçilen {count} dizinleyiciyi silmek istediğinizden emin misiniz?", "DeleteSelectedIndexersMessageText": "Seçilen {count} indeksleyiciyi silmek istediğinizden emin misiniz?",
"DoNotBlocklist": "Engelleme Listesine Eklemeyin", "DoNotBlocklist": "Engelleme Listesine Eklemeyin",
"DoNotBlocklistHint": "Engellenenler listesine eklemeden kaldır", "DoNotBlocklistHint": "Engellenenler listesine eklemeden kaldır",
"CustomFormatsSettingsTriggerInfo": "Bir yayına veya dosyaya, seçilen farklı koşul türlerinden en az biriyle eşleştiğinde Özel Format uygulanacaktır.", "CustomFormatsSettingsTriggerInfo": "Bir yayına veya dosyaya, seçilen farklı koşul türlerinden en az biriyle eşleştiğinde Özel Format uygulanacaktır.",
@@ -678,11 +678,11 @@
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent'in yapılandırılmış içerik düzenini mi, torrentteki orijinal düzeni mi kullanacağınızı yoksa her zaman bir alt klasör oluşturup oluşturmayacağınızı (qBittorrent 4.3.2+)", "DownloadClientQbittorrentSettingsContentLayoutHelpText": "qBittorrent'in yapılandırılmış içerik düzenini mi, torrentteki orijinal düzeni mi kullanacağınızı yoksa her zaman bir alt klasör oluşturup oluşturmayacağınızı (qBittorrent 4.3.2+)",
"EditSelectedImportLists": "Seçilen İçe Aktarma Listelerini Düzenle", "EditSelectedImportLists": "Seçilen İçe Aktarma Listelerini Düzenle",
"NoImportListsFound": "İçe aktarma listesi bulunamadı", "NoImportListsFound": "İçe aktarma listesi bulunamadı",
"IndexerDownloadClientHelpText": "Bu dizinleyiciden almak için hangi indirme istemcisinin kullanılacağını belirtin", "IndexerDownloadClientHelpText": "Bu indeksleyiciden almak için hangi indirme istemcisinin kullanılacağını belirtin",
"ManageDownloadClients": "İndirme İstemcilerini Yönet", "ManageDownloadClients": "İndirme İstemcilerini Yönet",
"ManageIndexers": "Dizinleyicileri Yönet", "ManageIndexers": "İndeksleyicileri Yönet",
"NoHistoryBlocklist": "Geçmiş engellenenler listesi yok", "NoHistoryBlocklist": "Geçmiş engellenenler listesi yok",
"NoIndexersFound": "Dizinleyici bulunamadı", "NoIndexersFound": "İndeksleyici bulunamadı",
"InstanceName": "Örnek isim", "InstanceName": "Örnek isim",
"ListRefreshInterval": "Liste Yenileme Aralığı", "ListRefreshInterval": "Liste Yenileme Aralığı",
"Label": "Etiket", "Label": "Etiket",
@@ -697,7 +697,7 @@
"Implementation": "Uygula", "Implementation": "Uygula",
"IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizinleyiciler: {0}.", "IndexerDownloadClientHealthCheckMessage": "Geçersiz indirme istemcilerine sahip dizinleyiciler: {0}.",
"LabelIsRequired": "Etiket gerekli", "LabelIsRequired": "Etiket gerekli",
"EditSelectedIndexers": "Seçili Dizinleyicileri Düzenle", "EditSelectedIndexers": "Seçili İndeksleyicileri Düzenle",
"ManageImportLists": "İçe Aktarma Listelerini Yönet", "ManageImportLists": "İçe Aktarma Listelerini Yönet",
"IgnoreDownload": "İndirmeyi Yoksay", "IgnoreDownload": "İndirmeyi Yoksay",
"IgnoreDownloadHint": "{appName}'in bu indirmeyi daha fazla işlemesini durdurur", "IgnoreDownloadHint": "{appName}'in bu indirmeyi daha fazla işlemesini durdurur",
@@ -710,7 +710,7 @@
"RemoveCompleted": "Tamamlananları Kaldır", "RemoveCompleted": "Tamamlananları Kaldır",
"RemoveFailedDownloads": "Başarısız İndirmeleri Kaldır", "RemoveFailedDownloads": "Başarısız İndirmeleri Kaldır",
"ResetDefinitions": "Tanımları Sıfırla", "ResetDefinitions": "Tanımları Sıfırla",
"NotificationsPlexSettingsAuthToken": "Kimlik Doğrulama Jetonu", "NotificationsPlexSettingsAuthToken": "Kimlik Doğrulama Token'ı",
"NotificationsSettingsUpdateMapPathsFrom": "Harita Yolları", "NotificationsSettingsUpdateMapPathsFrom": "Harita Yolları",
"NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv ile kimlik doğrulaması yapın", "NotificationsPlexSettingsAuthenticateWithPlexTv": "Plex.tv ile kimlik doğrulaması yapın",
"NotificationsSettingsUpdateLibrary": "Kitaplığı Güncelle", "NotificationsSettingsUpdateLibrary": "Kitaplığı Güncelle",
@@ -722,8 +722,8 @@
"RemoveDownloadsAlert": "Kaldırma ayarları, yukarıdaki tabloda bireysel İndirme İstemcisi ayarlarına taşınmıştır.", "RemoveDownloadsAlert": "Kaldırma ayarları, yukarıdaki tabloda bireysel İndirme İstemcisi ayarlarına taşınmıştır.",
"RemoveSelectedItem": "Seçilen Öğeyi Kaldır", "RemoveSelectedItem": "Seçilen Öğeyi Kaldır",
"ResetQualityDefinitions": "Kalite Tanımlarını Sıfırla", "ResetQualityDefinitions": "Kalite Tanımlarını Sıfırla",
"SelectIndexerFlags": "Dizinleyici Bayraklarını Seçin", "SelectIndexerFlags": "İndeksleyici Bayraklarını Seçin",
"SetIndexerFlags": "Dizinleyici Bayraklarını Ayarla", "SetIndexerFlags": "İndeksleyici Bayraklarını Ayarla",
"WouldYouLikeToRestoreBackup": "'{name}' yedeğini geri yüklemek ister misiniz?", "WouldYouLikeToRestoreBackup": "'{name}' yedeğini geri yüklemek ister misiniz?",
"ThereWasAnErrorLoadingThisPage": "Sayfa yüklenirken bir hata oluştu", "ThereWasAnErrorLoadingThisPage": "Sayfa yüklenirken bir hata oluştu",
"Theme": "Tema", "Theme": "Tema",
@@ -746,8 +746,8 @@
"UpdateAvailable": "Yeni güncelleme mevcut", "UpdateAvailable": "Yeni güncelleme mevcut",
"ThemeHelpText": "Uygulama Kullanıcı Arayüzü Temasını Değiştirin, 'Otomatik' Teması, Açık veya Koyu modu ayarlamak için İşletim Sistemi Temanızı kullanacaktır. Theme.Park'tan ilham alındı", "ThemeHelpText": "Uygulama Kullanıcı Arayüzü Temasını Değiştirin, 'Otomatik' Teması, Açık veya Koyu modu ayarlamak için İşletim Sistemi Temanızı kullanacaktır. Theme.Park'tan ilham alındı",
"RemoveQueueItemRemovalMethodHelpTextWarning": "'İndirme İstemcisinden Kaldır', indirme işlemini ve dosyaları indirme istemcisinden kaldıracaktır.", "RemoveQueueItemRemovalMethodHelpTextWarning": "'İndirme İstemcisinden Kaldır', indirme işlemini ve dosyaları indirme istemcisinden kaldıracaktır.",
"ClickToChangeIndexerFlags": "Dizinleyici bayraklarını değiştirmek için tıklayın", "ClickToChangeIndexerFlags": "İndeksleyici bayraklarını değiştirmek için tıklayın",
"IndexerFlags": "Dizinleyici Bayrakları", "IndexerFlags": "İndeksleyici Bayrakları",
"IndexerSettingsSeedRatioHelpText": "Bir torrentin durdurulmadan önce ulaşması gereken oran. Boş bırakılırsa indirme istemcisinin varsayılan değerini kullanır. Oran en az 1,0 olmalı ve indeksleyici kurallarına uygun olmalıdır", "IndexerSettingsSeedRatioHelpText": "Bir torrentin durdurulmadan önce ulaşması gereken oran. Boş bırakılırsa indirme istemcisinin varsayılan değerini kullanır. Oran en az 1,0 olmalı ve indeksleyici kurallarına uygun olmalıdır",
"IndexerSettingsSeedTime": "Seed Süresi", "IndexerSettingsSeedTime": "Seed Süresi",
"IndexerSettingsSeedRatio": "Seed Oranı", "IndexerSettingsSeedRatio": "Seed Oranı",
@@ -858,5 +858,10 @@
"Other": "Diğer", "Other": "Diğer",
"Continuing": "Devam Ediyor", "Continuing": "Devam Ediyor",
"Monitoring": "Takip Durumu", "Monitoring": "Takip Durumu",
"Book": "Kitap" "Book": "Kitap",
"LogRotation": "Günlük Döndürme",
"FilterSentryEventsHelpText": "Bilinen kullanıcı hatası olaylarının Analitik olarak gönderilmesini filtreleyin",
"LogRotateHelpText": "Günlük klasöründe saklanacak maksimum günlük dosyası sayısı",
"FilterAnalyticsEvents": "Analitik Olayları Filtrele",
"ConsoleLogLevel": "Konsol Günlük Düzeyi"
} }

View File

@@ -1,10 +1,10 @@
{ {
"About": "關於", "About": "關於",
"Actions": "執行", "Actions": "動作",
"All": "全部", "All": "全部",
"AddingTag": "新增標籤", "AddingTag": "新增標籤",
"Analytics": "分析", "Analytics": "分析",
"AddList": "新增列表", "AddList": "加入清單",
"ExportCustomFormat": "新增自定義格式", "ExportCustomFormat": "新增自定義格式",
"Blocklist": "封鎖清單", "Blocklist": "封鎖清單",
"Branch": "分支", "Branch": "分支",
@@ -157,5 +157,19 @@
"UnableToLoadTags": "無法載入標籤", "UnableToLoadTags": "無法載入標籤",
"UnableToLoadUISettings": "無法載入 UI 設定", "UnableToLoadUISettings": "無法載入 UI 設定",
"UpdateAppDirectlyLoadError": "無法直接更新 {appName}", "UpdateAppDirectlyLoadError": "無法直接更新 {appName}",
"UnableToLoadHistory": "無法載入歷史記錄" "UnableToLoadHistory": "無法載入歷史記錄",
"AutoRedownloadFailed": "失敗時重新下載",
"AutoRedownloadFailedFromInteractiveSearch": "失敗時重新下載來自手動搜索的資源",
"AuthenticationMethodHelpTextWarning": "請選擇一個有效的驗證方式",
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "確認新密碼",
"AuthenticationRequiredPasswordHelpTextWarning": "請輸入新密碼",
"AuthenticationRequiredUsernameHelpTextWarning": "請輸入新用戶名",
"AuthenticationMethod": "驗證方式",
"AuthenticationRequired": "需要驗證",
"AuthenticationRequiredHelpText": "更改需要進行驗證的請求。除非你了解其中的風險,否則請勿修改。",
"AuthenticationRequiredWarning": "為防止未經認證的遠程訪問,{appName} 現需要啟用身份認證。您可以選擇禁用本地地址的身份認證。",
"IgnoredPlaceHolder": "加入新的限制",
"RequiredPlaceHolder": "加入新的限制",
"RedownloadFailed": "失敗時重新下載",
"UnableToAddANewRemotePathMappingPleaseTryAgain": "無法加入新的遠程路徑對應,請重試。"
} }

View File

@@ -6,6 +6,7 @@
<PackageReference Include="Dapper" /> <PackageReference Include="Dapper" />
<PackageReference Include="Diacritical.Net" /> <PackageReference Include="Diacritical.Net" />
<PackageReference Include="LazyCache" /> <PackageReference Include="LazyCache" />
<PackageReference Include="Microsoft.Data.SqlClient" />
<PackageReference Include="Polly" /> <PackageReference Include="Polly" />
<PackageReference Include="System.Text.Json" /> <PackageReference Include="System.Text.Json" />
<PackageReference Include="System.Text.Encoding.CodePages" /> <PackageReference Include="System.Text.Encoding.CodePages" />

View File

@@ -1,5 +1,4 @@
using FluentValidation; using FluentValidation;
using FluentValidation.Validators;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
namespace NzbDrone.Core.Validation namespace NzbDrone.Core.Validation
@@ -10,10 +9,5 @@ namespace NzbDrone.Core.Validation
{ {
return ruleBuilder.Must(x => x.IsValidIpAddress()).WithMessage("Must contain wildcard (*) or a valid IP Address"); return ruleBuilder.Must(x => x.IsValidIpAddress()).WithMessage("Must contain wildcard (*) or a valid IP Address");
} }
public static IRuleBuilderOptions<T, string> NotListenAllIp4Address<T>(this IRuleBuilder<T, string> ruleBuilder)
{
return ruleBuilder.SetValidator(new RegularExpressionValidator(@"^(?!0\.0\.0\.0)")).WithMessage("Use * instead of 0.0.0.0");
}
} }
} }

View File

@@ -34,7 +34,6 @@ namespace Readarr.Api.V1.Config
SharedValidator.RuleFor(c => c.BindAddress) SharedValidator.RuleFor(c => c.BindAddress)
.ValidIpAddress() .ValidIpAddress()
.NotListenAllIp4Address()
.When(c => c.BindAddress != "*" && c.BindAddress != "localhost"); .When(c => c.BindAddress != "*" && c.BindAddress != "localhost");
SharedValidator.RuleFor(c => c.Port).ValidPort(); SharedValidator.RuleFor(c => c.Port).ValidPort();

1299
yarn.lock

File diff suppressed because it is too large Load Diff