From 93e8ff0ac7610fa8739f2e577ece98c2c06c8881 Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Thu, 20 Jul 2023 03:19:43 +0200 Subject: [PATCH] Translate System pages --- frontend/src/System/Backup/BackupRow.js | 18 +-- frontend/src/System/Backup/Backups.js | 23 ++-- .../Backup/RestoreBackupModalContent.js | 25 ++-- frontend/src/System/Events/LogsTable.js | 11 +- .../System/Events/LogsTableDetailsModal.js | 13 ++- frontend/src/System/Logs/Files/LogFiles.js | 25 ++-- .../System/Logs/Files/LogFilesConnector.js | 3 +- .../src/System/Logs/Files/LogFilesTableRow.js | 3 +- frontend/src/System/Logs/LogsNavMenu.js | 5 +- frontend/src/System/Status/About/About.js | 28 +++-- .../src/System/Status/DiskSpace/DiskSpace.js | 15 ++- frontend/src/System/Status/Health/Health.js | 27 +++-- .../src/System/Status/MoreInfo/MoreInfo.js | 39 +++++-- frontend/src/System/Status/Status.js | 3 +- .../src/System/Tasks/Queued/QueuedTaskRow.js | 15 +-- .../src/System/Tasks/Queued/QueuedTasks.js | 23 +++- .../System/Tasks/Scheduled/ScheduledTasks.js | 23 +++- frontend/src/System/Tasks/Tasks.js | 3 +- frontend/src/System/Updates/Updates.js | 33 +++--- src/NzbDrone.Core/Localization/Core/en.json | 110 ++++++++++++++++-- 20 files changed, 319 insertions(+), 126 deletions(-) diff --git a/frontend/src/System/Backup/BackupRow.js b/frontend/src/System/Backup/BackupRow.js index ca36b98dc..ad63544e3 100644 --- a/frontend/src/System/Backup/BackupRow.js +++ b/frontend/src/System/Backup/BackupRow.js @@ -9,6 +9,7 @@ import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRow from 'Components/Table/TableRow'; import { icons, kinds } from 'Helpers/Props'; import formatBytes from 'Utilities/Number/formatBytes'; +import translate from 'Utilities/String/translate'; import RestoreBackupModalConnector from './RestoreBackupModalConnector'; import styles from './BackupRow.css'; @@ -75,14 +76,14 @@ class BackupRow extends Component { } = this.state; let iconClassName = icons.SCHEDULED; - let iconTooltip = 'Scheduled'; + let iconTooltip = translate('Scheduled'); if (type === 'manual') { iconClassName = icons.INTERACTIVE; - iconTooltip = 'Manual'; + iconTooltip = translate('Manual'); } else if (type === 'update') { iconClassName = icons.UPDATE; - iconTooltip = 'Before update'; + iconTooltip = translate('BeforeUpdate'); } return ( @@ -115,12 +116,13 @@ class BackupRow extends Component { @@ -136,9 +138,11 @@ class BackupRow extends Component { diff --git a/frontend/src/System/Backup/Backups.js b/frontend/src/System/Backup/Backups.js index c4adfbf50..fa78dd769 100644 --- a/frontend/src/System/Backup/Backups.js +++ b/frontend/src/System/Backup/Backups.js @@ -10,6 +10,7 @@ import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import { icons, kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import BackupRow from './BackupRow'; import RestoreBackupModalConnector from './RestoreBackupModalConnector'; @@ -20,17 +21,23 @@ const columns = [ }, { name: 'name', - label: 'Name', + get label() { + return translate('Name'); + }, isVisible: true }, { name: 'size', - label: 'Size', + get label() { + return translate('Size'); + }, isVisible: true }, { name: 'time', - label: 'Time', + get label() { + return translate('Time'); + }, isVisible: true }, { @@ -81,18 +88,18 @@ class Backups extends Component { const noBackups = isPopulated && !items.length; return ( - + @@ -108,14 +115,14 @@ class Backups extends Component { { !isFetching && !!error && - Unable to load backups + {translate('UnableToLoadBackups')} } { noBackups && - No backups are available + {translate('NoBackupsAreAvailable')} } diff --git a/frontend/src/System/Backup/RestoreBackupModalContent.js b/frontend/src/System/Backup/RestoreBackupModalContent.js index 71bd5a3b9..9b5daa9f4 100644 --- a/frontend/src/System/Backup/RestoreBackupModalContent.js +++ b/frontend/src/System/Backup/RestoreBackupModalContent.js @@ -9,11 +9,12 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { icons, kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import styles from './RestoreBackupModalContent.css'; function getErrorMessage(error) { if (!error || !error.responseJSON || !error.responseJSON.message) { - return 'Error restoring backup'; + return translate('ErrorRestoringBackup'); } return error.responseJSON.message; @@ -145,7 +146,9 @@ class RestoreBackupModalContent extends Component { { - !!id && `Would you like to restore the backup '${name}'?` + !!id && translate('WouldYouLikeToRestoreBackup', { + name + }) } { @@ -167,7 +170,9 @@ class RestoreBackupModalContent extends Component { /> -
Restore
+
+ {translate('Restore')} +
@@ -178,7 +183,9 @@ class RestoreBackupModalContent extends Component { />
-
Restart
+
+ {translate('Restart')} +
@@ -189,18 +196,20 @@ class RestoreBackupModalContent extends Component { />
-
Reload
+
+ {translate('Reload')} +
- Note: Sonarr will automatically restart and reload the UI during the restore process. + {translate('RestartReloadNote')}
- Restore + {translate('Restore')}
diff --git a/frontend/src/System/Events/LogsTable.js b/frontend/src/System/Events/LogsTable.js index 5d4bc8513..1c37a03ba 100644 --- a/frontend/src/System/Events/LogsTable.js +++ b/frontend/src/System/Events/LogsTable.js @@ -13,6 +13,7 @@ import TableBody from 'Components/Table/TableBody'; import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper'; import TablePager from 'Components/Table/TablePager'; import { align, icons, kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import LogsTableRow from './LogsTableRow'; function LogsTable(props) { @@ -33,11 +34,11 @@ function LogsTable(props) { } = props; return ( - + @@ -83,7 +84,7 @@ function LogsTable(props) { { isPopulated && !error && !items.length && - No events found + {translate('NoEventsFound')} } diff --git a/frontend/src/System/Events/LogsTableDetailsModal.js b/frontend/src/System/Events/LogsTableDetailsModal.js index c3681220d..13329f17b 100644 --- a/frontend/src/System/Events/LogsTableDetailsModal.js +++ b/frontend/src/System/Events/LogsTableDetailsModal.js @@ -8,6 +8,7 @@ import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import Scroller from 'Components/Scroller/Scroller'; import { scrollDirections } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import styles from './LogsTableDetailsModal.css'; function LogsTableDetailsModal(props) { @@ -27,11 +28,13 @@ function LogsTableDetailsModal(props) { onModalClose={onModalClose} > - Details + {translate('Details')} -
Message
+
+ {translate('Message')} +
-
Exception
+
+ {translate('Exception')} +
diff --git a/frontend/src/System/Logs/Files/LogFiles.js b/frontend/src/System/Logs/Files/LogFiles.js index 3d7f708aa..23b3bb40e 100644 --- a/frontend/src/System/Logs/Files/LogFiles.js +++ b/frontend/src/System/Logs/Files/LogFiles.js @@ -1,7 +1,6 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import Alert from 'Components/Alert'; -import Link from 'Components/Link/Link'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; @@ -12,18 +11,24 @@ import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import { icons, kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; +import InlineMarkdown from '../../../Components/Markdown/InlineMarkdown'; import LogsNavMenu from '../LogsNavMenu'; import LogFilesTableRow from './LogFilesTableRow'; const columns = [ { name: 'filename', - label: 'Filename', + get label() { + return translate('Filename'); + }, isVisible: true }, { name: 'lastWriteTime', - label: 'Last Write Time', + get label() { + return translate('LastWriteTime'); + }, isVisible: true }, { @@ -50,7 +55,7 @@ class LogFiles extends Component { } = this.props; return ( - + @@ -58,7 +63,7 @@ class LogFiles extends Component {
- Log files are located in: {location} + {translate('LogFilesLocation', { + location + })}
{ currentLogView === 'Log Files' &&
- The log level defaults to 'Info' and can be changed in General Settings +
}
@@ -118,7 +125,7 @@ class LogFiles extends Component { { !isFetching && !items.length && - No log files + {translate('NoLogFiles')} } diff --git a/frontend/src/System/Logs/Files/LogFilesConnector.js b/frontend/src/System/Logs/Files/LogFilesConnector.js index 98a55f32f..75921f346 100644 --- a/frontend/src/System/Logs/Files/LogFilesConnector.js +++ b/frontend/src/System/Logs/Files/LogFilesConnector.js @@ -7,6 +7,7 @@ import { executeCommand } from 'Store/Actions/commandActions'; import { fetchLogFiles } from 'Store/Actions/systemActions'; import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector'; import combinePath from 'Utilities/String/combinePath'; +import translate from 'Utilities/String/translate'; import LogFiles from './LogFiles'; function createMapStateToProps() { @@ -29,7 +30,7 @@ function createMapStateToProps() { isFetching, items, deleteFilesExecuting, - currentLogView: 'Log Files', + currentLogView: translate('LogFiles'), location: combinePath(isWindows, appData, ['logs']) }; } diff --git a/frontend/src/System/Logs/Files/LogFilesTableRow.js b/frontend/src/System/Logs/Files/LogFilesTableRow.js index ef08ada4e..ba0339b84 100644 --- a/frontend/src/System/Logs/Files/LogFilesTableRow.js +++ b/frontend/src/System/Logs/Files/LogFilesTableRow.js @@ -4,6 +4,7 @@ import Link from 'Components/Link/Link'; import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector'; import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRow from 'Components/Table/TableRow'; +import translate from 'Utilities/String/translate'; import styles from './LogFilesTableRow.css'; class LogFilesTableRow extends Component { @@ -32,7 +33,7 @@ class LogFilesTableRow extends Component { target="_blank" noRouter={true} > - Download + {translate('Download')}
diff --git a/frontend/src/System/Logs/LogsNavMenu.js b/frontend/src/System/Logs/LogsNavMenu.js index cc485f270..923e4f41c 100644 --- a/frontend/src/System/Logs/LogsNavMenu.js +++ b/frontend/src/System/Logs/LogsNavMenu.js @@ -4,6 +4,7 @@ import Menu from 'Components/Menu/Menu'; import MenuButton from 'Components/Menu/MenuButton'; import MenuContent from 'Components/Menu/MenuContent'; import MenuItem from 'Components/Menu/MenuItem'; +import translate from 'Utilities/String/translate'; class LogsNavMenu extends Component { @@ -50,13 +51,13 @@ class LogsNavMenu extends Component { - Log Files + {translate('LogFiles')} - Updater Log Files + {translate('UpdaterLogFiles')} diff --git a/frontend/src/System/Status/About/About.js b/frontend/src/System/Status/About/About.js index f212ef947..b0b289135 100644 --- a/frontend/src/System/Status/About/About.js +++ b/frontend/src/System/Status/About/About.js @@ -5,6 +5,7 @@ import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem' import FieldSet from 'Components/FieldSet'; import InlineMarkdown from 'Components/Markdown/InlineMarkdown'; import titleCase from 'Utilities/String/titleCase'; +import translate from 'Utilities/String/translate'; import StartTime from './StartTime'; import styles from './About.css'; @@ -30,25 +31,32 @@ class About extends Component { } = this.props; return ( -
+
{ packageVersion && {packageVersion} {' by '} : packageVersion)} + title={translate('PackageVersion')} + data={(packageAuthor ? + : + packageVersion + )} /> } { isNetCore && } @@ -56,28 +64,28 @@ class About extends Component { { isDocker && } +
{ isFetching && diff --git a/frontend/src/System/Status/Health/Health.js b/frontend/src/System/Status/Health/Health.js index ee0689fe4..8c021ed66 100644 --- a/frontend/src/System/Status/Health/Health.js +++ b/frontend/src/System/Status/Health/Health.js @@ -11,6 +11,7 @@ import TableBody from 'Components/Table/TableBody'; import TableRow from 'Components/Table/TableRow'; import { icons, kinds } from 'Helpers/Props'; import titleCase from 'Utilities/String/titleCase'; +import translate from 'Utilities/String/translate'; import styles from './Health.css'; function getInternalLink(source) { @@ -23,7 +24,7 @@ function getInternalLink(source) { return ( ); @@ -33,7 +34,7 @@ function getInternalLink(source) { return ( ); @@ -41,7 +42,7 @@ function getInternalLink(source) { return ( ); @@ -49,7 +50,7 @@ function getInternalLink(source) { return ( ); @@ -64,7 +65,7 @@ function getTestLink(source, props) { return ( @@ -74,7 +75,7 @@ function getTestLink(source, props) { return ( @@ -93,12 +94,16 @@ const columns = [ }, { name: 'message', - label: 'Message', + get label() { + return translate('Message'); + }, isVisible: true }, { name: 'actions', - label: 'Actions', + get label() { + return translate('Actions'); + }, isVisible: true } ]; @@ -121,7 +126,7 @@ class Health extends Component {
- Health + {translate('Health')} { isFetching && isPopulated && @@ -141,7 +146,7 @@ class Health extends Component { { !healthIssues &&
- No issues with your configuration + {translate('NoIssuesWithYourConfiguration')}
} @@ -186,7 +191,7 @@ class Health extends Component { { diff --git a/frontend/src/System/Status/MoreInfo/MoreInfo.js b/frontend/src/System/Status/MoreInfo/MoreInfo.js index 490230413..53618d882 100644 --- a/frontend/src/System/Status/MoreInfo/MoreInfo.js +++ b/frontend/src/System/Status/MoreInfo/MoreInfo.js @@ -4,6 +4,7 @@ import DescriptionListItemDescription from 'Components/DescriptionList/Descripti import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionListItemTitle'; import FieldSet from 'Components/FieldSet'; import Link from 'Components/Link/Link'; +import translate from 'Utilities/String/translate'; class MoreInfo extends Component { @@ -12,34 +13,46 @@ class MoreInfo extends Component { render() { return ( -
+
- Home page + + {translate('HomePage')} + sonarr.tv - Wiki + + {translate('Wiki')} + wiki.servarr.com/sonarr - Forums + + {translate('Forums')} + forums.sonarr.tv - Twitter + + {translate('Twitter')} + @sonarrtv - Discord + + {translate('Discord')} + discord.sonarr.tv - IRC + + {translate('IRC')} + #sonarr on Libera @@ -47,17 +60,23 @@ class MoreInfo extends Component { Libera webchat - Donations + + {translate('Donations')} + sonarr.tv/donate - Source + + {translate('Source')} + github.com/Sonarr/Sonarr - Feature Requests + + {translate('FeatureRequests')} + forums.sonarr.tv diff --git a/frontend/src/System/Status/Status.js b/frontend/src/System/Status/Status.js index a325495e5..429a149ee 100644 --- a/frontend/src/System/Status/Status.js +++ b/frontend/src/System/Status/Status.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; +import translate from 'Utilities/String/translate'; import AboutConnector from './About/AboutConnector'; import DiskSpaceConnector from './DiskSpace/DiskSpaceConnector'; import HealthConnector from './Health/HealthConnector'; @@ -13,7 +14,7 @@ class Status extends Component { render() { return ( - + diff --git a/frontend/src/System/Tasks/Queued/QueuedTaskRow.js b/frontend/src/System/Tasks/Queued/QueuedTaskRow.js index 31015501d..8b8a62d3a 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTaskRow.js +++ b/frontend/src/System/Tasks/Queued/QueuedTaskRow.js @@ -11,6 +11,7 @@ import formatDate from 'Utilities/Date/formatDate'; import formatDateTime from 'Utilities/Date/formatDateTime'; import formatTimeSpan from 'Utilities/Date/formatTimeSpan'; import titleCase from 'Utilities/String/titleCase'; +import translate from 'Utilities/String/translate'; import styles from './QueuedTaskRow.css'; function getStatusIconProps(status, message) { @@ -198,8 +199,8 @@ class QueuedTaskRow extends Component { { clientUserAgent ? - - from: {clientUserAgent} + + {translate('From')}: {clientUserAgent} : null } @@ -236,7 +237,7 @@ class QueuedTaskRow extends Component { { status === 'queued' && @@ -246,10 +247,10 @@ class QueuedTaskRow extends Component { diff --git a/frontend/src/System/Tasks/Queued/QueuedTasks.js b/frontend/src/System/Tasks/Queued/QueuedTasks.js index e856df532..30301702c 100644 --- a/frontend/src/System/Tasks/Queued/QueuedTasks.js +++ b/frontend/src/System/Tasks/Queued/QueuedTasks.js @@ -4,6 +4,7 @@ import FieldSet from 'Components/FieldSet'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; +import translate from 'Utilities/String/translate'; import QueuedTaskRowConnector from './QueuedTaskRowConnector'; const columns = [ @@ -14,27 +15,37 @@ const columns = [ }, { name: 'commandName', - label: 'Name', + get label() { + return translate('Name'); + }, isVisible: true }, { name: 'queued', - label: 'Queued', + get label() { + return translate('Queued'); + }, isVisible: true }, { name: 'started', - label: 'Started', + get label() { + return translate('Started'); + }, isVisible: true }, { name: 'ended', - label: 'Ended', + get label() { + return translate('Ended'); + }, isVisible: true }, { name: 'duration', - label: 'Duration', + get label() { + return translate('Duration'); + }, isVisible: true }, { @@ -51,7 +62,7 @@ function QueuedTasks(props) { } = props; return ( -
+
{ isFetching && !isPopulated && diff --git a/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js b/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js index 1176db157..c1b17122d 100644 --- a/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js +++ b/frontend/src/System/Tasks/Scheduled/ScheduledTasks.js @@ -4,32 +4,43 @@ import FieldSet from 'Components/FieldSet'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; +import translate from 'Utilities/String/translate'; import ScheduledTaskRowConnector from './ScheduledTaskRowConnector'; const columns = [ { name: 'name', - label: 'Name', + get label() { + return translate('Name'); + }, isVisible: true }, { name: 'interval', - label: 'Interval', + get label() { + return translate('Interval'); + }, isVisible: true }, { name: 'lastExecution', - label: 'Last Execution', + get label() { + return translate('LastExecution'); + }, isVisible: true }, { name: 'lastDuration', - label: 'Last Duration', + get label() { + return translate('LastDuration'); + }, isVisible: true }, { name: 'nextExecution', - label: 'Next Execution', + get label() { + return translate('NextExecution'); + }, isVisible: true }, { @@ -46,7 +57,7 @@ function ScheduledTasks(props) { } = props; return ( -
+
{ isFetching && !isPopulated && diff --git a/frontend/src/System/Tasks/Tasks.js b/frontend/src/System/Tasks/Tasks.js index e08792145..032dbede8 100644 --- a/frontend/src/System/Tasks/Tasks.js +++ b/frontend/src/System/Tasks/Tasks.js @@ -1,12 +1,13 @@ import React from 'react'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; +import translate from 'Utilities/String/translate'; import QueuedTasksConnector from './Queued/QueuedTasksConnector'; import ScheduledTasksConnector from './Scheduled/ScheduledTasksConnector'; function Tasks() { return ( - + diff --git a/frontend/src/System/Updates/Updates.js b/frontend/src/System/Updates/Updates.js index cb032dd7f..bded2676d 100644 --- a/frontend/src/System/Updates/Updates.js +++ b/frontend/src/System/Updates/Updates.js @@ -12,6 +12,7 @@ import PageContentBody from 'Components/Page/PageContentBody'; import { icons, kinds } from 'Helpers/Props'; import formatDate from 'Utilities/Date/formatDate'; import formatDateTime from 'Utilities/Date/formatDateTime'; +import translate from 'Utilities/String/translate'; import UpdateChanges from './UpdateChanges'; import styles from './Updates.css'; @@ -43,15 +44,15 @@ class Updates extends Component { const hasUpdateToInstall = hasUpdates && _.some(items, { installable: true, latest: true }); const noUpdateToInstall = hasUpdates && !hasUpdateToInstall; - const externalUpdaterPrefix = 'Unable to update Sonarr directly,'; + const externalUpdaterPrefix = translate('UnableToUpdateSonarrDirectly'); const externalUpdaterMessages = { - external: 'Sonarr is configured to use an external update mechanism', - apt: 'use apt to install the update', - docker: 'update the docker container to receive the update' + external: translate('ExternalUpdater'), + apt: translate('AptUpdater'), + docker: translate('DockerUpdater') }; return ( - + { !isPopulated && !hasError && @@ -61,7 +62,7 @@ class Updates extends Component { { noUpdates && - No updates are available + {translate('NoUpdatesAreAvailable')} } @@ -76,7 +77,7 @@ class Updates extends Component { isSpinning={isInstallingUpdate} onPress={onInstallLatestPress} > - Install Latest + {translate('InstallLatest')} : @@ -112,7 +113,7 @@ class Updates extends Component { />
- The latest version of Sonarr is already installed + {translate('OnLatestVersion')}
{ @@ -164,7 +165,7 @@ class Updates extends Component { kind={kinds.SUCCESS} title={formatDateTime(update.installedOn, longDateFormat, timeFormat)} > - Currently Installed + {translate('CurrentlyInstalled')} : null } @@ -176,7 +177,7 @@ class Updates extends Component { kind={kinds.INVERSE} title={formatDateTime(update.installedOn, longDateFormat, timeFormat)} > - Previously Installed + {translate('PreviouslyInstalled')} : null } @@ -184,19 +185,21 @@ class Updates extends Component { { !hasChanges && -
Maintenance Release: See GitHub commit history for details.
+
+ {translate('MaintenanceRelease')} +
} { hasChanges &&
@@ -211,14 +214,14 @@ class Updates extends Component { { !!updatesError &&
- Failed to fetch updates + {translate('FailedToFetchUpdates')}
} { !!generalSettingsError &&
- Failed to update settings + {translate('FailedToUpdateSettings')}
}
diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index ea48be0ff..1a3eea420 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -1,13 +1,16 @@ { + "About": "About", "AbsoluteEpisodeNumbers": "Absolute Episode Number(s)", + "Actions": "Actions", "Activity": "Activity", "Add": "Add", - "AddNew": "Add New", "Added": "Added", "AddingTag": "Adding tag", + "AddNew": "Add New", "AirDate": "Air Date", "AllTitles": "All Titles", "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} 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", "Apply": "Apply", "ApplyChanges": "Apply Changes", @@ -20,9 +23,13 @@ "ApplyTagsHelpTextHowToApplySeries": "How to apply tags to the selected series", "ApplyTagsHelpTextRemove": "Remove: Remove the entered tags", "ApplyTagsHelpTextReplace": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)", + "AptUpdater": "Use apt to install the update", "AutoAdd": "Auto Add", "AutomaticAdd": "Automatic Add", "Backup": "Backup", + "BackupNow": "Backup Now", + "Backups": "Backups", + "BeforeUpdate": "Before update", "Blocklist": "Blocklist", "BlocklistRelease": "Blocklist Release", "BlocklistReleaseHelpText": "Prevents Sonarr from automatically grabbing this release again", @@ -30,6 +37,8 @@ "Browser Reload Required": "Browser Reload Required", "Calendar": "Calendar", "Cancel": "Cancel", + "CancelPendingTask": "Are you sure you want to cancel this pending task?", + "Clear": "Clear", "CloneCondition": "Clone Condition", "CloneCustomFormat": "Clone Custom Format", "Close": "Close", @@ -38,11 +47,14 @@ "CountImportListsSelected": "{count} import list(s) selected", "CountIndexersSelected": "{count} indexer(s) selected", "CountSeasons": "{count} seasons", - "CustomFormatScore": "Custom Format Score", + "CurrentlyInstalled": "Currently Installed", "CustomFormats": "Custom Formats", + "CustomFormatScore": "Custom Format Score", "CutoffUnmet": "Cutoff Unmet", "Daily": "Daily", "Delete": "Delete", + "DeleteBackup": "Delete Backup", + "DeleteBackupMessageText": "Are you sure you want to delete the backup '{name}'?", "DeleteCondition": "Delete Condition", "DeleteConditionMessageText": "Are you sure you want to delete the condition '{0}'?", "DeleteCustomFormat": "Delete Custom Format", @@ -55,39 +67,61 @@ "DeleteSelectedIndexersMessageText": "Are you sure you want to delete {count} selected indexer(s)?", "Details": "Details", "Disabled": "Disabled", + "Discord": "Discord", + "DiskSpace": "Disk Space", + "Docker": "Docker", + "DockerUpdater": "Update the docker container to receive the update", + "Donations": "Donations", + "DotNetVersion": ".NET", + "Download": "Download", "DownloadClientCheckNoneAvailableHealthCheckMessage": "No download client is available", "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Unable to communicate with {0}.", "DownloadClientRootFolderHealthCheckMessage": "Download client {0} places downloads in the root folder {1}. You should not download to a root folder.", + "DownloadClients": "Download Clients", "DownloadClientSortingHealthCheckMessage": "Download client {0} has {1} sorting enabled for Sonarr'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}", - "DownloadClients": "Download Clients", + "Duration": "Duration", "Edit": "Edit", "EditSelectedDownloadClients": "Edit Selected Download Clients", "EditSelectedImportLists": "Edit Selected Import Lists", "EditSelectedIndexers": "Edit Selected Indexers", "EditSeries": "Edit Series", "EnableAutomaticSearch": "Enable Automatic Search", + "Enabled": "Enabled", "EnableInteractiveSearch": "Enable Interactive Search", "EnableRSS": "Enable RSS", - "Enabled": "Enabled", "Ended": "Ended", "EpisodeInfo": "Episode Info", "EpisodeNumbers": "Episode Number(s)", + "ErrorRestoringBackup": "Error restoring backup", "Events": "Events", + "Exception": "Exception", "ExistingTag": "Existing tag", "ExportCustomFormat": "Export Custom Format", + "ExternalUpdater": "Sonarr is configured to use an external update mechanism", + "FailedToFetchUpdates": "Failed to fetch updates", + "FailedToUpdateSettings": "Failed to update settings", + "FeatureRequests": "Feature Requests", + "Filename": "Filename", + "Fixed": "Fixed", + "Forums": "Forums", + "FreeSpace": "Free Space", + "From": "From", "FullSeason": "Full Season", "General": "General", + "GeneralSettings": "General Settings", + "Health": "Health", "HiddenClickToShow": "Hidden, click to show", "HideAdvanced": "Hide Advanced", "History": "History", + "HomePage": "Home Page", "Implementation": "Implementation", "ImportListRootFolderMissingRootHealthCheckMessage": "Missing root folder for import list(s): {0}", "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Multiple root folders are missing for import lists: {0}", + "ImportLists": "Import Lists", "ImportListStatusAllUnavailableHealthCheckMessage": "All lists are unavailable due to failures", "ImportListStatusUnavailableHealthCheckMessage": "Lists unavailable due to failures: {0}", - "ImportLists": "Import Lists", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Enable Completed Download Handling if possible", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "Enable Completed Download Handling if possible (Multi-Computer unsupported)", "ImportMechanismHandlingDisabledHealthCheckMessage": "Enable Completed Download Handling", @@ -96,47 +130,74 @@ "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", "IndexerRssNoIndexersAvailableHealthCheckMessage": "All rss-capable indexers are temporarily unavailable due to recent indexer errors", "IndexerRssNoIndexersEnabledHealthCheckMessage": "No indexers available with RSS sync enabled, Sonarr will not grab new releases automatically", + "Indexers": "Indexers", "IndexerSearchNoAutomaticHealthCheckMessage": "No indexers available with Automatic Search enabled, Sonarr will not provide any automatic search results", "IndexerSearchNoAvailableIndexersHealthCheckMessage": "All search-capable indexers are temporarily unavailable due to recent indexer errors", "IndexerSearchNoInteractiveHealthCheckMessage": "No indexers available with Interactive Search enabled, Sonarr will not provide any interactive search results", "IndexerStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures", "IndexerStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures: {0}", - "Indexers": "Indexers", + "InstallLatest": "Install Latest", + "Interval": "Interval", + "IRC": "IRC", "Language": "Language", "Language that Sonarr will use for UI": "Language that Sonarr will use for UI", "Languages": "Languages", + "LastDuration": "Last Duration", + "LastExecution": "Last Execution", + "LastWriteTime": "Last Write Time", "LibraryImport": "Library Import", + "Location": "Location", "LogFiles": "Log Files", + "LogFilesLocation": "Log files are located in: {location}", + "Logs": "Logs", + "MaintenanceRelease": "Maintenance Release: bug fixes and other improvements. See Github Commit History for more details", "ManageClients": "Manage Clients", "ManageDownloadClients": "Manage Download Clients", "ManageImportLists": "Manage Import Lists", "ManageIndexers": "Manage Indexers", "ManageLists": "Manage Lists", + "Manual": "Manual", "MatchedToEpisodes": "Matched to Episodes", "MatchedToSeason": "Matched to Season", "MatchedToSeries": "Matched to Series", "MediaManagement": "Media Management", + "Message": "Message", "Metadata": "Metadata", "MetadataSource": "Metadata Source", "Missing": "Missing", + "Mode": "Mode", "Monitored": "Monitored", + "MoreInfo": "More Info", "MountHealthCheckMessage": "Mount containing a series path is mounted read-only: ", "MultiSeason": "Multi-Season", "Name": "Name", "Negated": "Negated", "Network": "Network", + "New": "New", "NextAiring": "Next Airing", + "NextExecution": "Next Execution", "No": "No", + "NoBackupsAreAvailable": "No backups are available", "NoChange": "No Change", "NoDownloadClientsFound": "No download clients found", + "NoEventsFound": "No events found", "NoImportListsFound": "No import lists found", "NoIndexersFound": "No indexers found", + "NoIssuesWithYourConfiguration": "No issues with your configuration", + "NoLeaveIt": "No, Leave It", + "NoLogFiles": "No log files", "NoSeasons": "No seasons", + "NoUpdatesAreAvailable": "No updates are available", "OneSeason": "1 season", + "OnLatestVersion": "The latest version of Radarr is already installed", + "Options": "Options", "OriginalLanguage": "Original Language", + "PackageVersion": "Package Version", + "PackageVersionInfo": "{packageVersion} by {packageAuthor}", "PartialSeason": "Partial Season", "Path": "Path", "PreviousAiring": "Previous Airing", + "PreviouslyInstalled": "Previously Installed", "Priority": "Priority", "Profiles": "Profiles", "Proper": "Proper", @@ -146,13 +207,17 @@ "Quality": "Quality", "QualityProfile": "Quality Profile", "Queue": "Queue", + "Queued": "Queued", + "ReadTheWikiForMoreInformation": "Read the Wiki for more information", "Real": "Real", "RecycleBinUnableToWriteHealthCheckMessage": "Unable to write to configured recycling bin folder: {0}. Ensure this path exists and is writable by the user running Sonarr", + "Refresh": "Refresh", "RefreshSeries": "Refresh Series", "Release": "Release", "ReleaseGroup": "Release Group", "ReleaseHash": "Release Hash", "ReleaseTitle": "Release Title", + "Reload": "Reload", "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": "Sonarr can see but not access downloaded episode {0}. Likely permissions error.", @@ -171,6 +236,9 @@ "Remove": "Remove", "RemoveCompleted": "Remove Completed", "RemoveCompletedDownloads": "Remove Completed Downloads", + "RemovedFromTaskQueue": "Removed from task queue", + "RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {0} were removed from TheTVDB", + "RemovedSeriesSingleRemovedHealthCheckMessage": "Series {0} was removed from TheTVDB", "RemoveFailed": "Remove Failed", "RemoveFailedDownloads": "Remove Failed Downloads", "RemoveFromDownloadClient": "Remove From Download Client", @@ -179,40 +247,62 @@ "RemoveSelectedItemQueueMessageText": "Are you sure you want to remove 1 item from the queue?", "RemoveSelectedItems": "Remove Selected Items", "RemoveSelectedItemsQueueMessageText": "Are you sure you want to remove {0} items from the queue?", - "RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {0} were removed from TheTVDB", - "RemovedSeriesSingleRemovedHealthCheckMessage": "Series {0} was removed from TheTVDB", "RemovingTag": "Removing tag", "Repack": "Repack", "Replace": "Replace", "Required": "Required", + "Restart": "Restart", + "RestartReloadNote": "Note: Sonarr will automatically restart and reload the UI during the restore process.", + "Restore": "Restore", + "RestoreBackup": "Restore Backup", "Result": "Result", "RootFolder": "Root Folder", "RootFolderMissingHealthCheckMessage": "Missing root folder: {0}", "RootFolderMultipleMissingHealthCheckMessage": "Multiple root folders are missing: {0}", + "Scheduled": "Scheduled", "SearchForMonitoredEpisodes": "Search for monitored episodes", "SeasonNumber": "Season Number", "Series": "Series", + "SeriesEditor": "Series Editor", "SeriesTitle": "Series Title", "SetTags": "Set Tags", "Settings": "Settings", "ShowAdvanced": "Show Advanced", "ShownClickToHide": "Shown, click to hide", + "Size": "Size", "SizeOnDisk": "Size on disk", + "Source": "Source", "Special": "Special", + "Started": "Started", + "StartupDirectory": "Startup directory", + "Status": "Status", "System": "System", "SystemTimeHealthCheckMessage": "System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected", "Tags": "Tags", "Tasks": "Tasks", + "TaskUserAgentTooltip": "User-Agent provided by the app that called the API", + "TestAll": "Test All", "TestParsing": "Test Parsing", + "TheLogLevelDefault": "The log level defaults to 'Info' and can be changed in [General Settings](/settings/general)", + "Time": "Time", + "TotalSpace": "Total Space", + "Twitter": "Twitter", "UI": "UI", "UI Language": "UI Language", + "UnableToLoadBackups": "Unable to load backups", + "UnableToUpdateSonarrDirectly": "Unable to update Sonarr directly,", "Unmonitored": "Unmonitored", "UpdateAvailableHealthCheckMessage": "New update is available", + "UpdaterLogFiles": "Updater Log Files", + "Updates": "Updates", "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}'.", - "Updates": "Updates", + "Uptime": "Uptime", "Version": "Version", "Wanted": "Wanted", - "Yes": "Yes" + "Wiki": "Wiki", + "WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?", + "Yes": "Yes", + "YesCancel": "Yes, Cancel" }