1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-10-03 22:57:18 +02:00

Use named tokens in frontend translate function

This commit is contained in:
Bogdan 2023-08-13 20:07:25 +03:00
parent 82de5d6f9a
commit dd614ac005
32 changed files with 85 additions and 79 deletions

View File

@ -35,7 +35,7 @@ function QueueDetails(props) {
<Icon <Icon
name={icons.DOWNLOAD} name={icons.DOWNLOAD}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('ImportFailedInterp', [errorMessage])} title={translate('ImportFailedInterp', { errorMessage })}
/> />
); );
} }
@ -76,7 +76,7 @@ function QueueDetails(props) {
<Icon <Icon
name={icons.DOWNLOADING} name={icons.DOWNLOADING}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DownloadFailedInterp', [errorMessage])} title={translate('DownloadFailedInterp', { errorMessage })}
/> />
); );
} }

View File

@ -107,14 +107,14 @@ function QueueStatusCell(props) {
iconName = icons.DOWNLOADING; iconName = icons.DOWNLOADING;
iconKind = kinds.WARNING; iconKind = kinds.WARNING;
const warningMessage = errorMessage || translate('CheckDownloadClientForDetails'); const warningMessage = errorMessage || translate('CheckDownloadClientForDetails');
title = translate('DownloadWarning', [warningMessage]); title = translate('DownloadWarning', { warningMessage });
} }
if (hasError) { if (hasError) {
if (status === 'completed') { if (status === 'completed') {
iconName = icons.DOWNLOAD; iconName = icons.DOWNLOAD;
iconKind = kinds.DANGER; iconKind = kinds.DANGER;
title = translate('ImportFailed', [sourceTitle]); title = translate('ImportFailed', { sourceTitle });
} else { } else {
iconName = icons.DOWNLOADING; iconName = icons.DOWNLOADING;
iconKind = kinds.DANGER; iconKind = kinds.DANGER;

View File

@ -88,12 +88,12 @@ class RemoveQueueItemModal extends Component {
onModalClose={this.onModalClose} onModalClose={this.onModalClose}
> >
<ModalHeader> <ModalHeader>
{translate('Remove')} - {sourceTitle} {translate('RemoveQueueItem', { sourceTitle })}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
<div> <div>
{translate('RemoveFromQueueText', [sourceTitle])} {translate('RemoveQueueItemConfirmation', { sourceTitle })}
</div> </div>
{ {

View File

@ -94,7 +94,7 @@ class RemoveQueueItemsModal extends Component {
<ModalBody> <ModalBody>
<div className={styles.message}> <div className={styles.message}>
{selectedCount > 1 ? translate('RemoveSelectedItemsQueueMessageText', selectedCount) : translate('RemoveSelectedItemQueueMessageText')} {selectedCount > 1 ? translate('RemoveSelectedItemsQueueMessageText', { selectedCount }) : translate('RemoveSelectedItemQueueMessageText')}
</div> </div>
{ {

View File

@ -155,7 +155,7 @@ class AddNewMovie extends Component {
!isFetching && !error && !items.length && !!term && !isFetching && !error && !items.length && !!term &&
<div className={styles.message}> <div className={styles.message}>
<div className={styles.noResults}> <div className={styles.noResults}>
{translate('CouldNotFindResults', [term])} {translate('CouldNotFindResults', { term })}
</div> </div>
<div> <div>
{translate('YouCanAlsoSearch')} {translate('YouCanAlsoSearch')}

View File

@ -119,7 +119,7 @@ class ImportMovie extends Component {
rootFoldersPopulated && rootFoldersPopulated &&
!unmappedFolders.length ? !unmappedFolders.length ?
<Alert kind={kinds.INFO}> <Alert kind={kinds.INFO}>
{translate('AllMoviesInPathHaveBeenImported', [path])} {translate('AllMoviesInPathHaveBeenImported', { path })}
</Alert> : </Alert> :
null null
} }

View File

@ -215,7 +215,7 @@ class DiscoverMovieFooter extends Component {
<div className={styles.buttonContainer}> <div className={styles.buttonContainer}>
<div className={styles.buttonContainerContent}> <div className={styles.buttonContainerContent}>
<DiscoverMovieFooterLabel <DiscoverMovieFooterLabel
label={translate('MoviesSelectedInterp', [selectedCount])} label={translate('MoviesSelectedInterp', { count: selectedCount })}
isSaving={false} isSaving={false}
/> />

View File

@ -117,7 +117,7 @@ class DeleteMovieModalContent extends Component {
deleteFiles && deleteFiles &&
<div className={styles.deleteFilesMessage}> <div className={styles.deleteFilesMessage}>
<div> <div>
{translate('DeleteTheMovieFolder', [path])} {translate('DeleteTheMovieFolder', { path })}
</div> </div>
{ {

View File

@ -212,7 +212,7 @@ function EditMoviesModalContent(props: EditMoviesModalContentProps) {
<ModalFooter className={styles.modalFooter}> <ModalFooter className={styles.modalFooter}>
<div className={styles.selected}> <div className={styles.selected}>
{translate('MoviesSelectedInterp', [selectedCount])} {translate('MoviesSelectedInterp', { count: selectedCount })}
</div> </div>
<div> <div>

View File

@ -191,7 +191,7 @@ function MovieIndexSelectFooter() {
</div> </div>
<div className={styles.selected}> <div className={styles.selected}>
{translate('MoviesSelectedInterp', [selectedCount])} {translate('MoviesSelectedInterp', { count: selectedCount })}
</div> </div>
<EditMoviesModal <EditMoviesModal

View File

@ -65,7 +65,7 @@ function OrganizeMoviesModalContent(props: OrganizeMoviesModalContentProps) {
</Alert> </Alert>
<div className={styles.message}> <div className={styles.message}>
{translate('OrganizeConfirm', [movieTitles.length])} {translate('OrganizeConfirm', { count: movieTitles.length })}
</div> </div>
<ul> <ul>

View File

@ -83,7 +83,7 @@ function RootFolderRow(props: RootFolderRowProps) {
isOpen={isDeleteModalOpen} isOpen={isDeleteModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteRootFolder')} title={translate('DeleteRootFolder')}
message={translate('DeleteRootFolderMessageText', [path])} message={translate('DeleteRootFolderMessageText', { path })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={onDeleteModalClose} onCancel={onDeleteModalClose}

View File

@ -152,7 +152,7 @@ class CustomFormat extends Component {
isOpen={this.state.isDeleteCustomFormatModalOpen} isOpen={this.state.isDeleteCustomFormatModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteCustomFormat')} title={translate('DeleteCustomFormat')}
message={translate('DeleteCustomFormatMessageText', [name])} message={translate('DeleteCustomFormatMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
isSpinning={isDeleting} isSpinning={isDeleting}
onConfirm={this.onConfirmDeleteCustomFormat} onConfirm={this.onConfirmDeleteCustomFormat}

View File

@ -115,7 +115,7 @@ class Specification extends Component {
isOpen={this.state.isDeleteSpecificationModalOpen} isOpen={this.state.isDeleteSpecificationModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteCondition')} title={translate('DeleteCondition')}
message={translate('DeleteConditionMessageText', [name])} message={translate('DeleteConditionMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteSpecification} onConfirm={this.onConfirmDeleteSpecification}
onCancel={this.onDeleteSpecificationModalClose} onCancel={this.onDeleteSpecificationModalClose}

View File

@ -92,7 +92,7 @@ class DownloadClient extends Component {
kind={kinds.DISABLED} kind={kinds.DISABLED}
outline={true} outline={true}
> >
{translate('PrioritySettings', [priority])} {translate('PrioritySettings', { priority })}
</Label> </Label>
} }
</div> </div>
@ -113,7 +113,7 @@ class DownloadClient extends Component {
isOpen={this.state.isDeleteDownloadClientModalOpen} isOpen={this.state.isDeleteDownloadClientModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteDownloadClient')} title={translate('DeleteDownloadClient')}
message={translate('DeleteDownloadClientMessageText', [name])} message={translate('DeleteDownloadClientMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteDownloadClient} onConfirm={this.onConfirmDeleteDownloadClient}
onCancel={this.onDeleteDownloadClientModalClose} onCancel={this.onDeleteDownloadClientModalClose}

View File

@ -180,7 +180,7 @@ function ManageDownloadClientsEditModalContent(
<ModalFooter className={styles.modalFooter}> <ModalFooter className={styles.modalFooter}>
<div className={styles.selected}> <div className={styles.selected}>
{translate('CountDownloadClientsSelected', [selectedCount])} {translate('CountDownloadClientsSelected', { count: selectedCount })}
</div> </div>
<div> <div>

View File

@ -286,9 +286,9 @@ function ManageDownloadClientsModalContent(
isOpen={isDeleteModalOpen} isOpen={isDeleteModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteSelectedDownloadClients')} title={translate('DeleteSelectedDownloadClients')}
message={translate('DeleteSelectedDownloadClientsMessageText', [ message={translate('DeleteSelectedDownloadClientsMessageText', {
selectedIds.length, count: selectedIds.length,
])} })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={onDeleteModalClose} onCancel={onDeleteModalClose}

View File

@ -114,8 +114,8 @@ class ImportList extends Component {
<ConfirmModal <ConfirmModal
isOpen={this.state.isDeleteImportListModalOpen} isOpen={this.state.isDeleteImportListModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteList')} title={translate('DeleteImportList')}
message={translate('DeleteListMessageText', [name])} message={translate('DeleteImportListMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteImportList} onConfirm={this.onConfirmDeleteImportList}
onCancel={this.onDeleteImportListModalClose} onCancel={this.onDeleteImportListModalClose}

View File

@ -152,7 +152,9 @@ function ManageImportListsEditModalContent(
<ModalFooter className={styles.modalFooter}> <ModalFooter className={styles.modalFooter}>
<div className={styles.selected}> <div className={styles.selected}>
{translate('CountImportListsSelected', [selectedCount])} {translate('CountImportListsSelected', {
count: selectedCount,
})}
</div> </div>
<div> <div>

View File

@ -277,9 +277,9 @@ function ManageImportListsModalContent(
isOpen={isDeleteModalOpen} isOpen={isDeleteModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteSelectedImportLists')} title={translate('DeleteSelectedImportLists')}
message={translate('DeleteSelectedImportListsMessageText', [ message={translate('DeleteSelectedImportListsMessageText', {
selectedIds.length, count: selectedIds.length,
])} })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={onDeleteModalClose} onCancel={onDeleteModalClose}

View File

@ -152,7 +152,7 @@ class Indexer extends Component {
isOpen={this.state.isDeleteIndexerModalOpen} isOpen={this.state.isDeleteIndexerModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteIndexer')} title={translate('DeleteIndexer')}
message={translate('DeleteIndexerMessageText', [name])} message={translate('DeleteIndexerMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteIndexer} onConfirm={this.onConfirmDeleteIndexer}
onCancel={this.onDeleteIndexerModalClose} onCancel={this.onDeleteIndexerModalClose}

View File

@ -178,7 +178,7 @@ function ManageIndexersEditModalContent(
<ModalFooter className={styles.modalFooter}> <ModalFooter className={styles.modalFooter}>
<div className={styles.selected}> <div className={styles.selected}>
{translate('CountIndexersSelected', [selectedCount])} {translate('CountIndexersSelected', { count: selectedCount })}
</div> </div>
<div> <div>

View File

@ -281,9 +281,9 @@ function ManageIndexersModalContent(props: ManageIndexersModalContentProps) {
isOpen={isDeleteModalOpen} isOpen={isDeleteModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteSelectedIndexers')} title={translate('DeleteSelectedIndexers')}
message={translate('DeleteSelectedIndexersMessageText', [ message={translate('DeleteSelectedIndexersMessageText', {
selectedIds.length, count: selectedIds.length,
])} })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}
onCancel={onDeleteModalClose} onCancel={onDeleteModalClose}

View File

@ -217,7 +217,7 @@ class Notification extends Component {
isOpen={this.state.isDeleteNotificationModalOpen} isOpen={this.state.isDeleteNotificationModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteNotification')} title={translate('DeleteNotification')}
message={translate('DeleteNotificationMessageText', [name])} message={translate('DeleteNotificationMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteNotification} onConfirm={this.onConfirmDeleteNotification}
onCancel={this.onDeleteNotificationModalClose} onCancel={this.onDeleteNotificationModalClose}

View File

@ -162,7 +162,7 @@ class QualityProfile extends Component {
isOpen={this.state.isDeleteQualityProfileModalOpen} isOpen={this.state.isDeleteQualityProfileModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteQualityProfile')} title={translate('DeleteQualityProfile')}
message={translate('QualityProfileDeleteConfirm', [name])} message={translate('DeleteQualityProfileMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
isSpinning={isDeleting} isSpinning={isDeleting}
onConfirm={this.onConfirmDeleteQualityProfile} onConfirm={this.onConfirmDeleteQualityProfile}

View File

@ -114,7 +114,7 @@ export default function AutoTagging(props) {
isOpen={isDeleteModalOpen} isOpen={isDeleteModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteAutoTag')} title={translate('DeleteAutoTag')}
message={translate('DeleteAutoTagHelpText', [name])} message={translate('DeleteAutoTagHelpText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
isSpinning={isDeleting} isSpinning={isDeleting}
onConfirm={onConfirmDelete} onConfirm={onConfirmDelete}

View File

@ -32,7 +32,7 @@ function TagDetailsModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{translate('TagDetails', [label])} {translate('TagDetails', { label })}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@ -164,7 +164,7 @@ class Tag extends Component {
isOpen={isDeleteTagModalOpen} isOpen={isDeleteTagModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteTag')} title={translate('DeleteTag')}
message={translate('DeleteTagMessageText', [label])} message={translate('DeleteTagMessageText', { label })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteTag} onConfirm={this.onConfirmDeleteTag}
onCancel={this.onDeleteTagModalClose} onCancel={this.onDeleteTagModalClose}

View File

@ -138,7 +138,7 @@ class BackupRow extends Component {
isOpen={isConfirmDeleteModalOpen} isOpen={isConfirmDeleteModalOpen}
kind={kinds.DANGER} kind={kinds.DANGER}
title={translate('DeleteBackup')} title={translate('DeleteBackup')}
message={translate('DeleteBackupMessageText', [name])} message={translate('DeleteBackupMessageText', { name })}
confirmLabel={translate('Delete')} confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeletePress} onConfirm={this.onConfirmDeletePress}
onCancel={this.onConfirmDeleteModalClose} onCancel={this.onConfirmDeleteModalClose}

View File

@ -146,7 +146,7 @@ class RestoreBackupModalContent extends Component {
<ModalBody> <ModalBody>
{ {
!!id && translate('WouldYouLikeToRestoreBackup', [name]) !!id && translate('WouldYouLikeToRestoreBackup', { name })
} }
{ {

View File

@ -25,14 +25,19 @@ export async function fetchTranslations(): Promise<boolean> {
export default function translate( export default function translate(
key: string, key: string,
args?: (string | number | boolean)[] tokens?: Record<string, string | number | boolean>
) { ) {
const translation = translations[key] || key; const translation = translations[key] || key;
if (args) { if (tokens) {
return translation.replace(/\{(\d+)\}/g, (match, index) => { // Fallback to the old behaviour for translations not yet updated to use named tokens
return String(args[index]) ?? match; Object.values(tokens).forEach((value, index) => {
tokens[index] = value;
}); });
return translation.replace(/\{([a-z0-9]+?)\}/gi, (match, tokenMatch) =>
String(tokens[tokenMatch] ?? match)
);
} }
return translation; return translation;

View File

@ -37,7 +37,7 @@
"AllCollectionsHiddenDueToFilter": "All collections are hidden due to applied filter.", "AllCollectionsHiddenDueToFilter": "All collections are hidden due to applied filter.",
"AllFiles": "All Files", "AllFiles": "All Files",
"AllMoviesHiddenDueToFilter": "All movies are hidden due to applied filter.", "AllMoviesHiddenDueToFilter": "All movies are hidden due to applied filter.",
"AllMoviesInPathHaveBeenImported": "All movies in {0} have been imported", "AllMoviesInPathHaveBeenImported": "All movies in {path} have been imported",
"AllResultsHiddenFilter": "All results are hidden by the applied filter", "AllResultsHiddenFilter": "All results are hidden by the applied filter",
"AllTitles": "All Titles", "AllTitles": "All Titles",
"AllowHardcodedSubs": "Allow Hardcoded Subs", "AllowHardcodedSubs": "Allow Hardcoded Subs",
@ -171,10 +171,10 @@
"CopyUsingHardlinksHelpText": "Hardlinks allow Radarr to import seeding torrents to the movie folder without taking extra disk space or copying the entire contents of the file. Hardlinks will only work if the source and destination are on the same volume", "CopyUsingHardlinksHelpText": "Hardlinks allow Radarr to import seeding torrents to the movie folder without taking extra disk space or copying the entire contents of the file. Hardlinks will only work if the source and destination are on the same volume",
"CopyUsingHardlinksHelpTextWarning": "Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Radarr's rename function as a work around.", "CopyUsingHardlinksHelpTextWarning": "Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Radarr's rename function as a work around.",
"CouldNotConnectSignalR": "Could not connect to SignalR, UI won't update", "CouldNotConnectSignalR": "Could not connect to SignalR, UI won't update",
"CouldNotFindResults": "Couldn't find any results for '{0}'", "CouldNotFindResults": "Couldn't find any results for '{term}'",
"CountDownloadClientsSelected": "{0} download client(s) selected", "CountDownloadClientsSelected": "{count} download client(s) selected",
"CountImportListsSelected": "{0} import list(s) selected", "CountImportListsSelected": "{count} import list(s) selected",
"CountIndexersSelected": "{0} indexer(s) selected", "CountIndexersSelected": "{count} indexer(s) selected",
"CreateEmptyMovieFolders": "Create empty movie folders", "CreateEmptyMovieFolders": "Create empty movie folders",
"CreateEmptyMovieFoldersHelpText": "Create missing movie folders during disk scan", "CreateEmptyMovieFoldersHelpText": "Create missing movie folders during disk scan",
"CreateGroup": "Create group", "CreateGroup": "Create group",
@ -209,17 +209,17 @@
"DelayingDownloadUntilInterp": "Delaying download until {0} at {1}", "DelayingDownloadUntilInterp": "Delaying download until {0} at {1}",
"Delete": "Delete", "Delete": "Delete",
"DeleteAutoTag": "Delete Auto Tag", "DeleteAutoTag": "Delete Auto Tag",
"DeleteAutoTagHelpText": "Are you sure you want to delete the auto tag '{0}'?", "DeleteAutoTagHelpText": "Are you sure you want to delete the auto tag '{name}'?",
"DeleteBackup": "Delete Backup", "DeleteBackup": "Delete Backup",
"DeleteBackupMessageText": "Are you sure you want to delete the backup '{0}'?", "DeleteBackupMessageText": "Are you sure you want to delete the backup '{name}'?",
"DeleteCondition": "Delete Condition", "DeleteCondition": "Delete Condition",
"DeleteConditionMessageText": "Are you sure you want to delete the condition '{0}'?", "DeleteConditionMessageText": "Are you sure you want to delete the condition '{name}'?",
"DeleteCustomFormat": "Delete Custom Format", "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 '{name}'?",
"DeleteDelayProfile": "Delete Delay Profile", "DeleteDelayProfile": "Delete Delay Profile",
"DeleteDelayProfileMessageText": "Are you sure you want to delete this delay profile?", "DeleteDelayProfileMessageText": "Are you sure you want to delete this delay profile?",
"DeleteDownloadClient": "Delete Download Client", "DeleteDownloadClient": "Delete Download Client",
"DeleteDownloadClientMessageText": "Are you sure you want to delete the download client '{0}'?", "DeleteDownloadClientMessageText": "Are you sure you want to delete the download client '{name}'?",
"DeleteEmptyFolders": "Delete empty folders", "DeleteEmptyFolders": "Delete empty folders",
"DeleteEmptyFoldersHelpText": "Delete empty movie folders during disk scan and when movie files are deleted", "DeleteEmptyFoldersHelpText": "Delete empty movie folders during disk scan and when movie files are deleted",
"DeleteFile": "Delete file", "DeleteFile": "Delete file",
@ -228,37 +228,36 @@
"DeleteFilesLabel": "Delete {0} Movie Files", "DeleteFilesLabel": "Delete {0} Movie Files",
"DeleteFormatMessageText": "Are you sure you want to delete format tag {0} ?", "DeleteFormatMessageText": "Are you sure you want to delete format tag {0} ?",
"DeleteHeader": "Delete - {0}", "DeleteHeader": "Delete - {0}",
"DeleteImportList": "Delete Import List",
"DeleteImportListExclusion": "Delete Import List Exclusion", "DeleteImportListExclusion": "Delete Import List Exclusion",
"DeleteImportListExclusionMessageText": "Are you sure you want to delete this import list exclusion?", "DeleteImportListExclusionMessageText": "Are you sure you want to delete this import list exclusion?",
"DeleteImportListMessageText": "Are you sure you want to delete the list '{name}'?",
"DeleteIndexer": "Delete Indexer", "DeleteIndexer": "Delete Indexer",
"DeleteIndexerMessageText": "Are you sure you want to delete the indexer '{0}'?", "DeleteIndexerMessageText": "Are you sure you want to delete the indexer '{name}'?",
"DeleteIndexers": "Delete Indexer(s)",
"DeleteIndexersMessageText": "Are you sure you want to delete {0} indexers(s)?",
"DeleteList": "Delete List",
"DeleteListMessageText": "Are you sure you want to delete the list '{0}'?",
"DeleteMovieFolderHelpText": "Delete the movie folder and its contents", "DeleteMovieFolderHelpText": "Delete the movie folder and its contents",
"DeleteMovieFolderLabel": "Delete Movie Folder", "DeleteMovieFolderLabel": "Delete Movie Folder",
"DeleteNotification": "Delete Notification", "DeleteNotification": "Delete Notification",
"DeleteNotificationMessageText": "Are you sure you want to delete the notification '{0}'?", "DeleteNotificationMessageText": "Are you sure you want to delete the notification '{name}'?",
"DeleteQualityProfile": "Delete Quality Profile", "DeleteQualityProfile": "Delete Quality Profile",
"DeleteQualityProfileMessageText": "Are you sure you want to delete the quality profile '{name}'?",
"DeleteRemotePathMapping": "Delete Remote Path Mapping", "DeleteRemotePathMapping": "Delete Remote Path Mapping",
"DeleteRemotePathMappingMessageText": "Are you sure you want to delete this remote path mapping?", "DeleteRemotePathMappingMessageText": "Are you sure you want to delete this remote path mapping?",
"DeleteRestriction": "Delete Restriction", "DeleteRestriction": "Delete Restriction",
"DeleteRestrictionHelpText": "Are you sure you want to delete this restriction?", "DeleteRestrictionHelpText": "Are you sure you want to delete this restriction?",
"DeleteRootFolder": "Delete Root Folder", "DeleteRootFolder": "Delete Root Folder",
"DeleteRootFolderMessageText": "Are you sure you want to delete the root folder '{0}'?", "DeleteRootFolderMessageText": "Are you sure you want to delete the root folder '{path}'?",
"DeleteSelectedDownloadClients": "Delete Download Client(s)", "DeleteSelectedDownloadClients": "Delete Download Client(s)",
"DeleteSelectedDownloadClientsMessageText": "Are you sure you want to delete {0} selected download client(s)?", "DeleteSelectedDownloadClientsMessageText": "Are you sure you want to delete {count} selected download client(s)?",
"DeleteSelectedImportLists": "Delete Import List(s)", "DeleteSelectedImportLists": "Delete Import List(s)",
"DeleteSelectedImportListsMessageText": "Are you sure you want to delete {0} selected import list(s)?", "DeleteSelectedImportListsMessageText": "Are you sure you want to delete {count} selected import list(s)?",
"DeleteSelectedIndexers": "Delete Indexer(s)", "DeleteSelectedIndexers": "Delete Indexer(s)",
"DeleteSelectedIndexersMessageText": "Are you sure you want to delete {0} selected indexer(s)?", "DeleteSelectedIndexersMessageText": "Are you sure you want to delete {count} selected indexer(s)?",
"DeleteSelectedMovie": "Delete Selected Movie(s)", "DeleteSelectedMovie": "Delete Selected Movie(s)",
"DeleteSelectedMovieFiles": "Delete Selected Movie Files", "DeleteSelectedMovieFiles": "Delete Selected Movie Files",
"DeleteSelectedMovieFilesMessage": "Are you sure you want to delete the selected movie files?", "DeleteSelectedMovieFilesMessage": "Are you sure you want to delete the selected movie files?",
"DeleteTag": "Delete Tag", "DeleteTag": "Delete Tag",
"DeleteTagMessageText": "Are you sure you want to delete the tag '{0}'?", "DeleteTagMessageText": "Are you sure you want to delete the tag '{label}'?",
"DeleteTheMovieFolder": "The movie folder '{0}' and all its content will be deleted.", "DeleteTheMovieFolder": "The movie folder '{path}' and all its content will be deleted.",
"Deleted": "Deleted", "Deleted": "Deleted",
"DeletedMsg": "Movie was deleted from TMDb", "DeletedMsg": "Movie was deleted from TMDb",
"DestinationPath": "Destination Path", "DestinationPath": "Destination Path",
@ -293,12 +292,12 @@
"DownloadClientsSettingsSummary": "Download clients, download handling and remote path mappings", "DownloadClientsSettingsSummary": "Download clients, download handling and remote path mappings",
"DownloadFailed": "Download failed", "DownloadFailed": "Download failed",
"DownloadFailedCheckDownloadClientForMoreDetails": "Download failed: check download client for more details", "DownloadFailedCheckDownloadClientForMoreDetails": "Download failed: check download client for more details",
"DownloadFailedInterp": "Download failed: {0}", "DownloadFailedInterp": "Download failed: {errorMessage}",
"DownloadPropersAndRepacks": "Propers and Repacks", "DownloadPropersAndRepacks": "Propers and Repacks",
"DownloadPropersAndRepacksHelpText1": "Whether or not to automatically upgrade to Propers/Repacks", "DownloadPropersAndRepacksHelpText1": "Whether or not to automatically upgrade to Propers/Repacks",
"DownloadPropersAndRepacksHelpText2": "Use 'Do not Prefer' to sort by custom format score over Propers/Repacks", "DownloadPropersAndRepacksHelpText2": "Use 'Do not Prefer' to sort by custom format score over Propers/Repacks",
"DownloadPropersAndRepacksHelpTextWarning": "Use custom formats for automatic upgrades to Propers/Repacks", "DownloadPropersAndRepacksHelpTextWarning": "Use custom formats for automatic upgrades to Propers/Repacks",
"DownloadWarning": "Download warning: {0}", "DownloadWarning": "Download warning: {warningMessage}",
"DownloadWarningCheckDownloadClientForMoreDetails": "Download warning: check download client for more details", "DownloadWarningCheckDownloadClientForMoreDetails": "Download warning: check download client for more details",
"Downloaded": "Downloaded", "Downloaded": "Downloaded",
"DownloadedAndMonitored": "Downloaded (Monitored)", "DownloadedAndMonitored": "Downloaded (Monitored)",
@ -441,8 +440,8 @@
"ImportExistingMovies": "Import Existing Movies", "ImportExistingMovies": "Import Existing Movies",
"ImportExtraFiles": "Import Extra Files", "ImportExtraFiles": "Import Extra Files",
"ImportExtraFilesHelpText": "Import matching extra files (subtitles, nfo, etc) after importing an movie file", "ImportExtraFilesHelpText": "Import matching extra files (subtitles, nfo, etc) after importing an movie file",
"ImportFailed": "Import failed: {0}", "ImportFailed": "Import failed: {sourceTitle}",
"ImportFailedInterp": "Import failed: {0}", "ImportFailedInterp": "Import failed: {errorMessage}",
"ImportHeader": "Import an existing organized library to add movies to Radarr", "ImportHeader": "Import an existing organized library to add movies to Radarr",
"ImportIncludeQuality": "Make sure that your files include the quality in their filenames. e.g. {0}", "ImportIncludeQuality": "Make sure that your files include the quality in their filenames. e.g. {0}",
"ImportLibrary": "Library Import", "ImportLibrary": "Library Import",
@ -650,7 +649,7 @@
"MovieYear": "Movie Year", "MovieYear": "Movie Year",
"MovieYearHelpText": "The year of the movie to exclude", "MovieYearHelpText": "The year of the movie to exclude",
"Movies": "Movies", "Movies": "Movies",
"MoviesSelectedInterp": "{0} Movie(s) Selected", "MoviesSelectedInterp": "{count} Movie(s) Selected",
"MultiLanguage": "Multi-Language", "MultiLanguage": "Multi-Language",
"MustContain": "Must Contain", "MustContain": "Must Contain",
"MustNotContain": "Must Not Contain", "MustNotContain": "Must Not Contain",
@ -726,7 +725,7 @@
"Options": "Options", "Options": "Options",
"Organize": "Organize", "Organize": "Organize",
"OrganizeAndRename": "Organize & Rename", "OrganizeAndRename": "Organize & Rename",
"OrganizeConfirm": "Are you sure you want to organize all files in the {0} selected movie(s)?", "OrganizeConfirm": "Are you sure you want to organize all files in the {count} selected movie(s)?",
"OrganizeModalAllPathsRelative": "All paths are relative to:", "OrganizeModalAllPathsRelative": "All paths are relative to:",
"OrganizeModalDisabled": "Renaming is disabled, nothing to rename", "OrganizeModalDisabled": "Renaming is disabled, nothing to rename",
"OrganizeModalNamingPattern": "Naming Pattern:", "OrganizeModalNamingPattern": "Naming Pattern:",
@ -772,7 +771,7 @@
"PreviewRenameHelpText": "Tip: To preview a rename... select 'Cancel' then click any movie title and use the", "PreviewRenameHelpText": "Tip: To preview a rename... select 'Cancel' then click any movie title and use the",
"Priority": "Priority", "Priority": "Priority",
"PriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.", "PriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.",
"PrioritySettings": "Priority: {0}", "PrioritySettings": "Priority: {priority}",
"ProcessingFolders": "Processing Folders", "ProcessingFolders": "Processing Folders",
"Profiles": "Profiles", "Profiles": "Profiles",
"ProfilesSettingsSummary": "Quality, Language and Delay profiles", "ProfilesSettingsSummary": "Quality, Language and Delay profiles",
@ -798,7 +797,6 @@
"QualityLimitsHelpText": "Limits are automatically adjusted for the movie runtime.", "QualityLimitsHelpText": "Limits are automatically adjusted for the movie runtime.",
"QualityOrLangCutoffHasNotBeenMet": "Quality or Language cutoff has not been met", "QualityOrLangCutoffHasNotBeenMet": "Quality or Language cutoff has not been met",
"QualityProfile": "Quality Profile", "QualityProfile": "Quality Profile",
"QualityProfileDeleteConfirm": "Are you sure you want to delete the quality profile {0}",
"QualityProfileInUse": "Can't delete a quality profile that is attached to a movie, list, or collection", "QualityProfileInUse": "Can't delete a quality profile that is attached to a movie, list, or collection",
"QualityProfiles": "Quality Profiles", "QualityProfiles": "Quality Profiles",
"QualitySettings": "Quality Settings", "QualitySettings": "Quality Settings",
@ -885,17 +883,18 @@
"RemoveFromBlocklist": "Remove from blocklist", "RemoveFromBlocklist": "Remove from blocklist",
"RemoveFromDownloadClient": "Remove From Download Client", "RemoveFromDownloadClient": "Remove From Download Client",
"RemoveFromQueue": "Remove from queue", "RemoveFromQueue": "Remove from queue",
"RemoveFromQueueText": "Are you sure you want to remove {0} from the queue?",
"RemoveHelpTextWarning": "Removing will remove the download and the file(s) from the download client.", "RemoveHelpTextWarning": "Removing will remove the download and the file(s) from the download client.",
"RemoveMovieAndDeleteFiles": "Remove Movie and Delete Files", "RemoveMovieAndDeleteFiles": "Remove Movie and Delete Files",
"RemoveMovieAndKeepFiles": "Remove Movie and Keep Files", "RemoveMovieAndKeepFiles": "Remove Movie and Keep Files",
"RemoveQueueItem": "Remove - {sourceTitle}",
"RemoveQueueItemConfirmation": "Are you sure you want to remove '{sourceTitle}' from the queue?",
"RemoveRootFolder": "Remove root folder", "RemoveRootFolder": "Remove root folder",
"RemoveSelected": "Remove Selected", "RemoveSelected": "Remove Selected",
"RemoveSelectedItem": "Remove Selected Item", "RemoveSelectedItem": "Remove Selected Item",
"RemoveSelectedItemBlocklistMessageText": "Are you sure you want to remove the selected items from the blocklist?", "RemoveSelectedItemBlocklistMessageText": "Are you sure you want to remove the selected items from the blocklist?",
"RemoveSelectedItemQueueMessageText": "Are you sure you want to remove 1 item from the queue?", "RemoveSelectedItemQueueMessageText": "Are you sure you want to remove 1 item from the queue?",
"RemoveSelectedItems": "Remove Selected Items", "RemoveSelectedItems": "Remove Selected Items",
"RemoveSelectedItemsQueueMessageText": "Are you sure you want to remove {0} items from the queue?", "RemoveSelectedItemsQueueMessageText": "Are you sure you want to remove {selectedCount} items from the queue?",
"RemoveTagsAutomatically": "Remove Tags Automatically", "RemoveTagsAutomatically": "Remove Tags Automatically",
"RemoveTagsAutomaticallyHelpText": "Remove tags automatically if conditions are not met", "RemoveTagsAutomaticallyHelpText": "Remove tags automatically if conditions are not met",
"RemovedFromTaskQueue": "Removed from task queue", "RemovedFromTaskQueue": "Removed from task queue",
@ -1089,7 +1088,7 @@
"TableOptions": "Table Options", "TableOptions": "Table Options",
"TableOptionsColumnsMessage": "Choose which columns are visible and which order they appear in", "TableOptionsColumnsMessage": "Choose which columns are visible and which order they appear in",
"TagCannotBeDeletedWhileInUse": "Cannot be deleted while in use", "TagCannotBeDeletedWhileInUse": "Cannot be deleted while in use",
"TagDetails": "Tag Details - {0}", "TagDetails": "Tag Details - {label}",
"TagIsNotUsedAndCanBeDeleted": "Tag is not used and can be deleted", "TagIsNotUsedAndCanBeDeleted": "Tag is not used and can be deleted",
"Tags": "Tags", "Tags": "Tags",
"TagsHelpText": "Applies to movies with at least one matching tag", "TagsHelpText": "Applies to movies with at least one matching tag",
@ -1238,7 +1237,7 @@
"WhitelistedHardcodedSubsHelpText": "Subtitle tags set here will not be considered hardcoded", "WhitelistedHardcodedSubsHelpText": "Subtitle tags set here will not be considered hardcoded",
"WhitelistedSubtitleTags": "Whitelisted Subtitle Tags", "WhitelistedSubtitleTags": "Whitelisted Subtitle Tags",
"Wiki": "Wiki", "Wiki": "Wiki",
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup {0} ?", "WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?",
"Year": "Year", "Year": "Year",
"YesCancel": "Yes, Cancel", "YesCancel": "Yes, Cancel",
"YesMoveFiles": "Yes, Move the Files", "YesMoveFiles": "Yes, Move the Files",