1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-17 21:26:22 -04:00

Compare commits

..

4 Commits

Author SHA1 Message Date
bakerboy448
08ec576326 chore: add Rider IDE and update TypeScript references 2025-10-04 15:17:47 -05:00
bakerboy448
12cc4faf1f chore: update frontend language to TypeScript 2025-10-04 15:16:34 -05:00
bakerboy448
dd788f2c6e chore: update CONTRIBUTING.md to .NET8 2025-10-04 15:14:00 -05:00
bakerboy448
2464b63ee4 chore: sync CONTRIBUTING.md from Servarr/wiki@contributing-sync 2025-08-16 15:35:10 -05:00
24 changed files with 208 additions and 111 deletions

View File

@@ -1,13 +1,187 @@
# How to Contribute
We're always looking for people to help make Radarr even better, there are a number of ways to contribute.
This file has been moved to the wiki for the latest details please see the [contributing wiki page](https://wiki.servarr.com/radarr/contributing).
# Documentation
## Documentation
Setup guides, [FAQ](/radarr/faq), the more information we have on the [wiki](https://wiki.servarr.com/radarr) the better.
Setup guides, [FAQ](https://wiki.servarr.com/radarr/faq), the more information we have on the [wiki](https://wiki.servarr.com/radarr) the better.
# Development
## Development
Radarr is written in C# (backend) and TypeScript (frontend). The backend is built on the .NET8 framework, while the frontend utilizes Reactjs.
See the [Wiki Page](https://wiki.servarr.com/radarr/contributing)
## Tools required
- Visual Studio 2022 or higher (<https://www.visualstudio.com/vs/>). The community version is free and works (<https://www.visualstudio.com/downloads/>).
- JetBrains Rider 2024.3 or higher (<https://www.jetbrains.com/rider/>)
> VS 2022 V17.8 or higher is recommended as it includes the .NET8 SDK
{.is-info}
- TypeScript editor of choice (VS Code/Sublime Text/Webstorm/etc)
- [Git](https://git-scm.com/downloads)
- The [Node.js](https://nodejs.org/) runtime is required. The following versions are supported:
- **20** (any minor or patch version within this)
{.grid-list}
> The Application will **NOT** run on older versions such as `18.x`, `16.x` or any version below 20.0! Due to a dependency issue, it will also not run on `21.x` and is untested on other verisons.
{.is-warning}
- [Yarn](https://yarnpkg.com/getting-started/install) is required to build the frontend
- Yarn is included with **Node 20**+ by default. Enable it with `corepack enable`
- For other Node versions, install it with `npm i -g corepack`
## Getting started
1. Fork Radarr
1. Clone the repository into your development machine. [*info*](https://docs.github.com/en/get-started/quickstart/fork-a-repo)
> Be sure to run lint `yarn lint --fix` on your code for any front end changes before committing.
For css changes `yarn stylelint-windows --fix` {.is-info}
### Building the frontend
- Navigate to the cloned directory
- Install the required Node Packages
```bash
yarn install
```
- Start webpack to monitor your development environment for any changes that need post processing using:
```bash
yarn start
```
### Building the Backend
The backend solution is most easily built and ran in Visual Studio or Rider, however if the only priority is working on the frontend UI it can be built easily from command line as well when the correct SDK is installed.
#### Visual Studio / Rider
> Ensure startup project is set to `Radarr.Console` and framework to `net8.0`
{.is-info}
1. First `Build` the solution in Visual Studio or Rider, this will ensure all projects are correctly built and dependencies restored
1. Next `Debug/Run` the project in Visual Studio or Rider to start Radarr
1. Open <http://localhost:7878>
#### Command line
1. Clean solution
```shell
dotnet clean src/Radarr.sln -c Debug
```
1. Restore and Build debug configuration for the correct platform (Posix or Windows)
```shell
dotnet msbuild -restore src/Radarr.sln -p:Configuration=Debug -p:Platform=Posix -t:PublishAllRids
```
1. Run the produced executable from `/_output`
## Contributing Code
- If you're adding a new, already requested feature, please comment on [GitHub Issues](https://github.com/Radarr/Radarr/issues) so work is not duplicated (If you want to add something not already on there, please talk to us first)
- Rebase from Radarr's develop branch, do not merge
- Make meaningful commits, or squash them
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
- Reach out to us on the discord if you have any questions
- Add tests (unit/integration)
- Commit with \*nix line endings for consistency (We checkout Windows and commit \*nix)
- One feature/bug fix per pull request to keep things clean and easy to understand
- Use 4 spaces instead of tabs, this is the default for VS 2022 and WebStorm
## Pull Requesting
- Only make pull requests to `develop`, never `master`, if you make a PR to `master` we will comment on it and close it
- You're probably going to get some comments or questions from us, they will be to ensure consistency and maintainability
- We'll try to respond to pull requests as soon as possible, if its been a day or two, please reach out to us, we may have missed it
- Each PR should come from its own [feature branch](http://martinfowler.com/bliki/FeatureBranch.html) not develop in your fork, it should have a meaningful branch name (what is being added/fixed)
- `new-feature` (Good)
- `fix-bug` (Good)
- `patch` (Bad)
- `develop` (Bad)
- Commits should be wrote as `New:` or `Fixed:` for changes that would not be considered a `maintenance release`
## Unit Testing
Radarr utilizes nunit for its unit, integration, and automation test suite.
### Running Tests
Tests can be run easily from within VS using the included nunit3testadapter nuget package or from the command line using the included bash script `test.sh`.
From VS simply navigate to Test Explorer and run or debug the tests you'd like to examine.
Tests can be run all at once or one at a time in VS.
From command line the `test.sh` script accepts 3 parameters
```bash
test.sh <PLATFORM> <TYPE> <COVERAGE>
```
### Writing Tests
While not always fun, we encourage writing unit tests for any backend code changes. This will ensure the change is functioning as you intended and that future changes dont break the expected behavior.
> We currently require 80% coverage on new code when submitting a PR
{.is-info}
If you have any questions about any of this, please let us know.
# Translation
Radarr uses a self hosted open access [Weblate](https://translate.servarr.com) instance to manage its json translation files. These files are stored in the repo at `src/NzbDrone.Core/Localization`
## Contributing to an Existing Translation
Weblate handles synchronization and translation of strings for all languages other than English. Editing of translated strings and translating existing strings for supported languages should be performed there for the Radarr project.
The English translation, `en.json`, serves as the source for all other translations and is managed on GitHub repo.
## Adding a Language
Adding translations to Radarr requires two steps
- Adding the Language to weblate
- Adding the Language to Radarr codebase
## Adding Translation Strings in Code
The English translation, `src/NzbDrone.Core/Localization/en.json`, serves as the source for all other translations and is managed on GitHub repo. When adding a new string to either the UI or backend a key must also be added to `en.json` along with the default value in English. This key may then be consumed as follows:
> PRs for translation of log messages will not be accepted
{.is-warning}
### Backend Strings
Backend strings may be added utilizing the Localization Service `GetLocalizedString` method
```dotnet
private readonly ILocalizationService _localizationService;
public IndexerCheck(ILocalizationService localizationService)
{
_localizationService = localizationService;
}
var translated = _localizationService.GetLocalizedString("IndexerHealthCheckNoIndexers")
```
### Frontend Strings
New strings can be added to the frontend by importing the translate function and using a key specified from `en.json`
```js
import translate from 'Utilities/String/translate';
<div>
{translate('UnableToAddANewIndexerPleaseTryAgain')}
</div>
```

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '5.28.0'
majorVersion: '5.27.4'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'

View File

@@ -26,7 +26,7 @@ function BlocklistDetailsModal(props: BlocklistDetailsModalProps) {
return (
<Modal isOpen={isOpen} onModalClose={onModalClose}>
<ModalContent onModalClose={onModalClose}>
<ModalHeader>{translate('Details')}</ModalHeader>
<ModalHeader>Details</ModalHeader>
<ModalBody>
<DescriptionList>

View File

@@ -304,7 +304,7 @@ function Queue() {
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label={translate('Refresh')}
label="Refresh"
iconName={icons.REFRESH}
isSpinning={isRefreshing}
onPress={handleRefreshPress}

View File

@@ -90,7 +90,7 @@ function QueueStatus(props: QueueStatusProps) {
if (trackedDownloadState === 'importing') {
title += ` - ${translate('Importing')}`;
iconKind = kinds.PRIMARY;
iconKind = kinds.PURPLE;
}
if (trackedDownloadState === 'failedPending') {

View File

@@ -56,8 +56,6 @@ function CustomFiltersModalContent(props) {
{translate('AddCustomFilter')}
</Button>
</div>
<br />
{translate('FilterMoviePropertiesOnlyNotFileWarning')}
</ModalBody>
<ModalFooter>

View File

@@ -26,10 +26,6 @@
color: var(--warningColor);
}
.primary {
color: var(--primaryColor);
}
.purple {
color: var(--purple);
}

View File

@@ -6,7 +6,6 @@ interface CssExports {
'disabled': string;
'info': string;
'pink': string;
'primary': string;
'purple': string;
'success': string;
'warning': string;

View File

@@ -284,7 +284,7 @@ const MovieIndex = withScrollPosition((props: MovieIndexProps) => {
/>
<MovieIndexSelectAllButton
label={translate('SelectAll')}
label="SelectAll"
isSelectMode={isSelectMode}
overflowComponent={MovieIndexSelectAllMenuItem}
/>

View File

@@ -100,7 +100,7 @@ function ImportList({
<TagList tags={tags} tagList={tagList} />
<div className={styles.enabled}>
<Label kind={kinds.DEFAULT} title={translate('ListRefreshInterval')}>
<Label kind={kinds.DEFAULT} title="List Refresh Interval">
{`${translate('Refresh')}: ${formatShortTimeSpan(
minRefreshInterval
)}`}

View File

@@ -68,8 +68,7 @@ namespace NzbDrone.Core.Test.Languages
new object[] { 53, Language.Tagalog },
new object[] { 54, Language.Urdu },
new object[] { 55, Language.Romansh },
new object[] { 56, Language.Mongolian },
new object[] { 57, Language.Georgian }
new object[] { 56, Language.Mongolian }
};
public static object[] ToIntCases =
@@ -132,8 +131,7 @@ namespace NzbDrone.Core.Test.Languages
new object[] { Language.Tagalog, 53 },
new object[] { Language.Urdu, 54 },
new object[] { Language.Romansh, 55 },
new object[] { Language.Mongolian, 56 },
new object[] { Language.Georgian, 57 }
new object[] { Language.Mongolian, 56 }
};
[Test]

View File

@@ -407,8 +407,6 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests
[TestCase("nor", "NO")]
[TestCase("khk", "MN")]
[TestCase("mvf", "MN")]
[TestCase("geo", "KA")]
[TestCase("kat", "KA")]
public void should_format_languagecodes_properly(string language, string code)
{
_namingConfig.StandardMovieFormat = "{Movie.Title}.{MEDIAINFO.FULL}";

View File

@@ -119,15 +119,5 @@ namespace NzbDrone.Core.Test.ParserTests
var result = IsoLanguages.Find(isoCode);
result.Language.Should().Be(Language.Bengali);
}
[TestCase("ka")]
[TestCase("geo")]
[TestCase("kat")]
[TestCase("ka-GE")]
public void should_return_georgian(string isoCode)
{
var result = IsoLanguages.Find(isoCode);
result.Language.Should().Be(Language.Georgian);
}
}
}

View File

@@ -521,16 +521,6 @@ namespace NzbDrone.Core.Test.ParserTests
result.Should().Contain(Language.Mongolian);
}
[TestCase("Movie.Title.1994.Georgian.WEB-DL.h264")]
[TestCase("Movie.Title.2016.Geo.WEB-DL.h264")]
[TestCase("Movie.Title.2016.KA.WEB-DL.h264")]
[TestCase("Movie.Title.2016.RU-KA.WEB-DL.h264")]
public void should_parse_language_georgian(string postTitle)
{
var result = LanguageParser.ParseLanguages(postTitle);
result.Should().Contain(Language.Georgian);
}
[TestCase("Movie.Title.en.sub")]
[TestCase("Movie Title.eng.sub")]
[TestCase("Movie.Title.eng.forced.sub")]

View File

@@ -280,7 +280,6 @@ namespace NzbDrone.Core.Extras.Metadata.Consumers.Xbmc
{
var setElement = new XElement("set");
setElement.SetAttributeValue("tmdbcolid", movie.MovieMetadata.Value.CollectionTmdbId);
setElement.Add(new XElement("name", movie.MovieMetadata.Value.CollectionTitle));
setElement.Add(new XElement("overview"));

View File

@@ -75,8 +75,6 @@ namespace NzbDrone.Core.ImportLists.TMDb
[FieldOption(Hint = "Raeto-Romance")]
rm,
[FieldOption(Hint = "Mongolian")]
mn,
[FieldOption(Hint = "Georgian")]
ka
mn
}
}

View File

@@ -127,7 +127,6 @@ namespace NzbDrone.Core.Languages
public static Language Urdu => new Language(54, "Urdu");
public static Language Romansh => new Language(55, "Romansh");
public static Language Mongolian => new Language(56, "Mongolian");
public static Language Georgian => new Language(57, "Georgian");
public static Language Any => new Language(-1, "Any");
public static Language Original => new Language(-2, "Original");
@@ -194,7 +193,6 @@ namespace NzbDrone.Core.Languages
Urdu,
Romansh,
Mongolian,
Georgian,
Any,
Original
};

View File

@@ -1204,19 +1204,5 @@
"IndexerHDBitsSettingsCategories": "Категории",
"IndexerHDBitsSettingsMediums": "Среден",
"IndexerSettingsCategories": "Категории",
"ReleaseProfile": "Профил за издания",
"CinemaRelease": "Пуснат по кината",
"BlocklistedAt": "Блокиран на {date}",
"Complete": "Завърши",
"DeleteSelected": "Изтрийте избраните",
"CollectionShowDetailsHelpText": "Покажи статуса и свойствата на колекцията",
"AutoTaggingSpecificationStudio": "Студио(я)",
"Completed": "Завършено",
"DelayMinutes": "{delay} Минути",
"Category": "Категория",
"AutoTaggingSpecificationKeyword": "Ключова(и) дума(и)",
"ChangeCategory": "Промени категорията",
"DefaultNotFoundMessage": "Трябва да сте се изгубили, няма какво да видите тук.",
"ClearBlocklist": "Изчисти списъка с блокирани",
"CountMissingMoviesFromLibrary": "Липсващи филми от библеотеката : {count}"
"ReleaseProfile": "Профил за издания"
}

View File

@@ -46,7 +46,7 @@
"DeleteRestrictionHelpText": "Opravdu chcete toto omezení smazat?",
"DeleteTagMessageText": "Opravdu chcete smazat značku „{0}“?",
"DetailedProgressBar": "Podrobný ukazatel průběhu",
"Discord": "Discord",
"Discord": "Svár",
"DownloadClients": "Stáhnout klienty",
"DownloadClientsSettingsSummary": "Stahování klientů, zpracování stahování a mapování vzdálených cest",
"DownloadPropersAndRepacks": "Sponzoři a přebalení",
@@ -190,7 +190,7 @@
"DeleteCustomFormat": "Odstranit vlastní formát",
"DeletedMovieDescription": "Film byl odstraněn z TMDb",
"DeleteMovieFolder": "Odstranit složku filmu",
"DockerUpdater": "Pro získání aktualizace je třeba aktualizovat docker kontejner",
"DockerUpdater": "aktualizujte kontejner dockeru, abyste aktualizaci obdrželi",
"AddToDownloadQueue": "Přidat stahování do fronty",
"AfterManualRefresh": "Po manuálním obnovení",
"AllFiles": "Všechny soubory",
@@ -347,12 +347,12 @@
"Local": "Místní",
"ManualImport": "Ruční import",
"MarkAsFailed": "Označit jako neúspěšné",
"MaximumSizeHelpText": "Maximální velikost vydání, která se mají stahovat v MB. Nula znamená bez omezení",
"MaximumSizeHelpText": "Maximální velikost uvolnění, která se má zachytit v MB. Nastavit na nulu nastavit na neomezený",
"Mechanism": "Mechanismus",
"MediaInfo": "Informace o médiích",
"MediaManagement": "Správa médií",
"MediaManagementSettings": "Nastavení správy médií",
"MediaManagementSettingsSummary": "Nastavení jmenné konvence a správy souborů",
"MediaManagementSettingsSummary": "Nastavení pojmenování a správy souborů",
"Hostname": "Název hostitele",
"Missing": "Chybějící",
"Month": "Měsíc",
@@ -436,7 +436,7 @@
"RestartRequiredHelpTextWarning": "Vyžaduje restart, aby se projevilo",
"Restore": "Obnovit",
"RestoreBackup": "Obnovit zálohu",
"RootFolder": "Kořenová složka",
"RootFolder": "Kořenový adresář",
"RootFolderCheckMultipleMessage": "Chybí více kořenových složek: {rootFolderPaths}",
"SendAnonymousUsageData": "Odesílejte anonymní údaje o používání",
"FileBrowserPlaceholderText": "Začněte psát nebo vyberte cestu níže",
@@ -495,7 +495,7 @@
"CustomFormatsSettingsSummary": "Vlastní formáty a nastavení",
"CustomFormatUnknownConditionOption": "Neznámá možnost „{key}“ pro podmínku „{implementation}“",
"Cutoff": "Odříznout",
"UpgradeUntilMovieHelpText": "Jakmile stažený film dosáhne nebo překročí nastavenou kvalitu, {appName} nebude dále stahovat další vydání",
"UpgradeUntilMovieHelpText": "Jakmile je této kvality dosaženo, {appName} již nebude stahovat filmy",
"CutoffUnmet": "Mezní hodnota nesplněna",
"Days": "Dny",
"Debug": "Ladit",
@@ -503,7 +503,7 @@
"DefaultDelayProfileMovie": "Toto je výchozí profil. Platí pro všechny filmy, které nemají explicitní profil.",
"DelayProfile": "Zpožděný profil",
"DelayProfiles": "Profily zpoždění",
"Delete": "Smazat",
"Delete": "Vymazat",
"DeleteBackupMessageText": "Opravdu chcete odstranit zálohu '{name}'?",
"Deleted": "Smazáno",
"DeleteDelayProfile": "Smazat profil zpoždění",
@@ -649,7 +649,7 @@
"LinkHere": "tady",
"Links": "Odkazy",
"ImportLists": "Seznamy",
"ImportListSettings": "Nastavení seznamu pro import",
"ImportListSettings": "Nastavení seznamu",
"ListSyncLevelHelpText": "Filmy v knihovně budou zpracovány na základě vašeho výběru, pokud vypadnou nebo se neobjeví na vašich seznamech",
"LogFiles": "Záznam souborů",
"Logging": "Protokolování",
@@ -836,7 +836,7 @@
"SourcePath": "Cesta zdroje",
"SourceRelativePath": "Cesta relativního zdroje",
"SourceTitle": "Název zdroje",
"SslCertPassword": "Heslo SSL Certifikátu",
"SslCertPassword": "Heslo SSL Cert",
"SslCertPasswordHelpText": "Heslo pro soubor pfx",
"SslCertPath": "Cesta certifikátu SSL",
"SslCertPathHelpText": "Cesta k souboru pfx",
@@ -979,7 +979,7 @@
"DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
"DeleteFormatMessageText": "Opravdu chcete smazat značku formátu {0}?",
"RemoveSelectedItemQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?",
"RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {selectedCount} položek z fronty?",
"RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {selectedCount} položky z fronty?",
"ApplyTagsHelpTextAdd": "Přidat: Přidat štítky do existujícího seznamu štítků",
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít štítky na vybrané indexery",
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané štítky",
@@ -1037,7 +1037,7 @@
"CollectionShowPostersHelpText": "Zobrazit plakáty položek v kolekci",
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude potřeba ho znovu načíst.",
"CountDownloadClientsSelected": "{count} klientů ke stahování vybráno",
"CountDownloadClientsSelected": "{count} vybraných klientů pro stahování",
"DefaultNameCopiedProfile": "{name} - Kopírovat",
"DefaultNameCopiedSpecification": "{name} - Kopírovat",
"DelayingDownloadUntil": "Odložení stahování do {date} v {time}",
@@ -1078,7 +1078,7 @@
"CountImportListsSelected": "{count} vybraných seznamů pro import",
"CollectionShowDetailsHelpText": "Zobrazit stav a vlastnosti kolekce",
"AutoTaggingNegateHelpText": "Pokud je zaškrtnuto, pravidlo automatického označování se nepoužije, pokud odpovídá této podmínce {implementationName}.",
"DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorie {appName}. Je doporučeno toto třídění vypnout, abyste se vyhli případným problémům s importem.",
"DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorii {appName}. Ve svém klientovi pro stahování byste měli třídění zakázat, abyste se vyhnuli problémům s importem.",
"EditSelectedImportLists": "Upravit vybrané seznamy k importu",
"EditSelectedIndexers": "Upravit vybrané indexery",
"DisabledForLocalAddresses": "Zakázáno pro místní adresy",
@@ -1278,7 +1278,7 @@
"CutoffUnmetLoadError": "Chybné načítání nesplněných položek",
"CutoffUnmetNoItems": "Žádné neodpovídající nesplněné položky",
"ClickToChangeIndexerFlags": "Kliknutím změníte značky indexeru",
"RecycleBinUnableToWriteHealthCheck": "Nelze zapisovat do nakonfigurované složky koše: {path}. Ujistěte se, že tato cesta existuje a že do ní může zapisovat uživatel, pod kterým běží {appName}",
"RecycleBinUnableToWriteHealthCheck": "Nelze zapisovat do nakonfigurované složky koše: {path}. Ujistěte se, že tato cesta existuje a že do ní může zapisovat uživatel se spuštěnou {appName}",
"AutoTaggingSpecificationMaximumYear": "Maximální Rok",
"AutoTaggingSpecificationMinimumYear": "Minimální Rok",
"ChangeCategoryHint": "Změní stahování do kategorie „Post-Import“ z aplikace Download Client",
@@ -1367,24 +1367,5 @@
"CloneImportList": "Klonovat seznam Importu",
"DefaultNameCopiedImportList": "{name} - Kopírovat",
"ReleaseProfile": "profil vydání",
"NotificationsPushcutSettingsIncludePoster": "Zahrnout plakát",
"RemotePathMappingCheckFilesLocalWrongOSPath": "Lokální klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Zkontrolujte nastavení klienta pro stahování.",
"RemotePathMappingCheckLocalWrongOSPath": "Lokální klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka v {osName} neexistuje. Ověřte nastavení klienta pro stahování.",
"TaskUserAgentTooltip": "User-Agent je poskytován aplikací, která volá API",
"RemotePathMappingCheckFilesGenericPermissions": "Klient pro stahování {downloadClientName} hlásí soubory v {path}, ale {appName} tento adresář nevidí. Možná je nutné upravit práva této složky.",
"RemotePathMappingCheckGenericPermissions": "Klient pro stahování {downloadClientName} ukládá soubory do {path}, ale {appName} tento adresář nevidí. Možná je nutné upravit práva této složky.",
"RemotePathMappingCheckFileRemoved": "Soubor {path} byl smazán v průběhu zpracování.",
"RemotePathMappingCheckWrongOSPath": "Vzdálený klient pro stahování {downloadClientName}ukládá stažené soubory do {path}, ale toto není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"Loading": "Načítání",
"NotificationsEmbySettingsSendNotificationsHelpText": "Nechat Emby poslat notifikace nastaveným poskytovatelům. Nefunguje s Jellyfin.",
"RemotePathMappingCheckImportFailed": "{appName} nemohl importovat film. Detaily naleznete v logu.",
"RemotePathMappingCheckBadDockerPath": "Používáte docker; klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale to není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"RemotePathMappingCheckFolderPermissions": "{appName} vidí, ale nemůže přistupovat do adresáře stahování {path}. Pravděpodobně jde o chybně nastavené oprávnění.{appName}.",
"RemotePathMappingCheckLocalFolderMissing": "Vzdálený klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka neexistuje. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"IndexerJackettAll": "Indexery, které používají nepodporovaný Jackett endpoint 'all': {indexerNames}",
"RemotePathMappingCheckFilesWrongOSPath": "Vzdálený klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Zkontrolujte mapování vzdálených cest a nastavení klienta pro stahování.",
"RemotePathMappingCheckFilesBadDockerPath": "Používáte docker; klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"RemotePathMappingCheckDockerFolderMissing": "Používáte docker; klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka v tomto konejneru neexistuje. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
"RemotePathMappingsInfo": "Mapování vzdálených cest je potřeba pouze ve výjimečných případech. Pokud {appName} a klient pro stahování je na stejném systému, je lepší cesty tak, aby byly všude stejné. Více informací naleznete na [wiki]({wikiLink}).",
"RemotePathMappingCheckRemoteDownloadClient": "Vzdálený klient pro stahování {downloadClientName} hlásí soubory v {path}, ale vypadá to, že taková složka neexistuje. Pravděpodobně chybí nastavení mapování vzdálených cest."
"NotificationsPushcutSettingsIncludePoster": "Zahrnout plakát"
}

View File

@@ -698,7 +698,6 @@
"FilterNotInNext": "not in the next",
"FilterStartsWith": "starts with",
"Filters": "Filters",
"FilterMoviePropertiesOnlyNotFileWarning": "Filters are available only for the properties of a movie, they are not available for properties of the file(s) you may have for that movie.",
"FirstDayOfWeek": "First Day of Week",
"Fixed": "Fixed",
"Folder": "Folder",
@@ -2038,4 +2037,4 @@
"Yesterday": "Yesterday",
"YesterdayAt": "Yesterday at {time}",
"YouCanAlsoSearch": "You can also search using TMDb ID or IMDb ID of a movie. e.g. `tmdb:71663`"
}
}

View File

@@ -416,7 +416,7 @@
"PrioritySettings": "Приоритет: {priority}",
"Priority": "Приоритет",
"PreviewRenameHelpText": "Совет: для предварительного просмотра переименования ... выберите \"Отмена\", затем щелкните название любого фильма и используйте",
"PreviewRename": ереименовать предпросмотр",
"PreviewRename": "Предпросмотр\nпереименования",
"Presets": "Пресеты",
"PreferUsenet": "Предпочитать Usenet",
"PreferTorrent": "Предпочитать торрент",
@@ -1290,7 +1290,7 @@
"DownloadClientNzbgetValidationKeepHistoryOverMax": "Для параметра NzbGet KeepHistory должно быть меньше 25000",
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Загружать первые и последние части сначала (qBittorrent 4.1.0+)",
"DownloadClientRTorrentSettingsDirectoryHelpText": "Необязательное место для сохранения загрузок, оставьте поле пустым, чтобы использовать расположение rTorrent по умолчанию",
"DownloadClientQbittorrentTorrentStateStalled": "Загрузка не активна, т.к. нет соединений",
"DownloadClientQbittorrentTorrentStateStalled": "Загрузка останавливается без подключения",
"DownloadClientSabnzbdValidationUnknownVersion": "Неизвестная версия: {rawVersion}",
"DownloadClientSettingsInitialState": "Начальное состояние",
"DownloadClientValidationUnableToConnect": "Невозможно подключиться к {clientName}",

View File

@@ -1782,7 +1782,7 @@
"DeleteMovieFolderMovieCount": "{size} boyutunda {movieFileCount} film dosyası",
"NotificationsPlexSettingsServer": "Sunucu",
"NotificationsPlexSettingsServerHelpText": "Kimlik doğrulamasından sonra plex.tv hesabından sunucuyu seçin",
"UnableToImportAutomatically": "Otomatik Olarak İçe Aktarılamıyor",
"UnableToImportAutomatically": "Otomatikman İçe Aktarılamıyor",
"ShowTags": "Etiketleri göster",
"ShowTagsHelpText": "Etiketleri posterin altında göster",
"Any": "Herhangi",

View File

@@ -65,8 +65,7 @@ namespace NzbDrone.Core.Parser
new IsoLanguage("tl", "", "tgl", "Tagalog", Language.Tagalog),
new IsoLanguage("ur", "", "urd", "Urdu", Language.Urdu),
new IsoLanguage("rm", "", "roh", "Romansh", Language.Romansh),
new IsoLanguage("mn", "", "mon", "Mongolian", Language.Mongolian),
new IsoLanguage("ka", "", "kat", "Georgian", Language.Georgian)
new IsoLanguage("mn", "", "mon", "Mongolian", Language.Mongolian)
};
private static readonly Dictionary<string, Language> AlternateIsoCodeMappings = new ()

View File

@@ -40,7 +40,6 @@ namespace NzbDrone.Core.Parser
(?<urdu>\burdu\b)|
(?<romansh>\b(?:romansh|rumantsch|romansch)\b)|
(?<mongolian>\b(?:mongolian|khalkha)\b)|
(?<georgian>\b(?:georgian|geo|ka|kat)\b)|
(?<original>\b(?:orig|original)\b)",
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
@@ -439,11 +438,6 @@ namespace NzbDrone.Core.Parser
languages.Add(Language.Mongolian);
}
if (match.Groups["georgian"].Success)
{
languages.Add(Language.Georgian);
}
if (match.Groups["original"].Success)
{
languages.Add(Language.Original);