diff --git a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs index 180292622..3e2f5f430 100644 --- a/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs +++ b/src/NzbDrone.Core.Test/Localization/LocalizationServiceFixture.cs @@ -30,9 +30,11 @@ public void should_get_string_in_dictionary_if_lang_exists_and_string_exists() } [Test] - public void should_get_string_in_default_language_dictionary_if_no_lang_country_code_exists_and_string_exists() + public void should_get_string_in_french() { - var localizedString = Subject.GetLocalizedString("UiLanguage", "fr_fr"); + Mocker.GetMock().Setup(m => m.UILanguage).Returns((int)Language.French); + + var localizedString = Subject.GetLocalizedString("UiLanguage"); localizedString.Should().Be("UI Langue"); @@ -40,19 +42,10 @@ public void should_get_string_in_default_language_dictionary_if_no_lang_country_ } [Test] - public void should_get_string_in_default_dictionary_if_no_lang_exists_and_string_exists() + public void should_get_string_in_default_dictionary_if_unknown_language_and_string_exists() { - var localizedString = Subject.GetLocalizedString("UiLanguage", "an"); - - localizedString.Should().Be("UI Language"); - - ExceptionVerification.ExpectedErrors(1); - } - - [Test] - public void should_get_string_in_default_dictionary_if_lang_empty_and_string_exists() - { - var localizedString = Subject.GetLocalizedString("UiLanguage", ""); + Mocker.GetMock().Setup(m => m.UILanguage).Returns(0); + var localizedString = Subject.GetLocalizedString("UiLanguage"); localizedString.Should().Be("UI Language"); } @@ -60,7 +53,7 @@ public void should_get_string_in_default_dictionary_if_lang_empty_and_string_exi [Test] public void should_return_argument_if_string_doesnt_exists() { - var localizedString = Subject.GetLocalizedString("badString", "en"); + var localizedString = Subject.GetLocalizedString("badString"); localizedString.Should().Be("badString"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs index fa284cb31..ec4ae577a 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ApiKeyValidationCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using NLog; using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration.Events; @@ -28,7 +29,7 @@ public override HealthCheck Check() { _logger.Warn("Please update your API key to be at least {0} characters long. You can do this via settings or the config file", MinimumLength); - return new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format(_localizationService.GetLocalizedString("ApiKeyValidationHealthCheckMessage"), MinimumLength), "#invalid-api-key"); + return new HealthCheck(GetType(), HealthCheckResult.Warning, _localizationService.GetLocalizedString("ApiKeyValidationHealthCheckMessage", new Dictionary { { "MinimumLength", MinimumLength } }), "#invalid-api-key"); } return new HealthCheck(GetType()); diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs index e10ee665f..5d9cd4b7f 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.Download; @@ -44,7 +45,11 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Error, - $"{string.Format(_localizationService.GetLocalizedString("DownloadClientCheckUnableToCommunicateWithHealthCheckMessage"), downloadClient.Definition.Name)} {ex.Message}", + _localizationService.GetLocalizedString("DownloadClientCheckUnableToCommunicateWithHealthCheckMessage", new Dictionary + { + { "downloadClientName", downloadClient.Definition.Name }, + { "errorMessage", ex.Message } + }), "#unable-to-communicate-with-download-client"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs index 8683195cb..1e1be0a26 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRemovesCompletedDownloadsCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using NLog; using NzbDrone.Core.Datastore.Events; using NzbDrone.Core.Download; @@ -44,7 +45,10 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("DownloadClientRemovesCompletedDownloadsHealthCheckMessage"), clientName, "Sonarr"), + _localizationService.GetLocalizedString("DownloadClientRemovesCompletedDownloadsHealthCheckMessage", new Dictionary + { + { "downloadClientName", clientName } + }), "#download-client-removes-completed-downloads"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs index 4e25fdc70..4f0a6de05 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientRootFolderCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Net.Http; using NLog; @@ -53,7 +54,11 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("DownloadClientRootFolderHealthCheckMessage"), client.Definition.Name, folder.FullPath), + _localizationService.GetLocalizedString("DownloadClientRootFolderHealthCheckMessage", new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", folder.FullPath } + }), "#downloads-in-root-folder"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs index 37e7cc5fa..d6474bcb4 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientSortingCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.Datastore.Events; @@ -45,7 +46,11 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("DownloadClientSortingHealthCheckMessage"), clientName, status.SortingMode), + _localizationService.GetLocalizedString("DownloadClientSortingHealthCheckMessage", new Dictionary + { + { "downloadClientName", clientName }, + { "sortingMode", status.SortingMode } + }), "#download-folder-and-library-folder-not-different-folders"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs index acd0d5f9f..01e190475 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/DownloadClientStatusCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Download; @@ -45,7 +46,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("DownloadClientStatusSingleClientHealthCheckMessage"), string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + _localizationService.GetLocalizedString("DownloadClientStatusSingleClientHealthCheckMessage", new Dictionary + { + { "downloadClientNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), "#download-clients-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs index 15a9675f8..fc4ee7826 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ImportListRootFolderCheck.cs @@ -54,13 +54,19 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("ImportListRootFolderMissingRootHealthCheckMessage"), FormatRootFolder(missingRootFolder.Key, missingRootFolder.Value)), + _localizationService.GetLocalizedString("ImportListRootFolderMissingRootHealthCheckMessage", new Dictionary + { + { "rootFolderInfo", FormatRootFolder(missingRootFolder.Key, missingRootFolder.Value) } + }), "#import-list-missing-root-folder"); } return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("ImportListRootFolderMultipleMissingRootsHealthCheckMessage"), string.Join(" | ", missingRootFolders.Select(m => FormatRootFolder(m.Key, m.Value)))), + _localizationService.GetLocalizedString("ImportListRootFolderMultipleMissingRootsHealthCheckMessage", new Dictionary + { + { "rootFoldersInfo", string.Join(" | ", missingRootFolders.Select(m => FormatRootFolder(m.Key, m.Value))) } + }), "#import-list-missing-root-folder"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs index 17c958374..e11efc27c 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ImportListStatusCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.ImportLists; @@ -45,7 +46,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("ImportListStatusUnavailableHealthCheckMessage"), string.Join(", ", backOffProviders.Select(v => v.ImportList.Definition.Name))), + _localizationService.GetLocalizedString("ImportListStatusUnavailableHealthCheckMessage", new Dictionary + { + { "importListNames", string.Join(", ", backOffProviders.Select(v => v.ImportList.Definition.Name)) } + }), "#import-lists-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs index 94592426e..a7b17dbd8 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerDownloadClientCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Core.Download; using NzbDrone.Core.Indexers; @@ -35,7 +36,10 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerDownloadClientHealthCheckMessage"), string.Join(", ", invalidIndexers.Select(v => v.Name).ToArray())), + _localizationService.GetLocalizedString("IndexerDownloadClientHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", invalidIndexers.Select(v => v.Name).ToArray()) } + }), "#invalid-indexer-download-client-setting"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs index 366404892..f01a59437 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerJackettAllCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Indexers; @@ -41,7 +42,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerJackettAllHealthCheckMessage"), string.Join(", ", jackettAllProviders.Select(i => i.Name))), + _localizationService.GetLocalizedString("IndexerJackettAllHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", jackettAllProviders.Select(i => i.Name)) } + }), "#jackett-all-endpoint-used"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs index f0c71ba38..f419cf205 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerLongTermStatusCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Indexers; @@ -48,7 +49,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerLongTermStatusUnavailableHealthCheckMessage"), string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + _localizationService.GetLocalizedString("IndexerLongTermStatusUnavailableHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), "#indexers-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs index f3afaeba6..fa861fb94 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/IndexerStatusCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Indexers; @@ -48,7 +49,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("IndexerStatusUnavailableHealthCheckMessage"), string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + _localizationService.GetLocalizedString("IndexerStatusUnavailableHealthCheckMessage", new Dictionary + { + { "indexerNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), "#indexers-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs index c9b5e2561..daf5ee725 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/NotificationStatusCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Localization; @@ -45,7 +46,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Warning, - string.Format(_localizationService.GetLocalizedString("NotificationStatusSingleClientHealthCheckMessage"), string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name))), + _localizationService.GetLocalizedString("NotificationStatusSingleClientHealthCheckMessage", new Dictionary + { + { "notificationNames", string.Join(", ", backOffProviders.Select(v => v.Provider.Definition.Name)) } + }), "#notifications-are-unavailable-due-to-failures"); } } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs index 3d05a75ea..f09033370 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/ProxyCheck.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Collections.Generic; using System.Linq; using System.Net; using NLog; @@ -42,7 +43,10 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("ProxyResolveIpHealthCheckMessage"), _configService.ProxyHostname), + _localizationService.GetLocalizedString("ProxyResolveIpHealthCheckMessage", new Dictionary + { + { "proxyHostName", _configService.ProxyHostname } + }), "#proxy-failed-resolve-ip"); } @@ -61,7 +65,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("ProxyBadRequestHealthCheckMessage"), response.StatusCode), + _localizationService.GetLocalizedString("ProxyBadRequestHealthCheckMessage", new Dictionary + { + { "statusCode", response.StatusCode } + }), "#proxy-failed-test"); } } @@ -71,7 +78,10 @@ public override HealthCheck Check() return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("ProxyFailedToTestHealthCheckMessage"), request.Url), + _localizationService.GetLocalizedString("ProxyFailedToTestHealthCheckMessage", new Dictionary + { + { "url", request.Url } + }), "#proxy-failed-test"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs index 86d3949ac..ad30a74f7 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RecyclingBinCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; @@ -33,7 +34,10 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("RecycleBinUnableToWriteHealthCheckMessage"), recycleBin), + _localizationService.GetLocalizedString("RecycleBinUnableToWriteHealthCheckMessage", new Dictionary + { + { "path", recycleBin } + }), "#cannot-write-recycle-bin"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs index 2377272d0..eff41b1f2 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RemotePathMappingCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Net.Http; using NLog; @@ -68,30 +69,92 @@ public override HealthCheck Check() { if (!status.IsLocalhost) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingWrongOSPathHealthCheckMessage"), client.Definition.Name, folder.FullPath, _osInfo.Name), "#bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingWrongOSPathHealthCheckMessage", new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", folder.FullPath }, + { "osName", _osInfo.Name } + }), + "#bad-remote-path-mapping"); } if (_osInfo.IsDocker) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingBadDockerPathHealthCheckMessage"), client.Definition.Name, folder.FullPath, _osInfo.Name), "#docker-bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingBadDockerPathHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", folder.FullPath }, + { "osName", _osInfo.Name } + }), + "#docker-bad-remote-path-mapping"); } - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingLocalWrongOSPathHealthCheckMessage"), client.Definition.Name, folder.FullPath, _osInfo.Name), "#bad-download-client-settings"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingLocalWrongOSPathHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", folder.FullPath }, + { "osName", _osInfo.Name } + }), + "#bad-download-client-settings"); } if (!_diskProvider.FolderExists(folder.FullPath)) { if (_osInfo.IsDocker) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingDockerFolderMissingHealthCheckMessage"), client.Definition.Name, folder.FullPath), "#docker-bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingDockerFolderMissingHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", folder.FullPath } + }), + "#docker-bad-remote-path-mapping"); } if (!status.IsLocalhost) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingLocalFolderMissingHealthCheckMessage"), client.Definition.Name, folder.FullPath), "#bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingLocalFolderMissingHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", folder.FullPath } + }), + "#bad-remote-path-mapping"); } - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingGenericPermissionsHealthCheckMessage"), client.Definition.Name, folder.FullPath), "#permissions-error"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingGenericPermissionsHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", folder.FullPath } + }), + "#permissions-error"); } } } @@ -129,12 +192,28 @@ public HealthCheck Check(IEvent message) if (_diskProvider.FileExists(episodePath)) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingDownloadPermissionsHealthCheckMessage"), episodePath), "#permissions-error"); + return new HealthCheck(GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingDownloadPermissionsHealthCheckMessage", + new Dictionary + { + { "path", episodePath } + }), + "#permissions-error"); } // If the file doesn't exist but EpisodeInfo is not null then the message is coming from // ImportApprovedEpisodes and the file must have been removed part way through processing - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingFileRemovedHealthCheckMessage"), episodePath), "#remote-path-file-removed"); + return new HealthCheck(GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingFileRemovedHealthCheckMessage", + new Dictionary + { + { "path", episodePath } + }), + "#remote-path-file-removed"); } // If the previous case did not match then the failure occured in DownloadedEpisodeImportService, @@ -156,42 +235,118 @@ public HealthCheck Check(IEvent message) // that the user realises something is wrong. if (dlpath.IsNullOrWhiteSpace()) { - return new HealthCheck(GetType(), HealthCheckResult.Error, _localizationService.GetLocalizedString("RemotePathMappingImportFailedHealthCheckMessage"), "#remote-path-import-failed"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString("RemotePathMappingImportFailedHealthCheckMessage"), + "#remote-path-import-failed"); } if (!dlpath.IsPathValid(PathValidationType.CurrentOs)) { if (!status.IsLocalhost) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingFilesWrongOSPathHealthCheckMessage"), client.Definition.Name, dlpath, _osInfo.Name), "#bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingFilesWrongOSPathHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", dlpath }, + { "osName", _osInfo.Name } + }), + "#bad-remote-path-mapping"); } if (_osInfo.IsDocker) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingFilesBadDockerPathHealthCheckMessage"), client.Definition.Name, dlpath, _osInfo.Name), "#docker-bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingFilesBadDockerPathHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", dlpath }, + { "osName", _osInfo.Name } + }), + "#docker-bad-remote-path-mapping"); } - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage"), client.Definition.Name, dlpath, _osInfo.Name), "#bad-download-client-settings"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", dlpath }, + { "osName", _osInfo.Name } + }), + "#bad-download-client-settings"); } if (_diskProvider.FolderExists(dlpath)) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingFolderPermissionsHealthCheckMessage"), dlpath), "#permissions-error"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingFolderPermissionsHealthCheckMessage", + new Dictionary + { + { "path", dlpath } + }), + "#permissions-error"); } // if it's a remote client/docker, likely missing path mappings if (_osInfo.IsDocker) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingFolderPermissionsHealthCheckMessage"), client.Definition.Name, dlpath), "#docker-bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingFolderPermissionsHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", dlpath } + }), + "#docker-bad-remote-path-mapping"); } if (!status.IsLocalhost) { - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingRemoteDownloadClientHealthCheckMessage"), client.Definition.Name, dlpath), "#bad-remote-path-mapping"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingRemoteDownloadClientHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", dlpath }, + { "osName", _osInfo.Name } + }), "#bad-remote-path-mapping"); } // path mappings shouldn't be needed locally so probably a permissions issue - return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("RemotePathMappingFilesGenericPermissionsHealthCheckMessage"), client.Definition.Name, dlpath), "#permissions-error"); + return new HealthCheck( + GetType(), + HealthCheckResult.Error, + _localizationService.GetLocalizedString( + "RemotePathMappingFilesGenericPermissionsHealthCheckMessage", + new Dictionary + { + { "downloadClientName", client.Definition.Name }, + { "path", dlpath } + }), + "#permissions-error"); } catch (DownloadClientException ex) { diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs index 1d0a65a96..363d3010d 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RemovedSeriesCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Extensions; using NzbDrone.Core.Localization; @@ -34,13 +35,19 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("RemovedSeriesSingleRemovedHealthCheckMessage"), seriesText), + _localizationService.GetLocalizedString("RemovedSeriesSingleRemovedHealthCheckMessage", new Dictionary + { + { "series", seriesText } + }), "#series-removed-from-thetvdb"); } return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("RemovedSeriesMultipleRemovedHealthCheckMessage"), seriesText), + _localizationService.GetLocalizedString("RemovedSeriesMultipleRemovedHealthCheckMessage", new Dictionary + { + { "series", seriesText } + }), "#series-removed-from-thetvdb"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs index c730be8da..0b0016f52 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; @@ -42,13 +43,23 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("RootFolderMissingHealthCheckMessage"), missingRootFolders.First()), + _localizationService.GetLocalizedString( + "RootFolderMissingHealthCheckMessage", + new Dictionary + { + { "rootFolderPath", missingRootFolders.First() } + }), "#missing-root-folder"); } return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("RootFolderMultipleMissingHealthCheckMessage"), string.Join(" | ", missingRootFolders)), + _localizationService.GetLocalizedString( + "RootFolderMultipleMissingHealthCheckMessage", + new Dictionary + { + { "rootFolderPaths", string.Join(" | ", missingRootFolders) } + }), "#missing-root-folder"); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs index e4e0690a4..23ad009cc 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/UpdateCheck.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; @@ -47,7 +48,12 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("UpdateStartupTranslocationHealthCheckMessage"), startupFolder), + _localizationService.GetLocalizedString( + "UpdateStartupTranslocationHealthCheckMessage", + new Dictionary + { + { "startupFolder", startupFolder } + }), "#cannot-install-update-because-startup-folder-is-in-an-app-translocation-folder."); } @@ -55,7 +61,13 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("UpdateStartupNotWritableHealthCheckMessage"), startupFolder, Environment.UserName), + _localizationService.GetLocalizedString( + "UpdateStartupNotWritableHealthCheckMessage", + new Dictionary + { + { "startupFolder", startupFolder }, + { "userName", Environment.UserName } + }), "#cannot-install-update-because-startup-folder-is-not-writable-by-the-user"); } @@ -63,7 +75,13 @@ public override HealthCheck Check() { return new HealthCheck(GetType(), HealthCheckResult.Error, - string.Format(_localizationService.GetLocalizedString("UpdateUINotWritableHealthCheckMessage"), uiFolder, Environment.UserName), + _localizationService.GetLocalizedString( + "UpdateUiNotWritableHealthCheckMessage", + new Dictionary + { + { "startupFolder", startupFolder }, + { "userName", Environment.UserName } + }), "#cannot-install-update-because-ui-folder-is-not-writable-by-the-user"); } } diff --git a/src/NzbDrone.Core/Localization/Core/cs.json b/src/NzbDrone.Core/Localization/Core/cs.json index daac5ecc5..2d676a310 100644 --- a/src/NzbDrone.Core/Localization/Core/cs.json +++ b/src/NzbDrone.Core/Localization/Core/cs.json @@ -1,6 +1,6 @@ { "Added": "Přidáno", - "ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {0} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru", + "ApiKeyValidationHealthCheckMessage": "Aktualizujte svůj klíč API tak, aby měl alespoň {length} znaků. Můžete to provést prostřednictvím nastavení nebo konfiguračního souboru", "BlocklistRelease": "Blocklist pro vydání", "AgeWhenGrabbed": "Stáří (kdy bylo získáno)", "Always": "Vždy", @@ -246,7 +246,7 @@ "CustomFormatJson": "Vlastní JSON formát", "Debug": "Ladit", "Day": "Den", - "DeleteCustomFormatMessageText": "Opravdu chcete odstranit vlastní formát '{0}'?", + "DeleteCustomFormatMessageText": "Opravdu chcete odstranit vlastní formát '{customFormatName}'?", "DefaultNameCopiedProfile": "{name} - Kopírovat", "DefaultNameCopiedSpecification": "{name} - Kopírovat", "DefaultNotFoundMessage": "Asi jsi se ztratil, není tu nic k vidění.", diff --git a/src/NzbDrone.Core/Localization/Core/de.json b/src/NzbDrone.Core/Localization/Core/de.json index 3404099d9..dc241f8b0 100644 --- a/src/NzbDrone.Core/Localization/Core/de.json +++ b/src/NzbDrone.Core/Localization/Core/de.json @@ -1,6 +1,6 @@ { "Added": "Hinzugefügt", - "ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {0} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen", + "ApiKeyValidationHealthCheckMessage": "Bitte den API Schlüssel korrigieren, dieser muss mindestens {length} Zeichen lang sein. Die Änderung kann über die Einstellungen oder die Konfigurationsdatei erfolgen", "AppDataLocationHealthCheckMessage": "Ein Update ist nicht möglich, um das Löschen von AppData beim Update zu verhindern", "RemoveCompletedDownloads": "Entferne abgeschlossene Downloads", "RemoveFailedDownloads": "Entferne fehlgeschlagene Downloads", @@ -8,10 +8,10 @@ "AutomaticAdd": "Automatisch hinzufügen", "CountSeasons": "{Anzahl} Staffeln", "DownloadClientCheckNoneAvailableHealthCheckMessage": "Es ist kein Download-Client verfügbar", - "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Kommunikation mit {0} nicht möglich.", - "DownloadClientRootFolderHealthCheckMessage": "Der Download-Client {0} legt Downloads im Stammordner {1} ab. Sie sollten nicht in einen Stammordner herunterladen.", - "DownloadClientSortingHealthCheckMessage": "Im Download-Client {0} ist die Sortierung {1} für die Kategorie von {appName} aktiviert. Sie sollten die Sortierung in Ihrem Download-Client deaktivieren, um Importprobleme zu vermeiden.", - "DownloadClientStatusSingleClientHealthCheckMessage": "Download-Clients sind aufgrund von Fehlern nicht verfügbar: {0}", + "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Kommunikation mit {downloadClientName} nicht möglich.", + "DownloadClientRootFolderHealthCheckMessage": "Der Download-Client {downloadClientName} legt Downloads im Stammordner {rootFolderPath} ab. Sie sollten nicht in einen Stammordner herunterladen.", + "DownloadClientSortingHealthCheckMessage": "Im Download-Client {downloadClientName} ist die Sortierung {sortingMode} für die Kategorie von {appName} aktiviert. Sie sollten die Sortierung in Ihrem Download-Client deaktivieren, um Importprobleme zu vermeiden.", + "DownloadClientStatusSingleClientHealthCheckMessage": "Download-Clients sind aufgrund von Fehlern nicht verfügbar: {downloadClientNames}", "DownloadClientStatusAllClientHealthCheckMessage": "Alle Download-Clients sind aufgrund von Fehlern nicht verfügbar", "EditSelectedDownloadClients": "Ausgewählte Download Clienten bearbeiten", "EditSelectedImportLists": "Ausgewählte Einspiel-Liste bearbeten", @@ -22,10 +22,10 @@ "Language": "Sprache", "CloneCondition": "Bedingung klonen", "DeleteCondition": "Bedingung löschen", - "DeleteConditionMessageText": "Bist du sicher, dass du die Bedingung '{0}' löschen willst?", - "DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{0}' löschen willst?", + "DeleteConditionMessageText": "Bist du sicher, dass du die Bedingung '{name}' löschen willst?", + "DeleteCustomFormatMessageText": "Bist du sicher, dass du das eigene Format '{customFormatName}' löschen willst?", "RemoveSelectedItemQueueMessageText": "Bist du sicher, dass du ein Eintrag aus der Warteschlange entfernen willst?", - "RemoveSelectedItemsQueueMessageText": "Bist du sicher, dass du {0} Einträge aus der Warteschlange entfernen willst?", + "RemoveSelectedItemsQueueMessageText": "Bist du sicher, dass du {selectedCount} Einträge aus der Warteschlange entfernen willst?", "DeleteSelectedDownloadClients": "Lösche Download Client(s)", "DeleteSelectedIndexers": "Lösche Indexer", "DeleteSelectedImportLists": "Lösche Einspiel Liste", diff --git a/src/NzbDrone.Core/Localization/Core/el.json b/src/NzbDrone.Core/Localization/Core/el.json index 7bfb1c9ff..d7f64dbef 100644 --- a/src/NzbDrone.Core/Localization/Core/el.json +++ b/src/NzbDrone.Core/Localization/Core/el.json @@ -1,6 +1,6 @@ { "AppDataLocationHealthCheckMessage": "Η ενημέρωση δεν θα είναι δυνατή για να αποτραπεί η διαγραφή των δεδομένων εφαρμογής κατά την ενημέρωση", - "ApiKeyValidationHealthCheckMessage": "Παρακαλούμε ενημερώστε το κλείδι API ώστε να έχει τουλάχιστον {0} χαρακτήρες. Μπορείτε να το κάνετε αυτό μέσα από τις ρυθμίσεις ή το αρχείο ρυθμίσεων", + "ApiKeyValidationHealthCheckMessage": "Παρακαλούμε ενημερώστε το κλείδι API ώστε να έχει τουλάχιστον {length} χαρακτήρες. Μπορείτε να το κάνετε αυτό μέσα από τις ρυθμίσεις ή το αρχείο ρυθμίσεων", "Added": "Προστέθηκε", "ApplyChanges": "Εφαρμογή Αλλαγών", "AutomaticAdd": "Αυτόματη Προσθήκη", @@ -10,9 +10,9 @@ "RemoveCompletedDownloads": "Αφαίρεση Ολοκληρωμένων Λήψεων", "RemoveFailedDownloads": "Αφαίρεση Αποτυχημένων Λήψεων", "DeleteCondition": "Διαγραφή συνθήκης", - "DeleteConditionMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη συνθήκη '{0}';", - "DeleteCustomFormatMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη προσαρμοσμένη μορφή '{0}';", - "RemoveSelectedItemsQueueMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε {0} αντικείμενα από την ουρά;", + "DeleteConditionMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη συνθήκη '{name}';", + "DeleteCustomFormatMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε τη προσαρμοσμένη μορφή '{customFormatName}';", + "RemoveSelectedItemsQueueMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε {selectedCount} αντικείμενα από την ουρά;", "CloneCondition": "Κλωνοποίηση συνθήκης", "RemoveSelectedItemQueueMessageText": "Είστε σίγουροι πως θέλετε να διαγράψετε 1 αντικείμενο από την ουρά;", "AddConditionImplementation": "Προσθήκη", diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 9601f4dd1..f772d5047 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -85,7 +85,7 @@ "AnimeTypeFormat": "Absolute episode number ({format})", "Any": "Any", "ApiKey": "API Key", - "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file", + "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {length} characters long. You can do this via settings or the config file", "AppDataDirectory": "AppData directory", "AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update", "AppUpdated": "{appName} Updated", @@ -284,7 +284,7 @@ "DeleteCondition": "Delete Condition", "DeleteConditionMessageText": "Are you sure you want to delete the condition '{name}'?", "DeleteCustomFormat": "Delete Custom Format", - "DeleteCustomFormatMessageText": "Are you sure you want to delete the custom format '{0}'?", + "DeleteCustomFormatMessageText": "Are you sure you want to delete the custom format '{customFormatName}'?", "DeleteDelayProfile": "Delete Delay Profile", "DeleteDelayProfileMessageText": "Are you sure you want to delete this delay profile?", "DeleteDownloadClient": "Delete Download Client", @@ -359,14 +359,14 @@ "Download": "Download", "DownloadClient": "Download Client", "DownloadClientCheckNoneAvailableHealthCheckMessage": "No download client is available", - "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Unable to communicate with {0}.", + "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Unable to communicate with {downloadClientName}. {errorMessage}", "DownloadClientOptionsLoadError": "Unable to load download client options", - "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Download client {0} is set to remove completed downloads. This can result in downloads being removed from your client before {1} can import them.", - "DownloadClientRootFolderHealthCheckMessage": "Download client {0} places downloads in the root folder {1}. You should not download to a root folder.", + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "Download client {downloadClientName} is set to remove completed downloads. This can result in downloads being removed from your client before {appName} can import them.", + "DownloadClientRootFolderHealthCheckMessage": "Download client {downloadClientName} places downloads in the root folder {rootFolderPath}. You should not download to a root folder.", "DownloadClientSettings": "Download Client Settings", - "DownloadClientSortingHealthCheckMessage": "Download client {0} has {1} sorting enabled for {appName}'s category. You should disable sorting in your download client to avoid import issues.", + "DownloadClientSortingHealthCheckMessage": "Download client {downloadClientName} has {sortingMode} sorting enabled for {appName}'s category. You should disable sorting in your download client to avoid import issues.", "DownloadClientStatusAllClientHealthCheckMessage": "All download clients are unavailable due to failures", - "DownloadClientStatusSingleClientHealthCheckMessage": "Download clients unavailable due to failures: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Download clients unavailable due to failures: {downloadClientNames}", "DownloadClientTagHelpText": "Only use this download client for series with at least one matching tag. Leave blank to use with all series.", "DownloadClients": "Download Clients", "DownloadClientsLoadError": "Unable to load download clients", @@ -613,13 +613,13 @@ "ImportList": "Import List", "ImportListExclusions": "Import List Exclusions", "ImportListExclusionsLoadError": "Unable to load Import List Exclusions", - "ImportListRootFolderMissingRootHealthCheckMessage": "Missing root folder for import list(s): {0}", - "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Multiple root folders are missing for import lists: {0}", + "ImportListRootFolderMissingRootHealthCheckMessage": "Missing root folder for import list(s): {rootFolderInfo}", + "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Multiple root folders are missing for import lists: {rootFolderInfo}", "ImportListSearchForMissingEpisodes": "Search for Missing Episodes", "ImportListSearchForMissingEpisodesHelpText": "After series is added to {appName} automatically search for missing episodes", "ImportListSettings": "Import List Settings", "ImportListStatusAllUnavailableHealthCheckMessage": "All lists are unavailable due to failures", - "ImportListStatusUnavailableHealthCheckMessage": "Lists unavailable due to failures: {0}", + "ImportListStatusUnavailableHealthCheckMessage": "Lists unavailable due to failures: {importListNames}", "ImportLists": "Import Lists", "ImportListsLoadError": "Unable to load Import Lists", "ImportListsSettingsSummary": "Import from another {appName} instance or Trakt lists and manage list exclusions", @@ -639,11 +639,11 @@ "IncludeHealthWarnings": "Include Health Warnings", "IncludeUnmonitored": "Include Unmonitored", "Indexer": "Indexer", - "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Indexers with invalid download clients: {indexerNames}.", "IndexerDownloadClientHelpText": "Specify which download client is used for grabs from this indexer", - "IndexerJackettAllHealthCheckMessage": "Indexers using the unsupported Jackett 'all' endpoint: {0}", + "IndexerJackettAllHealthCheckMessage": "Indexers using the unsupported Jackett 'all' endpoint: {indexerNames}", "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures for more than 6 hours", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures for more than 6 hours: {indexerNames}", "IndexerOptionsLoadError": "Unable to load indexer options", "IndexerPriority": "Indexer Priority", "IndexerPriorityHelpText": "Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25. Used when grabbing releases as a tiebreaker for otherwise equal releases, {appName} will still use all enabled indexers for RSS Sync and Searching", @@ -654,7 +654,7 @@ "IndexerSearchNoInteractiveHealthCheckMessage": "No indexers available with Interactive Search enabled, {appName} will not provide any interactive search results", "IndexerSettings": "Indexer Settings", "IndexerStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures", - "IndexerStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures: {indexerNames}", "IndexerTagHelpText": "Only use this indexer for series with at least one matching tag. Leave blank to use with all series.", "Indexers": "Indexers", "IndexersLoadError": "Unable to load Indexers", @@ -882,7 +882,7 @@ "None": "None", "NotSeasonPack": "Not Season Pack", "NotificationStatusAllClientHealthCheckMessage": "All notifications are unavailable due to failures", - "NotificationStatusSingleClientHealthCheckMessage": "Notifications unavailable due to failures: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notifications unavailable due to failures: {notificationNames}", "NotificationTriggers": "Notification Triggers", "NotificationTriggersHelpText": "Select which events should trigger this notification", "NotificationsLoadError": "Unable to load Notifications", @@ -985,11 +985,11 @@ "Protocol": "Protocol", "ProtocolHelpText": "Choose which protocol(s) to use and which one is preferred when choosing between otherwise equal releases", "Proxy": "Proxy", - "ProxyBadRequestHealthCheckMessage": "Failed to test proxy. Status Code: {0}", + "ProxyBadRequestHealthCheckMessage": "Failed to test proxy. Status Code: {statusCode}", "ProxyBypassFilterHelpText": "Use ',' as a separator, and '*.' as a wildcard for subdomains", - "ProxyFailedToTestHealthCheckMessage": "Failed to test proxy: {0}", + "ProxyFailedToTestHealthCheckMessage": "Failed to test proxy: {url}", "ProxyPasswordHelpText": "You only need to enter a username and password if one is required. Leave them blank otherwise.", - "ProxyResolveIpHealthCheckMessage": "Failed to resolve the IP Address for the Configured Proxy Host {0}", + "ProxyResolveIpHealthCheckMessage": "Failed to resolve the IP Address for the Configured Proxy Host {proxyHostName}", "ProxyType": "Proxy Type", "ProxyUsernameHelpText": "You only need to enter a username and password if one is required. Leave them blank otherwise.", "PublishedDate": "Published Date", @@ -1018,7 +1018,7 @@ "Real": "Real", "Reason": "Reason", "RecentChanges": "Recent Changes", - "RecycleBinUnableToWriteHealthCheckMessage": "Unable to write to configured recycling bin folder: {0}. Ensure this path exists and is writable by the user running {appName}", + "RecycleBinUnableToWriteHealthCheckMessage": "Unable to write to configured recycling bin folder: {path}. Ensure this path exists and is writable by the user running {appName}", "RecyclingBin": "Recycling Bin", "RecyclingBinCleanup": "Recycling Bin Cleanup", "RecyclingBinCleanupHelpText": "Set to 0 to disable automatic cleanup", @@ -1054,24 +1054,24 @@ "ReleaseTitle": "Release Title", "Reload": "Reload", "RemotePath": "Remote Path", - "RemotePathMappingBadDockerPathHealthCheckMessage": "You are using docker; download client {0} places downloads in {1} but this is not a valid {2} path. Review your remote path mappings and download client settings.", - "RemotePathMappingDockerFolderMissingHealthCheckMessage": "You are using docker; download client {0} places downloads in {1} but this directory does not appear to exist inside the container. Review your remote path mappings and container volume settings.", - "RemotePathMappingDownloadPermissionsHealthCheckMessage": "{appName} can see but not access downloaded episode {0}. Likely permissions error.", - "RemotePathMappingFileRemovedHealthCheckMessage": "File {0} was removed part way through processing.", - "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "You are using docker; download client {0} reported files in {1} but this is not a valid {2} path. Review your remote path mappings and download client settings.", - "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Download client {0} reported files in {1} but {appName} cannot see this directory. You may need to adjust the folder's permissions.", - "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "Local download client {0} reported files in {1} but this is not a valid {2} path. Review your download client settings.", - "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "Remote download client {0} reported files in {1} but this is not a valid {2} path. Review your remote path mappings and download client settings.", - "RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} can see but not access download directory {0}. Likely permissions error.", - "RemotePathMappingGenericPermissionsHealthCheckMessage": "Download client {0} places downloads in {1} but {appName} cannot see this directory. You may need to adjust the folder's permissions.", + "RemotePathMappingBadDockerPathHealthCheckMessage": "You are using docker; download client {downloadClientName} places downloads in {path} but this is not a valid {osName} path. Review your remote path mappings and download client settings.", + "RemotePathMappingDockerFolderMissingHealthCheckMessage": "You are using docker; download client $1{downloadClientName} places downloads in {path} but this directory does not appear to exist inside the container. Review your remote path mappings and container volume settings.", + "RemotePathMappingDownloadPermissionsHealthCheckMessage": "{appName} can see but not access downloaded episode {path}. Likely permissions error.", + "RemotePathMappingFileRemovedHealthCheckMessage": "File {path} was removed part way through processing.", + "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "You are using docker; download client {downloadClientName} reported files in {path} but this is not a valid {osName} path. Review your remote path mappings and download client settings.", + "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Download client {downloadClientName} reported files in {path} but {appName} cannot see this directory. You may need to adjust the folder's permissions.", + "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "Local download client {downloadClientName} reported files in {path} but this is not a valid {osName} path. Review your download client settings.", + "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "Remote download client {downloadClientName} reported files in {path} but this is not a valid {osName} path. Review your remote path mappings and download client settings.", + "RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} can see but not access download directory {downloadPath}. Likely permissions error.", + "RemotePathMappingGenericPermissionsHealthCheckMessage": "Download client {downloadClientName} places downloads in {path} but {appName} cannot see this directory. You may need to adjust the folder's permissions.", "RemotePathMappingHostHelpText": "The same host you specified for the remote Download Client", "RemotePathMappingImportFailedHealthCheckMessage": "{appName} failed to import (an) episode(s). Check your logs for details.", - "RemotePathMappingLocalFolderMissingHealthCheckMessage": "Remote download client {0} places downloads in {1} but this directory does not appear to exist. Likely missing or incorrect remote path mapping.", + "RemotePathMappingLocalFolderMissingHealthCheckMessage": "Remote download client {downloadClientName} places downloads in {path} but this directory does not appear to exist. Likely missing or incorrect remote path mapping.", "RemotePathMappingLocalPathHelpText": "Path that {appName} should use to access the remote path locally", - "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "Local download client {0} places downloads in {1} but this is not a valid {2} path. Review your download client settings.", - "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "Remote download client {0} reported files in {1} but this directory does not appear to exist. Likely missing remote path mapping.", + "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "Local download client {downloadClientName} places downloads in {path} but this is not a valid {osName} path. Review your download client settings.", + "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "Remote download client {downloadClientName} reported files in {path} but this directory does not appear to exist. Likely missing remote path mapping.", "RemotePathMappingRemotePathHelpText": "Root path to the directory that the Download Client accesses", - "RemotePathMappingWrongOSPathHealthCheckMessage": "Remote download client {0} places downloads in {1} but this is not a valid {2} path. Review your remote path mappings and download client settings.", + "RemotePathMappingWrongOSPathHealthCheckMessage": "Remote download client {downloadClientName} places downloads in {path} but this is not a valid {osName} path. Review your remote path mappings and download client settings.", "RemotePathMappings": "Remote Path Mappings", "RemotePathMappingsInfo": "Remote Path Mappings are very rarely required, if {app} and your download client are on the same system it is better to match your paths. For more information see the [wiki]({wikiLink})", "RemotePathMappingsLoadError": "Unable to load Remote Path Mappings", @@ -1100,8 +1100,8 @@ "RemoveTagsAutomatically": "Remove Tags Automatically", "RemoveTagsAutomaticallyHelpText": "Remove tags automatically if conditions are not met", "RemovedFromTaskQueue": "Removed from task queue", - "RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {0} were removed from TheTVDB", - "RemovedSeriesSingleRemovedHealthCheckMessage": "Series {0} was removed from TheTVDB", + "RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {series} were removed from TheTVDB", + "RemovedSeriesSingleRemovedHealthCheckMessage": "Series {series} was removed from TheTVDB", "RemovingTag": "Removing tag", "RenameEpisodes": "Rename Episodes", "RenameEpisodesHelpText": "{appName} will use the existing file name if renaming is disabled", @@ -1146,8 +1146,8 @@ "RetryingDownloadOn": "Retrying download on {date} at {time}", "RootFolder": "Root Folder", "RootFolderLoadError": "Unable to add root folder", - "RootFolderMissingHealthCheckMessage": "Missing root folder: {0}", - "RootFolderMultipleMissingHealthCheckMessage": "Multiple root folders are missing: {0}", + "RootFolderMissingHealthCheckMessage": "Missing root folder: {rootFolderPath}", + "RootFolderMultipleMissingHealthCheckMessage": "Multiple root folders are missing: {rootFolderPaths}", "RootFolderPath": "Root Folder Path", "RootFolderSelectFreeSpace": "{freeSpace} Free", "RootFolders": "Root Folders", @@ -1438,10 +1438,9 @@ "UpdateScriptPathHelpText": "Path to a custom script that takes an extracted update package and handle the remainder of the update process", "UpdateSelected": "Update Selected", "UpdateSonarrDirectlyLoadError": "Unable to update {appName} directly,", - "UpdateStartupNotWritableHealthCheckMessage": "Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", - "UpdateStartupTranslocationHealthCheckMessage": "Cannot install update because startup folder '{0}' is in an App Translocation folder.", - "UpdateUINotWritableHealthCheckMessage": "Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", - "UpdateUiNotWritableHealthCheckMessage": "Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", + "UpdateStartupNotWritableHealthCheckMessage": "Cannot install update because startup folder '{startupFolder}' is not writable by the user '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Cannot install update because startup folder '{ }' is in an App Translocation folder.", + "UpdateUiNotWritableHealthCheckMessage": "Cannot install update because UI folder '{uiFolder}' is not writable by the user '{userName}'.", "UpdaterLogFiles": "Updater Log Files", "Updates": "Updates", "UpgradeUntil": "Upgrade Until", diff --git a/src/NzbDrone.Core/Localization/Core/es.json b/src/NzbDrone.Core/Localization/Core/es.json index e552fd212..e2ffc7bd9 100644 --- a/src/NzbDrone.Core/Localization/Core/es.json +++ b/src/NzbDrone.Core/Localization/Core/es.json @@ -167,7 +167,7 @@ "AllResultsAreHiddenByTheAppliedFilter": "Todos los resultados están ocultos por el filtro aplicado", "AnalyseVideoFilesHelpText": "Extraer información de video como la resolución, el tiempo de ejecución y la información del códec de los archivos. Esto requiere que {appName} lea partes del archivo lo cual puede causar una alta actividad en el disco o en la red durante los escaneos.", "AnimeTypeDescription": "Episodios lanzados usando un número de episodio absoluto", - "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {0} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", + "ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {length} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración", "AppDataLocationHealthCheckMessage": "No será posible actualizar para prevenir la eliminación de AppData al Actualizar", "Scheduled": "Programado", "Season": "Temporada", @@ -209,7 +209,7 @@ "ManageImportLists": "Gestionar Listas de Importación", "ManageDownloadClients": "Gestionar Clientes de Descarga", "MoveAutomatically": "Mover Automáticamente", - "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {indexerNames}.", "ManageLists": "Gestionar Listas", "DeleteSelectedImportLists": "Eliminar Lista(s) de Importación", "EditSelectedIndexers": "Editar Indexadores Seleccionados", diff --git a/src/NzbDrone.Core/Localization/Core/fi.json b/src/NzbDrone.Core/Localization/Core/fi.json index 156195c8f..1cd0454c8 100644 --- a/src/NzbDrone.Core/Localization/Core/fi.json +++ b/src/NzbDrone.Core/Localization/Core/fi.json @@ -1,16 +1,16 @@ { "BlocklistReleaseHelpText": "Etsii kohdetta uudelleen ja estää {appName}ia sieppaamasta tätä julkaisua automaattisesti uudelleen.", - "RecycleBinUnableToWriteHealthCheckMessage": "Määritettyyn roskakorikansioon ei voida tallentaa: {0}. Varmista että sijainti on olemassa ja että sovelluksen suorittavalla käyttäjällä on siihen kirjoitusoikeus.", - "RemotePathMappingDownloadPermissionsHealthCheckMessage": "{appName} näkee ladatun jakson \"{0}\", muttei voi käyttää sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", + "RecycleBinUnableToWriteHealthCheckMessage": "Määritettyyn roskakorikansioon ei voida tallentaa: {path}. Varmista että sijainti on olemassa ja että sovelluksen suorittavalla käyttäjällä on siihen kirjoitusoikeus.", + "RemotePathMappingDownloadPermissionsHealthCheckMessage": "{appName} näkee ladatun jakson \"{path}\", muttei voi käyttää sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", "Added": "Lisätty", "AppDataLocationHealthCheckMessage": "Päivitystä ei sallita, jotta AppData-kansion poisto päivityksen yhteydessä voidaan estää.", "DownloadClientSortingHealthCheckMessage": "", "IndexerRssNoIndexersEnabledHealthCheckMessage": "RSS-synkronointia käyttäviä tietolähteitä ei ole määritetty, jonka vuoksi uusia julkaisuja ei siepata automaattisesti.", "IndexerSearchNoInteractiveHealthCheckMessage": "Manuaalista hakua varten ei ole määritetty tietolähteitä, eikä manuaalinen haku sen vuoksi löydä tuloksia.", - "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Lataustyökalu \"{0}\" ilmoitti tiedostosijainniksi \"{1}\", mutta {appName} ei näe kansiota. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", - "RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} näkee ladatauskansion \"{0}\" näkyy, muttei voi käyttää sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", + "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Lataustyökalu \"{downloadClientName}\" ilmoitti tiedostosijainniksi \"{path}\", mutta {appName} ei näe kansiota. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", + "RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} näkee ladatauskansion \"{downloadPath}\" näkyy, muttei voi käyttää sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", "RemotePathMappingImportFailedHealthCheckMessage": "Jaksojen tuonti epäonnistui. Katso tarkemmat tiedot lokista.", - "RemotePathMappingGenericPermissionsHealthCheckMessage": "Lataustyökalu \"{0}\" tallentaa latauksen sijaintiin \"{1}\", mutta {appName} ei näe sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", + "RemotePathMappingGenericPermissionsHealthCheckMessage": "Lataustyökalu \"{downloadClientName}\" tallentaa latauksen sijaintiin \"{path}\", mutta {appName} ei näe sitä. Tämä johtuu todennäköisesti liian rajallisista käyttöoikeuksista.", "IndexerSearchNoAutomaticHealthCheckMessage": "Automaattista hakua varten ei ole määritetty tietolähteitä, eikä automaattinen haku sen vuoksi löydä tuloksia.", "AgeWhenGrabbed": "Ikä (sieppaushetkellä)", "GrabId": "Sieppaustunniste", @@ -24,7 +24,7 @@ "GrabRelease": "Sieppaa julkaisu", "Hostname": "Osoite", "OriginalLanguage": "Alkuperäinen kieli", - "ProxyResolveIpHealthCheckMessage": "Määritetyn välityspalvelimen \"{0}\" IP-osoitteen selvitys epäonnistui.", + "ProxyResolveIpHealthCheckMessage": "Määritetyn välityspalvelimen \"{proxyHostName}\" IP-osoitteen selvitys epäonnistui.", "SetPermissionsLinuxHelpText": "Tulisiko chmod suorittaa, kun tiedostoja tuodaan/nimetään uudelleen?", "UrlBaseHelpText": "Käänteisen välityspalvelimen tuki (esim. \"http://[host]:[port]/[urlBase]\"). Käytä oletusta jättämällä tyhjäksi.", "SetPermissionsLinuxHelpTextWarning": "Jollet ole varma mitä nämä asetukset tekevät, älä muuta niitä.", diff --git a/src/NzbDrone.Core/Localization/Core/fr.json b/src/NzbDrone.Core/Localization/Core/fr.json index 7cfbce259..223c4d01f 100644 --- a/src/NzbDrone.Core/Localization/Core/fr.json +++ b/src/NzbDrone.Core/Localization/Core/fr.json @@ -2,7 +2,7 @@ "Language": "Langue", "UiLanguage": "UI Langue", "Added": "Ajouté", - "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {0} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", + "ApiKeyValidationHealthCheckMessage": "Veuillez mettre à jour votre clé API pour qu'elle contienne au moins {length} caractères. Vous pouvez le faire via les paramètres ou le fichier de configuration", "AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour", "ApplyChanges": "Appliquer les modifications", "AutomaticAdd": "Ajout automatique", @@ -159,8 +159,8 @@ "AutomaticUpdatesDisabledDocker": "Les mises à jour automatiques ne sont pas directement prises en charge lors de l'utilisation du mécanisme de mise à jour de Docker. Vous devrez mettre à jour l'image du conteneur en dehors de {appName} ou utiliser un script", "BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de rétention seront nettoyées automatiquement", "QualityProfile": "Profil de qualité", - "RemotePathMappingDownloadPermissionsHealthCheckMessage": "Sonarr peut voir mais ne peut pas accéder à l'épisode téléchargé {0}. Probablement une erreur de permissions.", - "RemotePathMappingDockerFolderMissingHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement {0} place les téléchargements dans {1}, mais ce répertoire ne semble pas exister dans le conteneur. Vérifiez vos mappages de chemins d'accès distants et les paramètres de volume du conteneur.", + "RemotePathMappingDownloadPermissionsHealthCheckMessage": "Sonarr peut voir mais ne peut pas accéder à l'épisode téléchargé {path}. Probablement une erreur de permissions.", + "RemotePathMappingDockerFolderMissingHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement $1{downloadClientName} place les téléchargements dans {path}, mais ce répertoire ne semble pas exister dans le conteneur. Vérifiez vos mappages de chemins d'accès distants et les paramètres de volume du conteneur.", "BlocklistReleases": "Publications de la liste de blocage", "BindAddress": "Adresse de liaison", "BackupsLoadError": "Impossible de charger les sauvegardes", @@ -186,9 +186,9 @@ "ChownGroupHelpTextWarning": "Cela ne fonctionne que si l'utilisateur qui exécute sonarr est le propriétaire du fichier. Il est préférable de s'assurer que le client de téléchargement utilise le même groupe que sonarr.", "ClickToChangeQuality": "Cliquez pour changer la qualité", "RefreshSeries": "Actualiser les séries", - "RecycleBinUnableToWriteHealthCheckMessage": "Impossible d'écrire dans le dossier configuré de la corbeille de recyclage : {0}. Assurez-vous que ce chemin existe et qu'il est accessible en écriture par l'utilisateur qui exécute Sonarr.", - "RemotePathMappingFileRemovedHealthCheckMessage": "Le fichier {0} a été supprimé en cours de traitement.", - "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Le client de téléchargement {0} a signalé des fichiers dans {1} mais Sonarr ne peut pas voir ce répertoire. Il se peut que vous deviez ajuster les permissions du dossier.", + "RecycleBinUnableToWriteHealthCheckMessage": "Impossible d'écrire dans le dossier configuré de la corbeille de recyclage : {path}. Assurez-vous que ce chemin existe et qu'il est accessible en écriture par l'utilisateur qui exécute Sonarr.", + "RemotePathMappingFileRemovedHealthCheckMessage": "Le fichier {path} a été supprimé en cours de traitement.", + "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Le client de téléchargement {downloadClientName} a signalé des fichiers dans {path} mais Sonarr ne peut pas voir ce répertoire. Il se peut que vous deviez ajuster les permissions du dossier.", "CalendarFeed": "Flux de calendrier {appName}", "CalendarLegendDownloadedTooltip": "L'épisode a été téléchargé et classé", "CalendarLegendDownloadingTooltip": "L'épisode est en cours de téléchargement", @@ -203,13 +203,13 @@ "ClickToChangeLanguage": "Cliquez pour changer de langue", "ClickToChangeEpisode": "Cliquez pour changer d'épisode", "ClickToChangeReleaseGroup": "Cliquez pour changer de groupe de diffusion", - "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement {0} a signalé des fichiers dans {1} mais ce n'est pas un chemin {2} valide. Vérifiez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.", + "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement {downloadClientName} a signalé des fichiers dans {path} mais ce n'est pas un chemin {osName} valide. Vérifiez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.", "BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText": "Score minimum requis pour le format personnalisé pour ignorer le délai pour le protocole préféré", "BypassDelayIfHighestQualityHelpText": "Ignorer le délai lorsque la libération a la qualité activée la plus élevée dans le profil de qualité avec le protocole préféré", - "RemotePathMappingBadDockerPathHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement {0} place les téléchargements dans {1} mais ce n'est pas un chemin {2} valide. Revoyez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.", - "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "Le client de téléchargement local {0} a signalé des fichiers dans {1}, mais il ne s'agit pas d'un chemin {2} valide. Vérifiez les paramètres de votre client de téléchargement.", - "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "Le client de téléchargement distant {0} a signalé des fichiers dans {1}, mais il ne s'agit pas d'un chemin {2} valide. Revoyez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.", - "RemotePathMappingFolderPermissionsHealthCheckMessage": "Sonarr peut voir mais ne peut pas accéder au répertoire de téléchargement {0}. Il s'agit probablement d'une erreur de permissions.", + "RemotePathMappingBadDockerPathHealthCheckMessage": "Vous utilisez Docker ; le client de téléchargement {downloadClientName} place les téléchargements dans {path} mais ce n'est pas un chemin {osName} valide. Revoyez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.", + "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "Le client de téléchargement local {downloadClientName} a signalé des fichiers dans {path}, mais il ne s'agit pas d'un chemin {osName} valide. Vérifiez les paramètres de votre client de téléchargement.", + "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "Le client de téléchargement distant {downloadClientName} a signalé des fichiers dans {path}, mais il ne s'agit pas d'un chemin {osName} valide. Revoyez vos mappages de chemins d'accès distants et les paramètres du client de téléchargement.", + "RemotePathMappingFolderPermissionsHealthCheckMessage": "Sonarr peut voir mais ne peut pas accéder au répertoire de téléchargement {downloadPath}. Il s'agit probablement d'une erreur de permissions.", "Path": "Chemin", "QueueIsEmpty": "La file d'attente est vide", "Warn": "Avertissement", @@ -428,7 +428,7 @@ "ManageDownloadClients": "Gérer les clients de téléchargement", "NoDownloadClientsFound": "Aucun client de téléchargement n'a été trouvé", "NotificationStatusAllClientHealthCheckMessage": "Toutes les notifications sont indisponibles en raison de dysfonctionnements", - "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison de dysfonctionnements : {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notifications indisponibles en raison de dysfonctionnements : {notificationNames}", "RecentChanges": "Changements récents", "SetTags": "Définir les étiquettes", "Replace": "Remplacer", diff --git a/src/NzbDrone.Core/Localization/Core/he.json b/src/NzbDrone.Core/Localization/Core/he.json index 17c5293b8..5cbee5d60 100644 --- a/src/NzbDrone.Core/Localization/Core/he.json +++ b/src/NzbDrone.Core/Localization/Core/he.json @@ -1,6 +1,6 @@ { "Added": "נוסף", - "ApiKeyValidationHealthCheckMessage": "עדכן בבקשה את מפתח ה־API שלך כדי שיהיה באורך של לפחות {0} תווים. תוכל לעשות זאת בהגדרות או דרך קובץ הקונפיגורציה.", + "ApiKeyValidationHealthCheckMessage": "עדכן בבקשה את מפתח ה־API שלך כדי שיהיה באורך של לפחות {length} תווים. תוכל לעשות זאת בהגדרות או דרך קובץ הקונפיגורציה.", "Add": "הוסף", "Activity": "פעילות", "Indexer": "אינדקסר", diff --git a/src/NzbDrone.Core/Localization/Core/hu.json b/src/NzbDrone.Core/Localization/Core/hu.json index 49ff8b7ac..678244844 100644 --- a/src/NzbDrone.Core/Localization/Core/hu.json +++ b/src/NzbDrone.Core/Localization/Core/hu.json @@ -5,56 +5,56 @@ "Close": "Bezárás", "Delete": "Törlés", "DeleteCondition": "Feltétel törlése", - "DeleteConditionMessageText": "Biztosan törölni akarod a '{0}' feltételt?", + "DeleteConditionMessageText": "Biztosan törölni akarod a '{name}' feltételt?", "DeleteCustomFormat": "Egyéni formátum törlése", - "DeleteCustomFormatMessageText": "Biztosan törölni akarod a/az '{0}' egyéni formátumot?", + "DeleteCustomFormatMessageText": "Biztosan törölni akarod a/az '{customFormatName}' egyéni formátumot?", "ExportCustomFormat": "Egyéni formátum exportálása", - "IndexerJackettAllHealthCheckMessage": "A nem támogatott Jackett 'all' végpontot használó indexelők: {0}", + "IndexerJackettAllHealthCheckMessage": "A nem támogatott Jackett 'all' végpontot használó indexelők: {indexerNames}", "Remove": "Eltávolítás", "RemoveFromDownloadClient": "Eltávolítás a letöltési kliensből", "RemoveFromDownloadClientHelpTextWarning": "A törlés eltávolítja a letöltést és a fájl(okat) a letöltési kliensből.", "RemoveSelectedItem": "Kijelölt elem eltávolítása", "RemoveSelectedItemQueueMessageText": "Biztosan el akar távolítani 1 elemet a várólistáról?", "RemoveSelectedItems": "Kijelölt elemek eltávolítása", - "RemoveSelectedItemsQueueMessageText": "Biztosan el akar távolítani {0} elemet a várólistáról?", + "RemoveSelectedItemsQueueMessageText": "Biztosan el akar távolítani {selectedCount} elemet a várólistáról?", "Required": "Kötelező", "Added": "Hozzáadva", - "ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {0} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban", + "ApiKeyValidationHealthCheckMessage": "Kérlek frissítsd az API kulcsot, ami legalább {length} karakter hosszú. Ezt megteheted a Beállításokban, vagy a config file-ban", "ApplyChanges": "Változások alkalmazása", "AppDataLocationHealthCheckMessage": "A frissítés nem lehetséges az alkalmazás adatok törlése nélkül", "AutomaticAdd": "Automatikus hozzáadás", "CountSeasons": "{count} évad", "DownloadClientCheckNoneAvailableHealthCheckMessage": "Nincs elérhető letöltési kliens", - "DownloadClientRootFolderHealthCheckMessage": "A letöltési kliens {0} a letöltéseket a gyökérmappába helyezi. Ne tölts le közvetlenül a gyökérmappába.", - "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Nem lehet kommunikálni a {0} -val.", + "DownloadClientRootFolderHealthCheckMessage": "A letöltési kliens {downloadClientName} a letöltéseket a gyökérmappába helyezi. Ne tölts le közvetlenül a gyökérmappába.", + "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Nem lehet kommunikálni a {downloadClientName} -val.", "DownloadClientStatusAllClientHealthCheckMessage": "Az összes letöltési kliens elérhetetlen meghibásodások miatt", "EditSelectedDownloadClients": "Kiválasztott letöltési kliensek szerkesztése", "EditSelectedImportLists": "Kiválasztott import listák szerkesztése", "EditSelectedIndexers": "Kiválasztott indexelők szerkesztése", - "DownloadClientStatusSingleClientHealthCheckMessage": "Letöltési kliensek elérhetetlenek meghibásodások miatt: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Letöltési kliensek elérhetetlenek meghibásodások miatt: {downloadClientNames}", "EnableAutomaticSearch": "Automatikus keresés engedélyezése", "EditSeries": "Sorozat szerkesztése", "EnableInteractiveSearch": "Interaktív keresés engedélyezése", "Ended": "Vége", "HideAdvanced": "Haladó elrejtése", - "ImportListRootFolderMissingRootHealthCheckMessage": "Hiányzó gyökérmappa a/az {0} importálási listához", - "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Több gyökérmappa hiányzik a/az {0} importálási listához", + "ImportListRootFolderMissingRootHealthCheckMessage": "Hiányzó gyökérmappa a/az {rootFolderInfo} importálási listához", + "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Több gyökérmappa hiányzik a/az {rootFoldersInfo} importálási listához", "Enabled": "Engedélyezés", "HiddenClickToShow": "Rejtett, kattints a felfedéshez", "ImportListStatusAllUnavailableHealthCheckMessage": "Minden lista elérhetetlen meghibásodások miatt", - "ImportListStatusUnavailableHealthCheckMessage": "Listák elérhetetlenek meghibásodások miatt: {0}", + "ImportListStatusUnavailableHealthCheckMessage": "Listák elérhetetlenek meghibásodások miatt: {importListNames}", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Befejezett letöltés kezelésének engedélyezése, ha lehetséges", "ImportMechanismHandlingDisabledHealthCheckMessage": "Befejezett letöltés kezelésének engedélyezése", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "Befejezett letöltés kezelésének engedélyezése, ha lehetséges (Több számítógépen nem támogatott)", "IndexerRssNoIndexersEnabledHealthCheckMessage": "Nincsenek elérhető indexelők RSS szinkronizációval, a {appName} nem fog automatikusan új kiadásokat letölteni", "IndexerRssNoIndexersAvailableHealthCheckMessage": "Az összes RSS-képes indexelő ideiglenesen nem elérhető a legutóbbi indexelő hibák miatt", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "Minden indexelő elérhetetlen meghibásodás miatt több, mint 6 órája: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Minden indexelő elérhetetlen meghibásodás miatt több, mint 6 órája: {indexerNames}", "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Minden indexelő elérhetetlen meghibásodás miatt több, mint 6 órája", "IndexerSearchNoInteractiveHealthCheckMessage": "Nincsenek elérhető indexelők az Interaktív Keresés funkcióval, a {appName} nem fog interaktív keresési eredményeket szolgáltatni", "IndexerSearchNoAvailableIndexersHealthCheckMessage": "Az összes keresési képességgel rendelkező indexelő ideiglenesen nem elérhető a legutóbbi indexelő hibák miatt", "IndexerSearchNoAutomaticHealthCheckMessage": "Nincsenek elérhető indexelők az Automatikus Keresés funkcióval, a {appName} nem fog automatikus keresési eredményeket szolgáltatni", "Language": "Nyelv", - "IndexerStatusUnavailableHealthCheckMessage": "Minden indexelő elérhetetlen meghibásodások miatt: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Minden indexelő elérhetetlen meghibásodások miatt: {indexerNames}", "IndexerStatusAllUnavailableHealthCheckMessage": "Minden indexelő elérhetetlen meghibásodások miatt", "OneSeason": "1 évad", "OriginalLanguage": "Eredeti nyelv", @@ -64,45 +64,45 @@ "MountHealthCheckMessage": "A sorozat elérési útvonalát tartalmazó kötet csak olvasható módban van csatolva: ", "Network": "Hálózat", "NoSeasons": "Nincsenek évadok", - "ProxyBadRequestHealthCheckMessage": "Sikertelen proxy teszt. Állapotkód: {0}", + "ProxyBadRequestHealthCheckMessage": "Sikertelen proxy teszt. Állapotkód: {statusCode}", "Priority": "Elsőbbség", - "ProxyFailedToTestHealthCheckMessage": "Sikertelen proxy teszt: {0}", - "ProxyResolveIpHealthCheckMessage": "Nem sikerült feloldani a konfigurált proxy kiszolgáló {0} IP-címét", + "ProxyFailedToTestHealthCheckMessage": "Sikertelen proxy teszt: {url}", + "ProxyResolveIpHealthCheckMessage": "Nem sikerült feloldani a konfigurált proxy kiszolgáló {proxyHostName} IP-címét", "PreviousAiring": "Előző rész", - "RecycleBinUnableToWriteHealthCheckMessage": "Nem lehet írni a konfigurált lomtár mappába {0}. Győződjön meg arról, hogy ez az elérési útvonal létezik, és az a felhasználó, aki a {appName}-t futtatja, írási jogosultsággal rendelkezik", + "RecycleBinUnableToWriteHealthCheckMessage": "Nem lehet írni a konfigurált lomtár mappába {path}. Győződjön meg arról, hogy ez az elérési útvonal létezik, és az a felhasználó, aki a {appName}-t futtatja, írási jogosultsággal rendelkezik", "QualityProfile": "Minőségi profil", - "RemotePathMappingDockerFolderMissingHealthCheckMessage": "Docker-t használ; a(z) {0} letöltési kliens a letöltéseket a(z) {1} mappába helyezi, de úgy tűnik, hogy ez a könyvtár nem létezik a konténeren belül. Ellenőrizze a távoli útvonal hozzárendeléseket, és a konténer kötet beállításait.", + "RemotePathMappingDockerFolderMissingHealthCheckMessage": "Docker-t használ; a(z) $1{downloadClientName} letöltési kliens a letöltéseket a(z) {path} mappába helyezi, de úgy tűnik, hogy ez a könyvtár nem létezik a konténeren belül. Ellenőrizze a távoli útvonal hozzárendeléseket, és a konténer kötet beállításait.", "RefreshSeries": "Sorozat frissítése", - "RemotePathMappingFileRemovedHealthCheckMessage": "A(z) {0} fájlt részben feldolgozás közben eltávolították.", - "RemotePathMappingDownloadPermissionsHealthCheckMessage": "A {appName} látja, de nem tud hozzáférni a letöltött epizódhoz {0}. Valószínűleg jogosultsági hiba.", - "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "A(z) {0} helyi letöltési kliens a fájlokat a(z) {1} mappában jelentette, de ez nem érvényes {2} elérési útvonal. Ellenőrizze a letöltési kliens beállításait.", - "RemotePathMappingGenericPermissionsHealthCheckMessage": "A(z) {0} letöltési kliens a letöltéseket a(z) {1} mappába helyezi, de a {appName} nem látja ezt a könyvtárat. Lehetséges, hogy be kell állítania a mappa jogosultságait.", + "RemotePathMappingFileRemovedHealthCheckMessage": "A(z) {path} fájlt részben feldolgozás közben eltávolították.", + "RemotePathMappingDownloadPermissionsHealthCheckMessage": "A {appName} látja, de nem tud hozzáférni a letöltött epizódhoz {path}. Valószínűleg jogosultsági hiba.", + "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "A(z) {downloadClientName} helyi letöltési kliens a fájlokat a(z) {path} mappában jelentette, de ez nem érvényes {osName} elérési útvonal. Ellenőrizze a letöltési kliens beállításait.", + "RemotePathMappingGenericPermissionsHealthCheckMessage": "A(z) {downloadClientName} letöltési kliens a letöltéseket a(z) {path} mappába helyezi, de a {appName} nem látja ezt a könyvtárat. Lehetséges, hogy be kell állítania a mappa jogosultságait.", "RemotePathMappingImportFailedHealthCheckMessage": "A {appName}-nak nem sikerült importálni az epizód(ok)at. Ellenőrizze a naplókat a részletekért.", - "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "A(z) {0} távoli letöltési kliens a fájlokat a(z) {1} mappában jelentette, de úgy tűnik, hogy ez a könyvtár nem létezik. Valószínűleg hiányzik a távoli útvonal hozzárendelés.", - "RemotePathMappingLocalFolderMissingHealthCheckMessage": "A(z) {0} távoli letöltési kliens a letöltéseket a(z) {1} mappába helyezi, de úgy tűnik, hogy ez a könyvtár nem létezik. Valószínűleg hiányzik vagy helytelen a távoli útvonal hozzárendelés.", - "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "A(z) {0} helyi letöltési kliens a letöltéseket a(z) {1} mappába helyezi, de ez nem érvényes {2} elérési útvonal. Ellenőrizze a letöltési kliens beállításait.", + "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "A(z) {downloadClientName} távoli letöltési kliens a fájlokat a(z) {path} mappában jelentette, de úgy tűnik, hogy ez a könyvtár nem létezik. Valószínűleg hiányzik a távoli útvonal hozzárendelés.", + "RemotePathMappingLocalFolderMissingHealthCheckMessage": "A(z) {downloadClientName} távoli letöltési kliens a letöltéseket a(z) {path} mappába helyezi, de úgy tűnik, hogy ez a könyvtár nem létezik. Valószínűleg hiányzik vagy helytelen a távoli útvonal hozzárendelés.", + "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "A(z) {downloadClientName} helyi letöltési kliens a letöltéseket a(z) {path} mappába helyezi, de ez nem érvényes {osName} elérési útvonal. Ellenőrizze a letöltési kliens beállításait.", "RemoveFailedDownloads": "Sikertelen letöltések eltávolítása", - "RemovedSeriesMultipleRemovedHealthCheckMessage": "A(z) {0} sorozatokat eltávolították a TheTVDB-ről", - "RemotePathMappingWrongOSPathHealthCheckMessage": "A(z) {0} távoli letöltési kliens a letöltéseket a(z) {1} mappába helyezi, de ez nem érvényes {2} elérési útvonal. Kérjük, ellenőrizze a távoli útvonal leképezéseket és a letöltési kliens beállításait.", + "RemovedSeriesMultipleRemovedHealthCheckMessage": "A(z) {series} sorozatokat eltávolították a TheTVDB-ről", + "RemotePathMappingWrongOSPathHealthCheckMessage": "A(z) {downloadClientName} távoli letöltési kliens a letöltéseket a(z) {path} mappába helyezi, de ez nem érvényes {osName} elérési útvonal. Kérjük, ellenőrizze a távoli útvonal leképezéseket és a letöltési kliens beállításait.", "RemoveCompletedDownloads": "Befejezett letöltések eltávolítása", - "RemovedSeriesSingleRemovedHealthCheckMessage": "A(z) {0} sorozatot eltávolították a TheTVDB-ről", - "RootFolderMissingHealthCheckMessage": "Hiányzó gyökérmappa: {0}", + "RemovedSeriesSingleRemovedHealthCheckMessage": "A(z) {series} sorozatot eltávolították a TheTVDB-ről", + "RootFolderMissingHealthCheckMessage": "Hiányzó gyökérmappa: {rootFolderPath}", "RootFolder": "Gyökérmappa", "SearchForMonitoredEpisodes": "Megfigyelt epizódok keresése", "ShowAdvanced": "Haladó nézet", - "RootFolderMultipleMissingHealthCheckMessage": "Több gyökérmappa hiányzik: {0}", + "RootFolderMultipleMissingHealthCheckMessage": "Több gyökérmappa hiányzik: {rootFolderPaths}", "SizeOnDisk": "Méret a lemezen", "ShownClickToHide": "Kattints, hogy elrejtsd", "SystemTimeHealthCheckMessage": "A rendszer idő több, mint 1 napot eltér az aktuális időtől. Előfordulhat, hogy az ütemezett feladatok nem futnak megfelelően, amíg az időt nem korrigálják", "Unmonitored": "Nem felügyelt", - "UpdateStartupNotWritableHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a kezdő mappa '{0}' nem írható a(z) '{1}' felhasználó által.", - "UpdateStartupTranslocationHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a kezdő mappa '{0}' az App Translocation mappában található.", + "UpdateStartupNotWritableHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a kezdő mappa '{startupFolder}' nem írható a(z) '{userName}' felhasználó által.", + "UpdateStartupTranslocationHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a kezdő mappa '{startupFolder}' az App Translocation mappában található.", "UpdateAvailableHealthCheckMessage": "Új frissítés elérhető", - "UpdateUINotWritableHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a felhasználó '{1}' nem rendelkezik írási jogosultsággal a(z) '{0}' felhasználói felület mappában.", - "DownloadClientSortingHealthCheckMessage": "A(z) {0} letöltési kliensben engedélyezve van a {1} rendezés a {appName} kategóriájához. Az import problémák elkerülése érdekében ki kell kapcsolnia a rendezést a letöltési kliensben.", - "RemotePathMappingBadDockerPathHealthCheckMessage": "Docker-t használ; a(z) {0} letöltési kliens a letöltéseket a(z) {1} mappába helyezi, de ez nem érvényes {2} elérési útvonal. Ellenőrizze a távoli útvonal hozzárendeléseket, és a letöltési kliens beállításait.", - "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "Docker-t használ; a(z) {0} letöltési kliens a fájlokat a(z) {1} mappában jelentette, de ez nem érvényes {2} elérési útvonal. Ellenőrizze a távoli útvonal hozzárendeléseket, és a letöltési kliens beállításait.", - "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "A(z) {0} letöltési kliens a fájlokat a(z) {1} mappában jelentette, de a {appName} nem látja ezt a könyvtárat. Lehetséges, hogy be kell állítania a mappa jogosultságait.", - "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "A(z) {0} távoli letöltési kliens a fájlokat a(z) {1} mappában jelentette, de ez nem érvényes {2} elérési útvonal. Ellenőrizze a távoli útvonal hozzárendeléseket, és a letöltési kliens beállításait.", - "RemotePathMappingFolderPermissionsHealthCheckMessage": "A {appName} látja, de nem fér hozzá a letöltési könyvtárhoz {0}. Valószínűleg jogosultsági hiba." + "UpdateUiNotWritableHealthCheckMessage": "A frissítés telepítése nem lehetséges, mert a felhasználó '{userName}' nem rendelkezik írási jogosultsággal a(z) '{uiFolder}' felhasználói felület mappában.", + "DownloadClientSortingHealthCheckMessage": "A(z) {downloadClientName} letöltési kliensben engedélyezve van a {sortingMode} rendezés a {appName} kategóriájához. Az import problémák elkerülése érdekében ki kell kapcsolnia a rendezést a letöltési kliensben.", + "RemotePathMappingBadDockerPathHealthCheckMessage": "Docker-t használ; a(z) {downloadClientName} letöltési kliens a letöltéseket a(z) {path} mappába helyezi, de ez nem érvényes {osName} elérési útvonal. Ellenőrizze a távoli útvonal hozzárendeléseket, és a letöltési kliens beállításait.", + "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "Docker-t használ; a(z) {downloadClientName} letöltési kliens a fájlokat a(z) {path} mappában jelentette, de ez nem érvényes {osName} elérési útvonal. Ellenőrizze a távoli útvonal hozzárendeléseket, és a letöltési kliens beállításait.", + "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "A(z) {downloadClientName} letöltési kliens a fájlokat a(z) {path} mappában jelentette, de a {appName} nem látja ezt a könyvtárat. Lehetséges, hogy be kell állítania a mappa jogosultságait.", + "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "A(z) {downloadClientName} távoli letöltési kliens a fájlokat a(z) {path} mappában jelentette, de ez nem érvényes {osName} elérési útvonal. Ellenőrizze a távoli útvonal hozzárendeléseket, és a letöltési kliens beállításait.", + "RemotePathMappingFolderPermissionsHealthCheckMessage": "A {appName} látja, de nem fér hozzá a letöltési könyvtárhoz {downloadPath}. Valószínűleg jogosultsági hiba." } diff --git a/src/NzbDrone.Core/Localization/Core/id.json b/src/NzbDrone.Core/Localization/Core/id.json index a993eb76e..810ff7cb1 100644 --- a/src/NzbDrone.Core/Localization/Core/id.json +++ b/src/NzbDrone.Core/Localization/Core/id.json @@ -14,8 +14,8 @@ "PreviousAiring": "Sebelumnya Tayang", "OriginalLanguage": "Bahasa Asli", "Priority": "Prioritas", - "ProxyFailedToTestHealthCheckMessage": "Gagal menguji proxy: {0}", - "ProxyBadRequestHealthCheckMessage": "Gagal menguji proxy. Kode Status: {0}", + "ProxyFailedToTestHealthCheckMessage": "Gagal menguji proxy: {url}", + "ProxyBadRequestHealthCheckMessage": "Gagal menguji proxy. Kode Status: {statusCode}", "QualityProfile": "Profil Kualitas", "Add": "Tambah", "Cancel": "Batal", diff --git a/src/NzbDrone.Core/Localization/Core/it.json b/src/NzbDrone.Core/Localization/Core/it.json index 72de8677a..574b32f5c 100644 --- a/src/NzbDrone.Core/Localization/Core/it.json +++ b/src/NzbDrone.Core/Localization/Core/it.json @@ -1,11 +1,11 @@ { - "DeleteConditionMessageText": "Sei sicuro di voler eliminare la condizione '{0}'?", + "DeleteConditionMessageText": "Sei sicuro di voler eliminare la condizione '{name}'?", "ApplyTagsHelpTextReplace": "Sostituire: Sostituisce le etichette con quelle inserite (non inserire nessuna etichette per eliminarle tutte)", "ApplyTagsHelpTextHowToApplyIndexers": "Come applicare etichette agli indicizzatori selezionati", "MoveAutomatically": "Sposta Automaticamente", "ApplyTagsHelpTextRemove": "Rimuovi: Rimuove le etichette inserite", "ApplyTagsHelpTextAdd": "Aggiungi: Aggiunge le etichette alla lista esistente di etichette", - "DeleteCustomFormatMessageText": "Sei sicuro di voler eliminare il formato personalizzato '{0}'?", + "DeleteCustomFormatMessageText": "Sei sicuro di voler eliminare il formato personalizzato '{customFormatName}'?", "DeleteSelectedDownloadClients": "Cancella i Client di Download", "Added": "Aggiunto", "AutomaticAdd": "Aggiungi Automaticamente", @@ -15,7 +15,7 @@ "AutoAdd": "Aggiungi Automaticamente", "AirDate": "Data di Trasmissione", "AllTitles": "Tutti i Titoli", - "ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {0} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione", + "ApiKeyValidationHealthCheckMessage": "Aggiorna la tua chiave API in modo che abbia una lunghezza di almeno {length} caratteri. Puoi farlo dalle impostazioni o dal file di configurazione", "Apply": "Applica", "ApplyChanges": "Applica Cambiamenti", "ApplyTags": "Applica Etichette", diff --git a/src/NzbDrone.Core/Localization/Core/nb_NO.json b/src/NzbDrone.Core/Localization/Core/nb_NO.json index e8082be62..83382909f 100644 --- a/src/NzbDrone.Core/Localization/Core/nb_NO.json +++ b/src/NzbDrone.Core/Localization/Core/nb_NO.json @@ -1,5 +1,5 @@ { - "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {0} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen", + "ApiKeyValidationHealthCheckMessage": "Vennligst oppdater din API-nøkkel til å være minst {length} tegn lang. Du kan gjøre dette via innstillinger eller konfigurasjonsfilen", "ApplyChanges": "Bekreft endringer", "AllTitles": "Alle titler", "AddAutoTag": "Legg til automatisk tagg", diff --git a/src/NzbDrone.Core/Localization/Core/nl.json b/src/NzbDrone.Core/Localization/Core/nl.json index a7d65f5da..3ba8d854f 100644 --- a/src/NzbDrone.Core/Localization/Core/nl.json +++ b/src/NzbDrone.Core/Localization/Core/nl.json @@ -1,6 +1,6 @@ { "RemoveFailedDownloads": "Verwijder mislukte downloads", - "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {0} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", + "ApiKeyValidationHealthCheckMessage": "Maak je API sleutel alsjeblieft minimaal {length} karakters lang. Dit kan gedaan worden via de instellingen of het configuratiebestand", "RemoveCompletedDownloads": "Verwijder voltooide downloads", "AppDataLocationHealthCheckMessage": "Updaten zal niet mogelijk zijn om het verwijderen van AppData te voorkomen", "Added": "Toegevoegd", diff --git a/src/NzbDrone.Core/Localization/Core/pl.json b/src/NzbDrone.Core/Localization/Core/pl.json index 6717d3c29..d45c4d835 100644 --- a/src/NzbDrone.Core/Localization/Core/pl.json +++ b/src/NzbDrone.Core/Localization/Core/pl.json @@ -13,7 +13,7 @@ "ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych indeksatorów", "Authentication": "Autoryzacja", "BlocklistReleases": "Dodaj wersje do czarnej listy", - "ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {0} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny", + "ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {length} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny", "AudioInfo": "Informacje o audio", "AddAutoTagError": "Nie można dodać nowego tagu automatycznego, spróbuj ponownie.", "AddConditionError": "Nie można dodać nowego warunku, spróbuj ponownie.", diff --git a/src/NzbDrone.Core/Localization/Core/pt.json b/src/NzbDrone.Core/Localization/Core/pt.json index 5aa1d1182..1df2c799a 100644 --- a/src/NzbDrone.Core/Localization/Core/pt.json +++ b/src/NzbDrone.Core/Localization/Core/pt.json @@ -4,7 +4,7 @@ "CountSeasons": "{count} temporadas", "Language": "Idioma", "Added": "Adicionado", - "ApiKeyValidationHealthCheckMessage": "Por favor, atualize a sua API Key para ter no mínimo {0} caracteres. Pode fazer através das definições ou do ficheiro de configuração", + "ApiKeyValidationHealthCheckMessage": "Por favor, atualize a sua API Key para ter no mínimo {length} caracteres. Pode fazer através das definições ou do ficheiro de configuração", "AppDataLocationHealthCheckMessage": "Não foi possível atualizar para prevenir apagar a AppData durante a atualização", "AddAutoTag": "Adicionar Etiqueta Automática", "AbsoluteEpisodeNumbers": "Números de Episódios Absolutos", diff --git a/src/NzbDrone.Core/Localization/Core/pt_BR.json b/src/NzbDrone.Core/Localization/Core/pt_BR.json index eb6252099..c5034e996 100644 --- a/src/NzbDrone.Core/Localization/Core/pt_BR.json +++ b/src/NzbDrone.Core/Localization/Core/pt_BR.json @@ -9,15 +9,15 @@ "Enabled": "Habilitado", "Ended": "Terminou", "HideAdvanced": "Ocultar Avançado", - "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Múltiplas pastas raiz estão faltando nas listas de importação: {0}", + "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Múltiplas pastas raiz estão faltando nas listas de importação: {rootFoldersInfo}", "ImportListStatusAllUnavailableHealthCheckMessage": "Todas as listas estão indisponíveis devido a falhas", "ImportMechanismHandlingDisabledHealthCheckMessage": "Ativar gerenciamento de download concluído", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a falhas por mais de 6 horas: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a falhas por mais de 6 horas: {indexerNames}", "IndexerRssNoIndexersEnabledHealthCheckMessage": "Nenhum indexador disponível com sincronização de RSS ativada, o {appName} não obterá novos lançamentos automaticamente", "IndexerSearchNoAutomaticHealthCheckMessage": "Nenhum indexador disponível com a pesquisa automática ativada, o {appName} não fornecerá nenhum resultado de pesquisa automática", "IndexerSearchNoInteractiveHealthCheckMessage": "Nenhum indexador disponível com a Pesquisa interativa habilitada, o {appName} não fornecerá nenhum resultado de pesquisa interativa", "IndexerStatusAllUnavailableHealthCheckMessage": "Todos os indexadores estão indisponíveis devido a falhas", - "IndexerStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a falhas: {0}", + "IndexerStatusUnavailableHealthCheckMessage": "Indexadores indisponíveis devido a falhas: {indexerNames}", "Language": "Idioma", "Monitored": "Monitorado", "MountHealthCheckMessage": "A montagem que contém um caminho de série é montada somente para leitura: ", @@ -30,21 +30,21 @@ "RemoveFailedDownloads": "Remover downloads com falha", "QualityProfile": "Perfil de Qualidade", "RefreshSeries": "Atualizar Séries", - "RemotePathMappingDockerFolderMissingHealthCheckMessage": "Você está usando o docker; o cliente de download {0} coloca os downloads em {1}, mas esse diretório parece não existir dentro do contêiner. Revise seus mapeamentos de caminho remoto e configurações de volume do contêiner.", - "RemotePathMappingDownloadPermissionsHealthCheckMessage": "O {appName} pode ver, mas não acessar o episódio baixado {0}. Provável erro de permissão.", - "RemotePathMappingFileRemovedHealthCheckMessage": "O arquivo {0} foi removido no meio do processamento.", - "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Baixe os arquivos relatados do cliente {0} em {1}, mas o {appName} não pode ver este diretório. Pode ser necessário ajustar as permissões da pasta.", - "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "O cliente de download local {0} relatou arquivos em {1}, mas este não é um caminho {2} válido. Revise as configurações do cliente de download.", - "RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} pode ver, mas não acessar o diretório de download {0}. Provável erro de permissão.", - "RemotePathMappingGenericPermissionsHealthCheckMessage": "O cliente de download {0} coloca os downloads em {1}, mas o {appName} não pode ver este diretório. Pode ser necessário ajustar as permissões da pasta.", + "RemotePathMappingDockerFolderMissingHealthCheckMessage": "Você está usando o docker; o cliente de download $1{downloadClientName} coloca os downloads em {path}, mas esse diretório parece não existir dentro do contêiner. Revise seus mapeamentos de caminho remoto e configurações de volume do contêiner.", + "RemotePathMappingDownloadPermissionsHealthCheckMessage": "O {appName} pode ver, mas não acessar o episódio baixado {path}. Provável erro de permissão.", + "RemotePathMappingFileRemovedHealthCheckMessage": "O arquivo {path} foi removido no meio do processamento.", + "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "Baixe os arquivos relatados do cliente {downloadClientName} em {path}, mas o {appName} não pode ver este diretório. Pode ser necessário ajustar as permissões da pasta.", + "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "O cliente de download local {downloadClientName} relatou arquivos em {path}, mas este não é um caminho {osName} válido. Revise as configurações do cliente de download.", + "RemotePathMappingFolderPermissionsHealthCheckMessage": "{appName} pode ver, mas não acessar o diretório de download {downloadPath}. Provável erro de permissão.", + "RemotePathMappingGenericPermissionsHealthCheckMessage": "O cliente de download {downloadClientName} coloca os downloads em {path}, mas o {appName} não pode ver este diretório. Pode ser necessário ajustar as permissões da pasta.", "RemotePathMappingImportFailedHealthCheckMessage": "{appName} falhou ao importar (um) episódio(s). Verifique seus logs para obter detalhes.", - "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "O cliente de download local {0} coloca os downloads em {1}, mas este não é um caminho {2} válido. Revise as configurações do cliente de download.", - "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "O cliente de download remoto {0} relatou arquivos em {1}, mas este diretório parece não existir. Provavelmente faltando mapeamento de caminho remoto.", - "RemovedSeriesMultipleRemovedHealthCheckMessage": "A série {0} foi removida do TheTVDB", - "RemovedSeriesSingleRemovedHealthCheckMessage": "As séries {0} foram removidas do TheTVDB", + "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "O cliente de download local {downloadClientName} coloca os downloads em {path}, mas este não é um caminho {osName} válido. Revise as configurações do cliente de download.", + "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "O cliente de download remoto {downloadClientName} relatou arquivos em {path}, mas este diretório parece não existir. Provavelmente faltando mapeamento de caminho remoto.", + "RemovedSeriesMultipleRemovedHealthCheckMessage": "A série {series} foi removida do TheTVDB", + "RemovedSeriesSingleRemovedHealthCheckMessage": "As séries {series} foram removidas do TheTVDB", "RootFolder": "Pasta Raiz", - "RootFolderMissingHealthCheckMessage": "Pasta raiz ausente: {0}", - "RootFolderMultipleMissingHealthCheckMessage": "Faltam várias pastas raiz: {0}", + "RootFolderMissingHealthCheckMessage": "Pasta raiz ausente: {rootFolderPath}", + "RootFolderMultipleMissingHealthCheckMessage": "Faltam várias pastas raiz: {rootFolderPaths}", "SearchForMonitoredEpisodes": "Pesquisar episódios monitorados", "ShowAdvanced": "Mostrar Avançado", "ShownClickToHide": "Mostrado, clique para ocultar", @@ -52,41 +52,40 @@ "SystemTimeHealthCheckMessage": "A hora do sistema está desligada por mais de 1 dia. Tarefas agendadas podem não ser executadas corretamente até que o horário seja corrigido", "Unmonitored": "Não monitorado", "UpdateAvailableHealthCheckMessage": "Nova atualização está disponível", - "UpdateUINotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de IU '{0}' não pode ser gravada pelo usuário '{1}'.", "Added": "Adicionado", - "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", + "ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {length} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração", "RemoveCompletedDownloads": "Remover downloads concluídos", "AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização", - "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Não é possível se comunicar com {0}.", - "DownloadClientRootFolderHealthCheckMessage": "O cliente de download {0} coloca os downloads na pasta raiz {1}. Você não deve baixar para uma pasta raiz.", - "DownloadClientSortingHealthCheckMessage": "O cliente de download {0} tem classificação {1} habilitada para a categoria {appName}. Você deve desativar a classificação em seu cliente de download para evitar problemas de importação.", - "DownloadClientStatusSingleClientHealthCheckMessage": "Clientes de download indisponíveis devido a falhas: {0}", + "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Não é possível se comunicar com {downloadClientName}.", + "DownloadClientRootFolderHealthCheckMessage": "O cliente de download {downloadClientName} coloca os downloads na pasta raiz {rootFolderPath}. Você não deve baixar para uma pasta raiz.", + "DownloadClientSortingHealthCheckMessage": "O cliente de download {downloadClientName} tem classificação {sortingMode} habilitada para a categoria {appName}. Você deve desativar a classificação em seu cliente de download para evitar problemas de importação.", + "DownloadClientStatusSingleClientHealthCheckMessage": "Clientes de download indisponíveis devido a falhas: {downloadClientNames}", "EditSelectedIndexers": "Editar indexadores selecionados", "EditSeries": "Editar Série", "EnableAutomaticSearch": "Ativar pesquisa automática", "EnableInteractiveSearch": "Ativar pesquisa interativa", "HiddenClickToShow": "Oculto, clique para mostrar", - "ImportListRootFolderMissingRootHealthCheckMessage": "Pasta raiz ausente para lista(s) de importação: {0}", - "ImportListStatusUnavailableHealthCheckMessage": "Listas indisponíveis devido a falhas: {0}", + "ImportListRootFolderMissingRootHealthCheckMessage": "Pasta raiz ausente para lista(s) de importação: {rootFolderInfo}", + "ImportListStatusUnavailableHealthCheckMessage": "Listas indisponíveis devido a falhas: {importListNames}", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Ative o Gerenciamento de download concluído, se possível", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "Ative o Gerenciamento de download concluído, se possível (Multi-computador não suportado)", - "IndexerJackettAllHealthCheckMessage": "Indexadores usando o endpont Jackett 'all' sem suporte: {0}", + "IndexerJackettAllHealthCheckMessage": "Indexadores usando o endpont Jackett 'all' sem suporte: {indexerNames}", "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Todos os indexadores estão indisponíveis devido a falhas por mais de 6 horas", "IndexerRssNoIndexersAvailableHealthCheckMessage": "Todos os indexadores compatíveis com rss estão temporariamente indisponíveis devido a erros recentes do indexador", "IndexerSearchNoAvailableIndexersHealthCheckMessage": "Todos os indexadores com capacidade de pesquisa estão temporariamente indisponíveis devido a erros recentes do indexador", "NextAiring": "Próxima Exibição", "OriginalLanguage": "Idioma Original", - "ProxyBadRequestHealthCheckMessage": "Falha ao testar o proxy. Código de estado: {0}", - "ProxyFailedToTestHealthCheckMessage": "Falha ao testar o proxy: {0}", - "ProxyResolveIpHealthCheckMessage": "Falha ao resolver o endereço IP do host de proxy configurado {0}", - "RecycleBinUnableToWriteHealthCheckMessage": "Não é possível gravar na pasta da lixeira configurada: {0}. Certifique-se de que este caminho exista e seja gravável pelo usuário executando o {appName}", - "RemotePathMappingBadDockerPathHealthCheckMessage": "Você está usando o docker; cliente de download {0} coloca downloads em {1}, mas este não é um caminho {2} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", - "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "Você está usando o docker; baixe os arquivos relatados do cliente {0} em {1}, mas este não é um caminho {2} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", - "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "O cliente de download remoto {0} relatou arquivos em {1}, mas este não é um caminho {2} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", - "RemotePathMappingLocalFolderMissingHealthCheckMessage": "O cliente de download remoto {0} coloca os downloads em {1}, mas este diretório parece não existir. Mapeamento de caminho remoto provavelmente ausente ou incorreto.", - "RemotePathMappingWrongOSPathHealthCheckMessage": "O cliente de download remoto {0} coloca os downloads em {1}, mas este não é um caminho {2} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", - "UpdateStartupNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.", - "UpdateStartupTranslocationHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.", + "ProxyBadRequestHealthCheckMessage": "Falha ao testar o proxy. Código de estado: {statusCode}", + "ProxyFailedToTestHealthCheckMessage": "Falha ao testar o proxy: {url}", + "ProxyResolveIpHealthCheckMessage": "Falha ao resolver o endereço IP do host de proxy configurado {proxyHostName}", + "RecycleBinUnableToWriteHealthCheckMessage": "Não é possível gravar na pasta da lixeira configurada: {path}. Certifique-se de que este caminho exista e seja gravável pelo usuário executando o {appName}", + "RemotePathMappingBadDockerPathHealthCheckMessage": "Você está usando o docker; cliente de download {downloadClientName} coloca downloads em {path}, mas este não é um caminho {osName} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", + "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "Você está usando o docker; baixe os arquivos relatados do cliente {downloadClientName} em {path}, mas este não é um caminho {osName} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", + "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "O cliente de download remoto {downloadClientName} relatou arquivos em {path}, mas este não é um caminho {osName} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", + "RemotePathMappingLocalFolderMissingHealthCheckMessage": "O cliente de download remoto {downloadClientName} coloca os downloads em {path}, mas este diretório parece não existir. Mapeamento de caminho remoto provavelmente ausente ou incorreto.", + "RemotePathMappingWrongOSPathHealthCheckMessage": "O cliente de download remoto {downloadClientName} coloca os downloads em {path}, mas este não é um caminho {osName} válido. Revise seus mapeamentos de caminho remoto e baixe as configurações do cliente.", + "UpdateStartupNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{startupFolder}' não pode ser gravada pelo usuário '{userName}'.", + "UpdateStartupTranslocationHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{startupFolder}' está em uma pasta de translocação de aplicativo.", "BlocklistReleaseHelpText": "Inicia uma busca por este episódio novamente e impede que esta versão seja capturada novamente", "BlocklistReleases": "Lançamentos na lista de bloqueio", "CloneCondition": "Clonar Condição", @@ -96,7 +95,7 @@ "DeleteCondition": "Excluir condição", "DeleteConditionMessageText": "Tem certeza de que deseja excluir a condição '{name}'?", "DeleteCustomFormat": "Excluir formato personalizado", - "DeleteCustomFormatMessageText": "Tem certeza de que deseja excluir o formato personalizado '{0}'?", + "DeleteCustomFormatMessageText": "Tem certeza de que deseja excluir o formato personalizado '{customFormatName}'?", "ExportCustomFormat": "Exportar Formato Personalizado", "Negated": "Negado", "Remove": "Remover", @@ -400,7 +399,7 @@ "SomeResultsAreHiddenByTheAppliedFilter": "Alguns resultados estão ocultos pelo filtro aplicado", "UnableToLoadAutoTagging": "Não foi possível carregar a marcação automática", "UnableToLoadRootFolders": "Não foi possível carregar as pastas raiz", - "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {indexerNames}.", "AddConditionError": "Não foi possível adicionar uma nova condição. Tente novamente.", "AddConnection": "Adicionar Conexão", "AddCustomFormat": "Adicionar Formato Personalizado", @@ -901,7 +900,7 @@ "UpdateAutomaticallyHelpText": "Baixe e instale atualizações automaticamente. Você ainda poderá instalar a partir do Sistema: Atualizações", "UpdateMechanismHelpText": "Use o atualizador integrado do {appName} ou um script", "UpdateSonarrDirectlyLoadError": "Incapaz de atualizar o {appName} diretamente,", - "UpdateUiNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de IU '{0}' não pode ser salva pelo usuário '{1}'.", + "UpdateUiNotWritableHealthCheckMessage": "Não é possível instalar a atualização porque a pasta de IU '{uiFolder}' não pode ser salva pelo usuário '{userName}'.", "UpgradeUntil": "Atualizar Até", "UpgradeUntilCustomFormatScore": "Atualizar até pontuação de formato personalizado", "UpgradeUntilHelpText": "Quando essa qualidade for atingida, o {appName} não fará mais download de episódios", @@ -1257,7 +1256,7 @@ "MoveFiles": "Mover Arquivos", "MultiLanguages": "Multi-Idiomas", "NoEpisodesFoundForSelectedSeason": "Nenhum episódio foi encontrado para a temporada selecionada", - "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notificações indisponíveis devido a falhas: {notificationNames}", "Or": "ou", "Organize": "Organizar", "OrganizeLoadError": "Erro ao carregar visualizações", @@ -1484,5 +1483,5 @@ "FormatShortTimeSpanSeconds": "{seconds} segundo(s)", "FormatTimeSpanDays": "{days}d {time}", "Yesterday": "Ontem", - "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de download {0} está configurado para remover downloads concluídos. Isso pode resultar na remoção dos downloads do seu cliente antes que {1} possa importá-los." + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "O cliente de download {downloadClientName} está configurado para remover downloads concluídos. Isso pode resultar na remoção dos downloads do seu cliente antes que {appName} possa importá-los." } diff --git a/src/NzbDrone.Core/Localization/Core/ro.json b/src/NzbDrone.Core/Localization/Core/ro.json index 212c2e146..44a02672a 100644 --- a/src/NzbDrone.Core/Localization/Core/ro.json +++ b/src/NzbDrone.Core/Localization/Core/ro.json @@ -20,13 +20,13 @@ "ApplyTagsHelpTextAdd": "Adăugare: adăugați etichetele la lista de etichete existentă", "ApplyTagsHelpTextReplace": "Înlocuire: înlocuiți etichetele cu etichetele introduse (nu introduceți etichete pentru a șterge toate etichetele)", "CancelPendingTask": "Sigur doriți să anulați această sarcină în așteptare?", - "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Nu pot comunica cu {0}.", + "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Nu pot comunica cu {downloadClientName}.", "CloneCustomFormat": "Clonați format personalizat", "Close": "Închide", "Delete": "Șterge", "Added": "Adăugat", "CountSeasons": "{count} sezoane", - "DownloadClientStatusSingleClientHealthCheckMessage": "Clienții de descărcare indisponibili datorită erorilor: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Clienții de descărcare indisponibili datorită erorilor: {downloadClientNames}", "EnableAutomaticSearch": "Activați căutarea automată", "EnableInteractiveSearch": "Activați căutarea interactivă", "Enabled": "Activat", @@ -69,7 +69,7 @@ "DotNetVersion": ".NET", "Download": "Descarca", "DownloadClient": "Client de descărcare", - "DownloadClientRootFolderHealthCheckMessage": "Clientul de descărcare {0} plasează descărcările în folderul rădăcină {1}. Nu trebuie să descărcați într-un folder rădăcină.", + "DownloadClientRootFolderHealthCheckMessage": "Clientul de descărcare {downloadClientName} plasează descărcările în folderul rădăcină {rootFolderPath}. Nu trebuie să descărcați într-un folder rădăcină.", "Episode": "Episod", "EpisodeTitle": "Titlu episod", "Episodes": "Episoade", @@ -151,7 +151,7 @@ "InteractiveImportNoImportMode": "Un mod de import trebuie selectat", "InteractiveImportNoFilesFound": "Nu au fost găsite fișiere video în folderul selectat", "InteractiveImportLoadError": "Imposibil de încărcat articole de import manual", - "NotificationStatusSingleClientHealthCheckMessage": "Notificări indisponibile datorită erorilor: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Notificări indisponibile datorită erorilor: {notificationNames}", "ParseModalUnableToParse": "Nu se poate analiza titlul furnizat, vă rugăm să încercați din nou.", "ParseModalErrorParsing": "Eroare la analizare, încercați din nou.", "Parse": "Analiza", diff --git a/src/NzbDrone.Core/Localization/Core/ru.json b/src/NzbDrone.Core/Localization/Core/ru.json index 08eaa7871..18e1cfe81 100644 --- a/src/NzbDrone.Core/Localization/Core/ru.json +++ b/src/NzbDrone.Core/Localization/Core/ru.json @@ -1,16 +1,16 @@ { - "ApiKeyValidationHealthCheckMessage": "Пожалуйста, обновите свой ключ API, чтобы он был длиной не менее {0} символов. Вы можете сделать это через настройки или файл конфигурации", - "DownloadClientSortingHealthCheckMessage": "В клиенте загрузки {0} включена сортировка {1} для категории {appName}. Вам следует отключить сортировку в вашем клиенте загрузки, чтобы избежать проблем с импортом.", - "IndexerJackettAllHealthCheckMessage": "Используется не поддерживаемый в Jackett конечный параметр 'all' в индексаторе: {0}", + "ApiKeyValidationHealthCheckMessage": "Пожалуйста, обновите свой ключ API, чтобы он был длиной не менее {length} символов. Вы можете сделать это через настройки или файл конфигурации", + "DownloadClientSortingHealthCheckMessage": "В клиенте загрузки {downloadClientName} включена сортировка {sortingMode} для категории {appName}. Вам следует отключить сортировку в вашем клиенте загрузки, чтобы избежать проблем с импортом.", + "IndexerJackettAllHealthCheckMessage": "Используется не поддерживаемый в Jackett конечный параметр 'all' в индексаторе: {indexerNames}", "IndexerSearchNoAutomaticHealthCheckMessage": "Нет доступных индексаторов с включенным автоматическим поиском, {appName} не будет предоставлять результаты автоматического поиска", "Added": "Добавлено", "AppDataLocationHealthCheckMessage": "Обновление будет не возможно, во избежание удаления данных программы во время обновления", "ApplyChanges": "Применить изменения", "DownloadClientCheckNoneAvailableHealthCheckMessage": "Ни один загрузчик не доступен", - "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Невозможно связаться с {0}.", - "DownloadClientRootFolderHealthCheckMessage": "Клиент загрузки {0} помещает загрузки в корневую папку {1}. Вы не должны загружать в корневую папку.", + "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Невозможно связаться с {downloadClientName}.", + "DownloadClientRootFolderHealthCheckMessage": "Клиент загрузки {downloadClientName} помещает загрузки в корневую папку {rootFolderPath}. Вы не должны загружать в корневую папку.", "DownloadClientStatusAllClientHealthCheckMessage": "Все клиенты загрузки недоступны из-за сбоев", - "DownloadClientStatusSingleClientHealthCheckMessage": "Клиенты для скачивания недоступны из-за ошибок: {0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "Клиенты для скачивания недоступны из-за ошибок: {downloadClientNames}", "EditSelectedDownloadClients": "Редактировать выбранные клиенты загрузки", "EditSelectedImportLists": "Редактировать выбранные списки импорта", "EditSeries": "Редактировать серию", @@ -19,14 +19,14 @@ "Enabled": "Включено", "HiddenClickToShow": "Скрыто, нажмите чтобы показать", "HideAdvanced": "Скрыть расширенные", - "ImportListRootFolderMissingRootHealthCheckMessage": "Отсутствует корневая папка для импортирования списка(ов): {0}", - "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Для импортируемых списков отсутствуют несколько корневых папок: {0}", + "ImportListRootFolderMissingRootHealthCheckMessage": "Отсутствует корневая папка для импортирования списка(ов): {rootFolderInfo}", + "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Для импортируемых списков отсутствуют несколько корневых папок: {rootFoldersInfo}", "ImportListStatusAllUnavailableHealthCheckMessage": "Все листы недоступны из-за ошибок", - "ImportListStatusUnavailableHealthCheckMessage": "Листы недоступны из-за ошибок: {0}", + "ImportListStatusUnavailableHealthCheckMessage": "Листы недоступны из-за ошибок: {importListNames}", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Включить обработку завершенной загрузки, если это возможно", "ImportMechanismHandlingDisabledHealthCheckMessage": "Включить обработку завершенных скачиваний", "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов: {0}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "Все индексаторы недоступны из-за ошибок за последние 6 часов: {indexerNames}", "IndexerRssNoIndexersAvailableHealthCheckMessage": "Все RSS индексаторы временно выключены из-за ошибок", "IndexerRssNoIndexersEnabledHealthCheckMessage": "Нет доступных индексаторов с включенной синхронизацией RSS, {appName} не будет автоматически получать новые выпуски", "IndexerSearchNoAvailableIndexersHealthCheckMessage": "Все индексаторы с возможностью поиска временно выключены из-за ошибок", @@ -35,12 +35,12 @@ "EditConditionImplementation": "Редактировать условие - {implementationName}", "EditImportListImplementation": "Редактировать импорт лист - {implementationName}", "Implementation": "Реализация", - "IndexerDownloadClientHealthCheckMessage": "Индексаторы с недопустимыми клиентами загрузки: {0}.", + "IndexerDownloadClientHealthCheckMessage": "Индексаторы с недопустимыми клиентами загрузки: {indexerNames}.", "ManageClients": "Управление клиентами", "ManageIndexers": "Управление индексаторами", "MoveAutomatically": "Перемещать автоматически", "NoDownloadClientsFound": "Клиенты для загрузки не найдены", - "NotificationStatusSingleClientHealthCheckMessage": "Уведомления недоступны из-за сбоев: {0}", + "NotificationStatusSingleClientHealthCheckMessage": "Уведомления недоступны из-за сбоев: {notificationNames}", "CountIndexersSelected": "{count} выбранных индексаторов", "EditAutoTag": "Редактировать автоматическую маркировку", "NoHistoryBlocklist": "Нет истории блокировок", diff --git a/src/NzbDrone.Core/Localization/Core/vi.json b/src/NzbDrone.Core/Localization/Core/vi.json index 0d4b4e5c9..493d34b23 100644 --- a/src/NzbDrone.Core/Localization/Core/vi.json +++ b/src/NzbDrone.Core/Localization/Core/vi.json @@ -2,7 +2,7 @@ "BlocklistRelease": "Chặn bản phát hành", "BlocklistReleases": "Phát hành danh sách đen", "Added": "Đã thêm", - "ApiKeyValidationHealthCheckMessage": "Hãy cập nhật mã API để dài ít nhất {0} kí tự. Bạn có thể làm điều này trong cài đặt hoặc trong tập config", + "ApiKeyValidationHealthCheckMessage": "Hãy cập nhật mã API để dài ít nhất {length} kí tự. Bạn có thể làm điều này trong cài đặt hoặc trong tập config", "AppDataLocationHealthCheckMessage": "Việc cập nhật sẽ không xảy ra để tránh xóa AppData khi cập nhật", "ApplyChanges": "Áp dụng thay đổi", "AutomaticAdd": "Tự động thêm" diff --git a/src/NzbDrone.Core/Localization/Core/zh_CN.json b/src/NzbDrone.Core/Localization/Core/zh_CN.json index 0b8833c91..a7e693399 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_CN.json +++ b/src/NzbDrone.Core/Localization/Core/zh_CN.json @@ -2,8 +2,8 @@ "CloneCondition": "克隆条件", "DeleteCondition": "删除条件", "DeleteConditionMessageText": "你确定要删除条件 “{name}” 吗?", - "DeleteCustomFormatMessageText": "是否确实要删除条件“{0}”?", - "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{0}个字符长。您可以通过设置或配置文件执行此操作", + "DeleteCustomFormatMessageText": "是否确实要删除条件“{customFormatName}”?", + "ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少{length}个字符长。您可以通过设置或配置文件执行此操作", "RemoveSelectedItemQueueMessageText": "您确定要从队列中删除一个项目吗?", "RemoveSelectedItemsQueueMessageText": "您确定要从队列中删除{selectedCount}项吗?", "ApplyChanges": "应用更改", @@ -63,22 +63,22 @@ "Metadata": "元数据", "CountSeasons": "季{count}", "DownloadClientCheckNoneAvailableHealthCheckMessage": "无可用的下载客户端", - "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "无法与{0}进行通讯。", - "DownloadClientRootFolderHealthCheckMessage": "下载客户端{0}将下载内容放在根文件夹{1}中。您不应该下载到根文件夹。", - "DownloadClientSortingHealthCheckMessage": "下载客户端{0}已为{appName}的类别启用{1}排序。您应该在下载客户端中禁用排序,以避免导入问题。", + "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "无法与{downloadClientName}进行通讯。", + "DownloadClientRootFolderHealthCheckMessage": "下载客户端{downloadClientName}将下载内容放在根文件夹{rootFolderPath}中。您不应该下载到根文件夹。", + "DownloadClientSortingHealthCheckMessage": "下载客户端{downloadClientName}已为{appName}的类别启用{sortingMode}排序。您应该在下载客户端中禁用排序,以避免导入问题。", "DownloadClientStatusAllClientHealthCheckMessage": "所有下载客户端都不可用", - "DownloadClientStatusSingleClientHealthCheckMessage": "所有下载客户端都不可用:{0}", + "DownloadClientStatusSingleClientHealthCheckMessage": "所有下载客户端都不可用:{downloadClientNames}", "EditSeries": "编辑剧集", "Enabled": "已启用", "Ended": "已完结", - "ImportListRootFolderMissingRootHealthCheckMessage": "在导入列表中缺少根目录文件夹:{0}", - "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "导入列表中缺失多个根目录文件夹:{0}", + "ImportListRootFolderMissingRootHealthCheckMessage": "在导入列表中缺少根目录文件夹:{rootFolderInfo}", + "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "导入列表中缺失多个根目录文件夹:{rootFoldersInfo}", "ImportListStatusAllUnavailableHealthCheckMessage": "所有的列表因错误不可用", - "ImportListStatusUnavailableHealthCheckMessage": "列表因错误不可用:{0}", + "ImportListStatusUnavailableHealthCheckMessage": "列表因错误不可用:{importListNames}", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "如果可能,启用完整的下载处理(不支持多台计算机)", "ImportMechanismHandlingDisabledHealthCheckMessage": "启用下载完成处理", - "IndexerJackettAllHealthCheckMessage": "使用 Jackett 不受支持的“全部”终点的索引器:{0}", - "IndexerLongTermStatusUnavailableHealthCheckMessage": "由于故障6小时,下列索引器都已不可用:{0}", + "IndexerJackettAllHealthCheckMessage": "使用 Jackett 不受支持的“全部”终点的索引器:{indexerNames}", + "IndexerLongTermStatusUnavailableHealthCheckMessage": "由于故障6小时,下列索引器都已不可用:{indexerNames}", "IndexerRssNoIndexersAvailableHealthCheckMessage": "由于最近的索引器错误,所有支持rss的索引器暂时不可用", "IndexerRssNoIndexersEnabledHealthCheckMessage": "没有启用RSS同步的索引器,{appName}不会自动抓取新版本", "IndexerSearchNoAutomaticHealthCheckMessage": "没有启用自动搜索的索引器,{appName}不会提供任何自动搜索结果", @@ -89,12 +89,12 @@ "OneSeason": "季1", "OriginalLanguage": "原语言", "Priority": "优先级", - "ProxyBadRequestHealthCheckMessage": "测试代理失败。状态代码:{0}", - "RecycleBinUnableToWriteHealthCheckMessage": "配置文件夹:{0}无法写入,检查此路径是否存在,并且是否可由{appName}写入", + "ProxyBadRequestHealthCheckMessage": "测试代理失败。状态代码:{statusCode}", + "RecycleBinUnableToWriteHealthCheckMessage": "配置文件夹:{path}无法写入,检查此路径是否存在,并且是否可由{appName}写入", "QualityProfile": "质量配置", "RefreshSeries": "刷新节目", - "RemotePathMappingBadDockerPathHealthCheckMessage": "您正在使用docker;下载客户端{0}下载目录为{1},但这不是有效的{2}路径。查看Docker路径映射并为下载客户端重新配置。", - "RemotePathMappingDownloadPermissionsHealthCheckMessage": "{appName}已存在剧集目录{0}但无法访问。可能是权限错误。", + "RemotePathMappingBadDockerPathHealthCheckMessage": "您正在使用docker;下载客户端{downloadClientName}下载目录为{path},但这不是有效的{osName}路径。查看Docker路径映射并为下载客户端重新配置。", + "RemotePathMappingDownloadPermissionsHealthCheckMessage": "{appName}已存在剧集目录{path}但无法访问。可能是权限错误。", "Mode": "模式", "MoreInfo": "更多信息", "New": "新的", @@ -107,7 +107,7 @@ "NoLeaveIt": "不,就这样", "NoLogFiles": "没有日志文件", "Options": "选项", - "RemotePathMappingDockerFolderMissingHealthCheckMessage": "您正在使用docker;下载客户端{0}下载目录为{1},但容器中似乎不存在此目录。请检查Docker路径映射。", + "RemotePathMappingDockerFolderMissingHealthCheckMessage": "您正在使用docker;下载客户端$1{downloadClientName}下载目录为{path},但容器中似乎不存在此目录。请检查Docker路径映射。", "AirDate": "播出日期", "Daily": "日常的", "FullSeason": "全部剧集", @@ -115,7 +115,7 @@ "ImportLists": "导入列表", "ExistingTag": "已有标签", "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "由于故障超过6小时,所有索引器均不可用", - "IndexerStatusUnavailableHealthCheckMessage": "搜刮器因错误不可用:{0}", + "IndexerStatusUnavailableHealthCheckMessage": "搜刮器因错误不可用:{indexerNames}", "IndexerSearchNoAvailableIndexersHealthCheckMessage": "由于最近的索引器错误,所有支持搜索的索引器暂时不可用", "LogFiles": "日志文件", "MatchedToEpisodes": "与剧集匹配", @@ -132,7 +132,7 @@ "Proper": "合适的", "ReleaseGroup": "发布组", "ReleaseTitle": "发行版标题", - "RemotePathMappingFileRemovedHealthCheckMessage": "文件{0} 在处理的过程中被部分删除。", + "RemotePathMappingFileRemovedHealthCheckMessage": "文件{path} 在处理的过程中被部分删除。", "AutoAdd": "自动添加", "Cancel": "取消", "DeleteSelectedDownloadClientsMessageText": "您确定要删除{count}选定的下载客户端吗?", @@ -144,7 +144,7 @@ "LibraryImport": "媒体库导入", "PreviousAiring": "上一次播出", "Profiles": "配置", - "ProxyResolveIpHealthCheckMessage": "无法解析已设置的代理服务器主机{0}的IP地址", + "ProxyResolveIpHealthCheckMessage": "无法解析已设置的代理服务器主机{proxyHostName}的IP地址", "Quality": "媒体质量", "Queue": "队列", "Real": "真的", @@ -223,7 +223,7 @@ "EnableAutomaticSearch": "启用自动搜索", "EpisodeAirDate": "剧集播出日期", "IndexerSearchNoInteractiveHealthCheckMessage": "没有启用交互式搜索的索引器,{appName}将不提供任何交互式搜索结果", - "ProxyFailedToTestHealthCheckMessage": "测试代理失败: {0}", + "ProxyFailedToTestHealthCheckMessage": "测试代理失败: {url}", "About": "关于", "Actions": "动作", "AppDataDirectory": "AppData目录", @@ -274,42 +274,41 @@ "Tags": "标签", "Series": "节目", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "如果可能,在下载完成后自动处理", - "RemotePathMappingGenericPermissionsHealthCheckMessage": "下载客户端{0}将文件下载在{1}中,但{appName}无法找到此目录。您可能需要调整文件夹的权限。", - "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "本地下载客户端{0}将文件下载在{1}中,但这不是有效的{2}路径。查看您的下载客户端设置。", - "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "远程下载客户端{0}报告了{1}中的文件,但此目录似乎不存在。可能缺少远程路径映射。", + "RemotePathMappingGenericPermissionsHealthCheckMessage": "下载客户端{downloadClientName}将文件下载在{path}中,但{appName}无法找到此目录。您可能需要调整文件夹的权限。", + "RemotePathMappingLocalWrongOSPathHealthCheckMessage": "本地下载客户端{downloadClientName}将文件下载在{path}中,但这不是有效的{osName}路径。查看您的下载客户端设置。", + "RemotePathMappingRemoteDownloadClientHealthCheckMessage": "远程下载客户端{downloadClientName}报告了{path}中的文件,但此目录似乎不存在。可能缺少远程路径映射。", "IRCLinkText": "#Libera上的{appName}", "LiberaWebchat": "Libera聊天", - "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "您正在使用Docker;下载客户端{0}报告了{1}中的文件,但这不是有效的{2}中的路径。查看Docker路径映射并更新下载客户端设置。", - "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "下载客户端{0}报告的文件在{1},但{appName}无法查看此目录。您可能需要调整文件夹的权限。", + "RemotePathMappingFilesBadDockerPathHealthCheckMessage": "您正在使用Docker;下载客户端{downloadClientName}报告了{path}中的文件,但这不是有效的{osName}中的路径。查看Docker路径映射并更新下载客户端设置。", + "RemotePathMappingFilesGenericPermissionsHealthCheckMessage": "下载客户端{downloadClientName}报告的文件在{path},但{appName}无法查看此目录。您可能需要调整文件夹的权限。", "RemovedFromTaskQueue": "从任务队列中删除", - "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "本地下载客户端{0}报告了{1}中的文件,但这不是有效的{2}路径。查看您的下载客户端设置。", - "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "远程下载客户端{0}报告了{1}中的文件,但这不是有效的{2}路径。查看远程路径映射并更新下载客户端设置。", + "RemotePathMappingFilesLocalWrongOSPathHealthCheckMessage": "本地下载客户端{downloadClientName}报告了{path}中的文件,但这不是有效的{osName}路径。查看您的下载客户端设置。", + "RemotePathMappingFilesWrongOSPathHealthCheckMessage": "远程下载客户端{downloadClientName}报告了{path}中的文件,但这不是有效的{osName}路径。查看远程路径映射并更新下载客户端设置。", "Restart": "重启", "RestartReloadNote": "注意:{appName}将在恢复过程中自动重启并重新加载UI。", "Restore": "恢复", "RootFolder": "根目录", "RemoveSelectedItems": "删除所选项目", - "RemovedSeriesSingleRemovedHealthCheckMessage": "节目{0}已从TVDB中删除", - "RootFolderMissingHealthCheckMessage": "缺少根目录: {0}", - "RootFolderMultipleMissingHealthCheckMessage": "多个根目录缺失:{0}", + "RemovedSeriesSingleRemovedHealthCheckMessage": "节目{series}已从TVDB中删除", + "RootFolderMissingHealthCheckMessage": "缺少根目录: {rootFolderPath}", + "RootFolderMultipleMissingHealthCheckMessage": "多个根目录缺失:{rootFolderPaths}", "SkipRedownloadHelpText": "阻止{appName}尝试下载此项目的替代版本", "Tasks": "任务", "Wanted": "想要的", "Yes": "确定", - "UpdateUINotWritableHealthCheckMessage": "无法安装升级,因为用户“{1}”不可写入界面文件夹“{0}”。", "AbsoluteEpisodeNumbers": "准确的集数", "RemoveCompleted": "移除已完成", "RemoveFailed": "删除失败", - "RemovedSeriesMultipleRemovedHealthCheckMessage": "已从TVDB中删除节目{0}", - "RemotePathMappingFolderPermissionsHealthCheckMessage": "下载目录{0}已存在但{appName}无法访问。可能是权限错误。", + "RemovedSeriesMultipleRemovedHealthCheckMessage": "已从TVDB中删除节目{series}", + "RemotePathMappingFolderPermissionsHealthCheckMessage": "下载目录{downloadPath}已存在但{appName}无法访问。可能是权限错误。", "RemovingTag": "移除标签", - "RemotePathMappingLocalFolderMissingHealthCheckMessage": "远程下载客户端{0}将文件下载在{1}中,但此目录似乎不存在。可能缺少或不正确的远程路径映射。", + "RemotePathMappingLocalFolderMissingHealthCheckMessage": "远程下载客户端{downloadClientName}将文件下载在{path}中,但此目录似乎不存在。可能缺少或不正确的远程路径映射。", "Replace": "替换", "Repack": "重新打包", "Version": "版本", "Special": "特色", "RemotePathMappingImportFailedHealthCheckMessage": "{appName}无法导入剧集。查看日志以了解详细信息。", - "RemotePathMappingWrongOSPathHealthCheckMessage": "远程下载客户端{0}将文件下载在{1}中,但这不是有效的{2}路径。查看远程路径映射并更新下载客户端设置。", + "RemotePathMappingWrongOSPathHealthCheckMessage": "远程下载客户端{downloadClientName}将文件下载在{path}中,但这不是有效的{osName}路径。查看远程路径映射并更新下载客户端设置。", "RemoveFromDownloadClientHelpTextWarning": "删除将从下载客户端删除下载和文件。", "Renamed": "已重命名", "RootFolderPath": "根目录路径", @@ -325,7 +324,7 @@ "Title": "标题", "Type": "类型", "UnmonitoredOnly": "监控中", - "UpdateStartupTranslocationHealthCheckMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。", + "UpdateStartupTranslocationHealthCheckMessage": "无法安装更新,因为启动文件夹“{startupFolder}”在一个应用程序迁移文件夹。", "Updates": "更新", "VideoCodec": "视频编码", "VideoDynamicRange": "视频动态范围", @@ -334,7 +333,7 @@ "SeasonCount": "季数量", "SystemTimeHealthCheckMessage": "系统时间相差超过1天。在纠正时间之前,计划的任务可能无法正确运行", "TestAll": "测试全部", - "UpdateStartupNotWritableHealthCheckMessage": "无法安装更新,因为用户“{1}”对于启动文件夹“{0}”没有写入权限。", + "UpdateStartupNotWritableHealthCheckMessage": "无法安装更新,因为用户“{userName}”对于启动文件夹“{startupFolder}”没有写入权限。", "SeriesTitle": "节目标题", "SetTags": "设置标签", "Size": "大小", @@ -841,7 +840,7 @@ "SourceRelativePath": "源相对路径", "MetadataSourceSettingsSummary": "{appName}从哪里获得剧集和集信息的总结", "SslCertPassword": "SSL证书密码", - "UpdateUiNotWritableHealthCheckMessage": "无法安装更新,因为用户“{1}”无法写入 UI 文件夹“{0}”。", + "UpdateUiNotWritableHealthCheckMessage": "无法安装更新,因为用户“{userName}”无法写入 UI 文件夹“{uiFolder}”。", "MinimumCustomFormatScoreHelpText": "允许下载的最小自定义格式分数", "SslCertPasswordHelpText": "pfx文件密码", "UpgradeUntilCustomFormatScore": "升级直到自定义格式分数满足", @@ -942,7 +941,7 @@ "HourShorthand": "时", "ImportedTo": "导入到", "Importing": "导入中", - "IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{0}。", + "IndexerDownloadClientHealthCheckMessage": "有无效下载客户端的索引器:{indexerNames}。", "IndexersSettingsSummary": "索引器和索引器选项", "InteractiveImport": "手动导入", "InstanceNameHelpText": "选项卡及日志应用名称", @@ -1311,7 +1310,7 @@ "MyComputer": "我的电脑", "NamingSettings": "命名设置", "NoEpisodeOverview": "没有集摘要", - "NotificationStatusSingleClientHealthCheckMessage": "由于失败导致通知不可用:{0}", + "NotificationStatusSingleClientHealthCheckMessage": "由于失败导致通知不可用:{notificationNames}", "NotificationTriggers": "通知触发器", "NotificationsLoadError": "无法加载通知连接", "OnApplicationUpdate": "程序更新时", @@ -1484,5 +1483,5 @@ "Files": "文件", "SeriesDetailsOneEpisodeFile": "1个集文件", "UrlBase": "基本URL", - "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端{0}设置为删除已完成的下载。这可能导致在{1}可以导入下载之前从您的客户端删除下载。" + "DownloadClientRemovesCompletedDownloadsHealthCheckMessage": "下载客户端{downloadClientName}设置为删除已完成的下载。这可能导致在{appName}可以导入下载之前从您的客户端删除下载。" } diff --git a/src/NzbDrone.Core/Localization/Core/zh_TW.json b/src/NzbDrone.Core/Localization/Core/zh_TW.json index e075c19dd..3ec1abed9 100644 --- a/src/NzbDrone.Core/Localization/Core/zh_TW.json +++ b/src/NzbDrone.Core/Localization/Core/zh_TW.json @@ -1,6 +1,6 @@ { "BlocklistRelease": "封鎖清單版本", "BlocklistReleases": "封鎖清單版本", - "ApiKeyValidationHealthCheckMessage": "請將您的API金鑰更新為至少{0}個字元長。您可以通過設定或配置文件進行此操作。", + "ApiKeyValidationHealthCheckMessage": "請將您的API金鑰更新為至少{length}個字元長。您可以通過設定或配置文件進行此操作。", "AppDataLocationHealthCheckMessage": "為了避免在更新過程中刪除AppData,將無法進行更新。" } diff --git a/src/NzbDrone.Core/Localization/LocalizationService.cs b/src/NzbDrone.Core/Localization/LocalizationService.cs index d0c5c8eb7..9e8df41f3 100644 --- a/src/NzbDrone.Core/Localization/LocalizationService.cs +++ b/src/NzbDrone.Core/Localization/LocalizationService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Text.Json; +using System.Text.RegularExpressions; using System.Threading.Tasks; using NLog; using NzbDrone.Common.Cache; @@ -18,14 +19,17 @@ namespace NzbDrone.Core.Localization public interface ILocalizationService { Dictionary GetLocalizationDictionary(); + string GetLocalizedString(string phrase); - string GetLocalizedString(string phrase, string language); + string GetLocalizedString(string phrase, Dictionary tokens); string GetLanguageIdentifier(); } public class LocalizationService : ILocalizationService, IHandleAsync { private const string DefaultCulture = "en"; + private static readonly Regex TokenRegex = new Regex(@"(?:\{)(?[a-z0-9]+)(?:\})", + RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); private readonly ICached> _cache; @@ -53,23 +57,18 @@ public Dictionary GetLocalizationDictionary() public string GetLocalizedString(string phrase) { - var language = GetLanguageFileName(); - - return GetLocalizedString(phrase, language); + return GetLocalizedString(phrase, new Dictionary()); } - public string GetLocalizedString(string phrase, string language) + public string GetLocalizedString(string phrase, Dictionary tokens) { + var language = GetLanguageFileName(); + if (string.IsNullOrEmpty(phrase)) { throw new ArgumentNullException(nameof(phrase)); } - if (language.IsNullOrWhiteSpace()) - { - language = GetLanguageFileName(); - } - if (language == null) { language = DefaultCulture; @@ -79,7 +78,7 @@ public string GetLocalizedString(string phrase, string language) if (dictionary.TryGetValue(phrase, out var value)) { - return value; + return ReplaceTokens(value, tokens); } return phrase; @@ -98,6 +97,20 @@ public string GetLanguageIdentifier() return language; } + private string ReplaceTokens(string input, Dictionary tokens) + { + tokens.TryAdd("appName", "Sonarr"); + + return TokenRegex.Replace(input, (match) => + { + var tokenName = match.Groups["token"].Value; + + tokens.TryGetValue(tokenName, out var token); + + return token?.ToString() ?? $"{{{tokenName}}}"; + }); + } + private string GetLanguageFileName() { return GetLanguageIdentifier().Replace("-", "_").ToLowerInvariant();