From 000ccf78ada513462f9c31fb98f73f579d46c4d7 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 3 Nov 2022 22:28:55 -0500 Subject: [PATCH] Translation Updates Fixes #3058 Fixes #2889 --- .../src/Album/Edit/EditAlbumModalContent.js | 4 +- frontend/src/AlbumStudio/AlbumStudio.js | 4 +- .../src/Artist/Edit/EditArtistModalContent.js | 4 +- .../AudioTags/RetagArtistModalContent.js | 5 +- .../Editor/Delete/DeleteArtistModalContent.js | 7 +- .../Organize/OrganizeArtistModalContent.js | 7 +- .../Artist/Editor/Tags/TagsModalContent.js | 10 +- .../History/ArtistHistoryModalContent.js | 12 +- .../FileBrowser/FileBrowserModalContent.js | 8 +- .../Builder/FilterBuilderModalContent.js | 9 +- .../CustomFiltersModalContent.js | 3 +- .../src/Components/Form/FormInputGroup.js | 3 +- frontend/src/Components/Form/PlaylistInput.js | 3 +- .../src/Components/Menu/FilterMenuContent.js | 3 +- .../Components/Page/Sidebar/PageSidebar.js | 65 +++---- .../Album/SelectAlbumModalContent.js | 10 +- .../SelectAlbumReleaseModalContent.js | 9 +- .../Artist/SelectArtistModalContent.js | 4 +- .../Confirmation/ConfirmImportModalContent.js | 7 +- ...teractiveImportSelectFolderModalContent.js | 13 +- .../InteractiveImportModalContent.js | 43 ++--- .../Quality/SelectQualityModalContent.js | 6 +- .../Track/SelectTrackModalContent.js | 13 +- .../InteractiveSearch/InteractiveSearch.js | 27 +-- .../Organize/OrganizePreviewModalContent.js | 4 +- .../src/Retag/RetagPreviewModalContent.js | 6 +- .../src/Settings/AdvancedSettingsButton.js | 2 +- .../DownloadClients/AddDownloadClientItem.js | 7 +- .../EditDownloadClientModalContent.js | 8 +- .../EditRemotePathMappingModalContent.js | 8 +- .../RemotePathMappings/RemotePathMappings.js | 12 +- .../EditImportListExclusionModalContent.js | 8 +- .../ImportLists/AddImportListItem.js | 7 +- .../ImportLists/EditImportListModalContent.js | 22 +-- .../Indexers/Indexers/AddIndexerItem.js | 7 +- .../Indexers/EditIndexerModalContent.js | 10 +- .../MediaManagement/MediaManagement.js | 22 +-- .../RootFolder/EditRootFolderModalContent.js | 8 +- .../Metadata/EditMetadataModalContent.js | 6 +- .../Notifications/AddNotificationItem.js | 7 +- .../EditNotificationModalContent.js | 10 +- .../Settings/Profiles/Delay/DelayProfile.js | 4 +- .../Settings/Profiles/Delay/DelayProfiles.js | 16 +- .../Delay/EditDelayProfileModalContent.js | 55 +++--- .../EditDelayProfileModalContentConnector.js | 8 - .../EditMetadataProfileModalContent.js | 8 +- .../Quality/EditQualityProfileModalContent.js | 10 +- .../Release/EditReleaseProfileModalContent.js | 8 +- .../Quality/Definition/QualityDefinitions.js | 15 +- frontend/src/Settings/UI/UISettings.js | 10 +- frontend/src/Store/Actions/albumActions.js | 21 +-- .../src/Store/Actions/albumStudioActions.js | 15 +- frontend/src/Store/Actions/artistActions.js | 13 +- .../src/Store/Actions/artistEditorActions.js | 31 ++-- .../src/Store/Actions/artistIndexActions.js | 63 +++---- .../src/Store/Actions/blocklistActions.js | 13 +- frontend/src/Store/Actions/calendarActions.js | 5 +- frontend/src/Store/Actions/historyActions.js | 43 ++--- frontend/src/Store/Actions/queueActions.js | 29 +-- frontend/src/Store/Actions/releaseActions.js | 25 +-- frontend/src/Store/Actions/systemActions.js | 8 +- frontend/src/Store/Actions/trackActions.js | 17 +- .../src/Store/Actions/trackFileActions.js | 11 +- frontend/src/Store/Actions/wantedActions.js | 29 +-- frontend/src/System/Backup/BackupRow.js | 6 +- frontend/src/System/Backup/Backups.js | 6 +- .../Backup/RestoreBackupModalContent.js | 10 +- frontend/src/System/Logs/Files/LogFiles.js | 4 +- .../src/System/Status/DiskSpace/DiskSpace.js | 6 +- .../src/System/Status/Donations/Donations.js | 3 +- frontend/src/System/Status/Health/Health.js | 4 +- .../src/System/Tasks/Queued/QueuedTasks.js | 10 +- .../System/Tasks/Scheduled/ScheduledTasks.js | 10 +- .../Editor/TrackFileEditorModalContent.js | 8 +- src/NzbDrone.Core/Localization/Core/en.json | 169 +++++++++++++++++- 75 files changed, 665 insertions(+), 461 deletions(-) diff --git a/frontend/src/Album/Edit/EditAlbumModalContent.js b/frontend/src/Album/Edit/EditAlbumModalContent.js index d5a1482bd..ac3f53d5a 100644 --- a/frontend/src/Album/Edit/EditAlbumModalContent.js +++ b/frontend/src/Album/Edit/EditAlbumModalContent.js @@ -108,14 +108,14 @@ class EditAlbumModalContent extends Component { - Save + {translate('Save')} diff --git a/frontend/src/AlbumStudio/AlbumStudio.js b/frontend/src/AlbumStudio/AlbumStudio.js index d78af4771..58ae6e5fe 100644 --- a/frontend/src/AlbumStudio/AlbumStudio.js +++ b/frontend/src/AlbumStudio/AlbumStudio.js @@ -32,13 +32,13 @@ const columns = [ }, { name: 'sortName', - label: 'Name', + label: translate('Name'), isSortable: true, isVisible: true }, { name: 'albumCount', - label: 'Albums', + label: translate('Albums'), isSortable: false, isVisible: true } diff --git a/frontend/src/Artist/Edit/EditArtistModalContent.js b/frontend/src/Artist/Edit/EditArtistModalContent.js index 7205ee032..c919aec88 100644 --- a/frontend/src/Artist/Edit/EditArtistModalContent.js +++ b/frontend/src/Artist/Edit/EditArtistModalContent.js @@ -211,14 +211,14 @@ class EditArtistModalContent extends Component { - Save + {translate('Save')} diff --git a/frontend/src/Artist/Editor/AudioTags/RetagArtistModalContent.js b/frontend/src/Artist/Editor/AudioTags/RetagArtistModalContent.js index 96cfddf1b..7f632ad57 100644 --- a/frontend/src/Artist/Editor/AudioTags/RetagArtistModalContent.js +++ b/frontend/src/Artist/Editor/AudioTags/RetagArtistModalContent.js @@ -8,6 +8,7 @@ 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 './RetagArtistModalContent.css'; function RetagArtistModalContent(props) { @@ -50,14 +51,14 @@ function RetagArtistModalContent(props) { diff --git a/frontend/src/Artist/Editor/Delete/DeleteArtistModalContent.js b/frontend/src/Artist/Editor/Delete/DeleteArtistModalContent.js index 4083c3187..6e04fc7e6 100644 --- a/frontend/src/Artist/Editor/Delete/DeleteArtistModalContent.js +++ b/frontend/src/Artist/Editor/Delete/DeleteArtistModalContent.js @@ -9,6 +9,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes, kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import styles from './DeleteArtistModalContent.css'; class DeleteArtistModalContent extends Component { @@ -51,7 +52,7 @@ class DeleteArtistModalContent extends Component { return ( - Delete Selected Artist + {translate('DeleteArtist')} @@ -99,14 +100,14 @@ class DeleteArtistModalContent extends Component { diff --git a/frontend/src/Artist/Editor/Organize/OrganizeArtistModalContent.js b/frontend/src/Artist/Editor/Organize/OrganizeArtistModalContent.js index edbbed977..30a6929cd 100644 --- a/frontend/src/Artist/Editor/Organize/OrganizeArtistModalContent.js +++ b/frontend/src/Artist/Editor/Organize/OrganizeArtistModalContent.js @@ -8,6 +8,7 @@ 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 './OrganizeArtistModalContent.css'; function OrganizeArtistModalContent(props) { @@ -20,7 +21,7 @@ function OrganizeArtistModalContent(props) { return ( - Organize Selected Artist + {translate('OrganizeArtist')} @@ -51,14 +52,14 @@ function OrganizeArtistModalContent(props) { diff --git a/frontend/src/Artist/Editor/Tags/TagsModalContent.js b/frontend/src/Artist/Editor/Tags/TagsModalContent.js index 6e6da1ef1..29929ea4b 100644 --- a/frontend/src/Artist/Editor/Tags/TagsModalContent.js +++ b/frontend/src/Artist/Editor/Tags/TagsModalContent.js @@ -61,9 +61,9 @@ class TagsModalContent extends Component { } = this.state; const applyTagsOptions = [ - { key: 'add', value: 'Add' }, - { key: 'remove', value: 'Remove' }, - { key: 'replace', value: 'Replace' } + { key: 'add', value: translate('Add') }, + { key: 'remove', value: translate('Remove') }, + { key: 'replace', value: translate('Replace') } ]; return ( @@ -169,14 +169,14 @@ class TagsModalContent extends Component { diff --git a/frontend/src/Artist/History/ArtistHistoryModalContent.js b/frontend/src/Artist/History/ArtistHistoryModalContent.js index 5fb701817..5dd77ad9f 100644 --- a/frontend/src/Artist/History/ArtistHistoryModalContent.js +++ b/frontend/src/Artist/History/ArtistHistoryModalContent.js @@ -18,32 +18,32 @@ const columns = [ }, { name: 'album', - label: 'Album', + label: translate('Album'), isVisible: true }, { name: 'sourceTitle', - label: 'Source Title', + label: translate('SourceTitle'), isVisible: true }, { name: 'quality', - label: 'Quality', + label: translate('Quality'), isVisible: true }, { name: 'date', - label: 'Date', + label: translate('Date'), isVisible: true }, { name: 'details', - label: 'Details', + label: translate('Details'), isVisible: true }, { name: 'actions', - label: 'Actions', + label: translate('Actions'), isVisible: true } ]; diff --git a/frontend/src/Components/FileBrowser/FileBrowserModalContent.js b/frontend/src/Components/FileBrowser/FileBrowserModalContent.js index c6ea3458a..b00683045 100644 --- a/frontend/src/Components/FileBrowser/FileBrowserModalContent.js +++ b/frontend/src/Components/FileBrowser/FileBrowserModalContent.js @@ -21,12 +21,12 @@ import styles from './FileBrowserModalContent.css'; const columns = [ { name: 'type', - label: 'Type', + label: translate('Type'), isVisible: true }, { name: 'name', - label: 'Name', + label: translate('Name'), isVisible: true } ]; @@ -226,13 +226,13 @@ class FileBrowserModalContent extends Component { diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js b/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js index d718aab0c..d33f4d4fb 100644 --- a/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js +++ b/frontend/src/Components/Filter/Builder/FilterBuilderModalContent.js @@ -8,6 +8,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import FilterBuilderRow from './FilterBuilderRow'; import styles from './FilterBuilderModalContent.css'; @@ -151,7 +152,7 @@ class FilterBuilderModalContent extends Component {
- Label + {translate('Label')}
@@ -165,7 +166,7 @@ class FilterBuilderModalContent extends Component {
-
Filters
+
{translate('Filters')}
{ @@ -192,7 +193,7 @@ class FilterBuilderModalContent extends Component { - Save + {translate('Save')} diff --git a/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js b/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js index 840c676c8..116bd3e8b 100644 --- a/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js +++ b/frontend/src/Components/Filter/CustomFilters/CustomFiltersModalContent.js @@ -5,6 +5,7 @@ import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; +import translate from 'Utilities/String/translate'; import CustomFilter from './CustomFilter'; import styles from './CustomFiltersModalContent.css'; @@ -24,7 +25,7 @@ function CustomFiltersModalContent(props) { return ( - Custom Filters + {translate('CustomFilters')} diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index 827b346c2..e1d4ec07c 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -2,6 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import Link from 'Components/Link/Link'; import { inputTypes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import AlbumReleaseSelectInputConnector from './AlbumReleaseSelectInputConnector'; import AutoCompleteInput from './AutoCompleteInput'; import CaptchaInputConnector from './CaptchaInputConnector'; @@ -227,7 +228,7 @@ function FormInputGroup(props) { - More Info + {translate('MoreInfo')} } diff --git a/frontend/src/Components/Form/PlaylistInput.js b/frontend/src/Components/Form/PlaylistInput.js index 906236e4f..8891dc794 100644 --- a/frontend/src/Components/Form/PlaylistInput.js +++ b/frontend/src/Components/Form/PlaylistInput.js @@ -8,6 +8,7 @@ import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import TableRow from 'Components/Table/TableRow'; import tagShape from 'Helpers/Props/Shapes/tagShape'; +import translate from 'Utilities/String/translate'; import getSelectedIds from 'Utilities/Table/getSelectedIds'; import selectAll from 'Utilities/Table/selectAll'; import toggleSelected from 'Utilities/Table/toggleSelected'; @@ -16,7 +17,7 @@ import styles from './PlaylistInput.css'; const columns = [ { name: 'name', - label: 'Playlist', + label: translate('Playlist'), isSortable: false, isVisible: true } diff --git a/frontend/src/Components/Menu/FilterMenuContent.js b/frontend/src/Components/Menu/FilterMenuContent.js index 09313cc55..1fdb2476f 100644 --- a/frontend/src/Components/Menu/FilterMenuContent.js +++ b/frontend/src/Components/Menu/FilterMenuContent.js @@ -1,5 +1,6 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import translate from 'Utilities/String/translate'; import FilterMenuItem from './FilterMenuItem'; import MenuContent from './MenuContent'; import MenuItem from './MenuItem'; @@ -61,7 +62,7 @@ class FilterMenuContent extends Component { { showCustomFilters && - Custom Filters + {translate('CustomFilters')} } diff --git a/frontend/src/Components/Page/Sidebar/PageSidebar.js b/frontend/src/Components/Page/Sidebar/PageSidebar.js index f027c5cdc..1387b3c99 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebar.js +++ b/frontend/src/Components/Page/Sidebar/PageSidebar.js @@ -10,6 +10,7 @@ import { icons } from 'Helpers/Props'; import locationShape from 'Helpers/Props/Shapes/locationShape'; import dimensions from 'Styles/Variables/dimensions'; import HealthStatusConnector from 'System/Status/Health/HealthStatusConnector'; +import translate from 'Utilities/String/translate'; import MessagesConnector from './Messages/MessagesConnector'; import PageSidebarItem from './PageSidebarItem'; import styles from './PageSidebar.css'; @@ -20,24 +21,24 @@ const SIDEBAR_WIDTH = parseInt(dimensions.sidebarWidth); const links = [ { iconName: icons.ARTIST_CONTINUING, - title: 'Library', + title: translate('Library'), to: '/', alias: '/artist', children: [ { - title: 'Add New', + title: translate('AddNew'), to: '/add/search' }, { - title: 'Mass Editor', + title: translate('MassEditor'), to: '/artisteditor' }, { - title: 'Album Studio', + title: translate('AlbumStudio'), to: '/albumstudio' }, { - title: 'Unmapped Files', + title: translate('UnmappedFiles'), to: '/unmapped' } ] @@ -45,26 +46,26 @@ const links = [ { iconName: icons.CALENDAR, - title: 'Calendar', + title: translate('Calendar'), to: '/calendar' }, { iconName: icons.ACTIVITY, - title: 'Activity', + title: translate('Activity'), to: '/activity/queue', children: [ { - title: 'Queue', + title: translate('Queue'), to: '/activity/queue', statusComponent: QueueStatusConnector }, { - title: 'History', + title: translate('History'), to: '/activity/history' }, { - title: 'Blocklist', + title: translate('Blocklist'), to: '/activity/blocklist' } ] @@ -72,15 +73,15 @@ const links = [ { iconName: icons.WARNING, - title: 'Wanted', + title: translate('Wanted'), to: '/wanted/missing', children: [ { - title: 'Missing', + title: translate('Missing'), to: '/wanted/missing' }, { - title: 'Cutoff Unmet', + title: translate('CutoffUnmet'), to: '/wanted/cutoffunmet' } ] @@ -88,51 +89,51 @@ const links = [ { iconName: icons.SETTINGS, - title: 'Settings', + title: translate('Settings'), to: '/settings', children: [ { - title: 'Media Management', + title: translate('MediaManagement'), to: '/settings/mediamanagement' }, { - title: 'Profiles', + title: translate('Profiles'), to: '/settings/profiles' }, { - title: 'Quality', + title: translate('Quality'), to: '/settings/quality' }, { - title: 'Indexers', + title: translate('Indexers'), to: '/settings/indexers' }, { - title: 'Download Clients', + title: translate('DownloadClients'), to: '/settings/downloadclients' }, { - title: 'Import Lists', + title: translate('ImportLists'), to: '/settings/importlists' }, { - title: 'Connect', + title: translate('Connect'), to: '/settings/connect' }, { - title: 'Metadata', + title: translate('Metadata'), to: '/settings/metadata' }, { - title: 'Tags', + title: translate('Tags'), to: '/settings/tags' }, { - title: 'General', + title: translate('General'), to: '/settings/general' }, { - title: 'UI', + title: translate('UI'), to: '/settings/ui' } ] @@ -140,32 +141,32 @@ const links = [ { iconName: icons.SYSTEM, - title: 'System', + title: translate('System'), to: '/system/status', children: [ { - title: 'Status', + title: translate('Status'), to: '/system/status', statusComponent: HealthStatusConnector }, { - title: 'Tasks', + title: translate('Tasks'), to: '/system/tasks' }, { - title: 'Backup', + title: translate('Backup'), to: '/system/backup' }, { - title: 'Updates', + title: translate('Updates'), to: '/system/updates' }, { - title: 'Events', + title: translate('Events'), to: '/system/events' }, { - title: 'Log Files', + title: translate('LogFiles'), to: '/system/logs/files' } ] diff --git a/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js b/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js index 0cc95e0c8..33c318557 100644 --- a/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js +++ b/frontend/src/InteractiveImport/Album/SelectAlbumModalContent.js @@ -18,22 +18,22 @@ import styles from './SelectAlbumModalContent.css'; const columns = [ { name: 'title', - label: 'Album Title', + label: translate('AlbumTitle'), isVisible: true }, { name: 'albumType', - label: 'Album Type', + label: translate('AlbumType'), isVisible: true }, { name: 'releaseDate', - label: 'Release Date', + label: translate('ReleaseDate'), isVisible: true }, { name: 'status', - label: 'Album Status', + label: translate('AlbumStatus'), isVisible: true } ]; @@ -124,7 +124,7 @@ class SelectAlbumModalContent extends Component { diff --git a/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseModalContent.js b/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseModalContent.js index ae611d936..5c59b360b 100644 --- a/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseModalContent.js +++ b/frontend/src/InteractiveImport/AlbumRelease/SelectAlbumReleaseModalContent.js @@ -10,18 +10,19 @@ import Scroller from 'Components/Scroller/Scroller'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import { scrollDirections } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import SelectAlbumReleaseRow from './SelectAlbumReleaseRow'; import styles from './SelectAlbumReleaseModalContent.css'; const columns = [ { name: 'album', - label: 'Album', + label: translate('Album'), isVisible: true }, { name: 'release', - label: 'Album Release', + label: translate('AlbumRelease'), isVisible: true } ]; @@ -42,7 +43,7 @@ class SelectAlbumReleaseModalContent extends Component { return ( - Manual Import - Select Album Release + {translate('ManualImport')} - {translate('SelectAlbumRelease')} diff --git a/frontend/src/InteractiveImport/Artist/SelectArtistModalContent.js b/frontend/src/InteractiveImport/Artist/SelectArtistModalContent.js index f61f77f7b..981cda21e 100644 --- a/frontend/src/InteractiveImport/Artist/SelectArtistModalContent.js +++ b/frontend/src/InteractiveImport/Artist/SelectArtistModalContent.js @@ -47,7 +47,7 @@ class SelectArtistModalContent extends Component { return ( - Manual Import - Select Artist + {translate('ManualImport')} - {translate('SelectArtist')} diff --git a/frontend/src/InteractiveImport/Confirmation/ConfirmImportModalContent.js b/frontend/src/InteractiveImport/Confirmation/ConfirmImportModalContent.js index fa69d8cac..491841714 100644 --- a/frontend/src/InteractiveImport/Confirmation/ConfirmImportModalContent.js +++ b/frontend/src/InteractiveImport/Confirmation/ConfirmImportModalContent.js @@ -9,6 +9,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; function formatAlbumFiles(items, album) { @@ -73,7 +74,7 @@ class ConfirmImportModalContent extends Component { { !isFetching && isPopulated && - Are you sure? + {translate('AreYouSure')} } @@ -105,14 +106,14 @@ class ConfirmImportModalContent extends Component { !isFetching && isPopulated && diff --git a/frontend/src/InteractiveImport/Folder/InteractiveImportSelectFolderModalContent.js b/frontend/src/InteractiveImport/Folder/InteractiveImportSelectFolderModalContent.js index e3ad5e0e8..f30c3cb3d 100644 --- a/frontend/src/InteractiveImport/Folder/InteractiveImportSelectFolderModalContent.js +++ b/frontend/src/InteractiveImport/Folder/InteractiveImportSelectFolderModalContent.js @@ -10,17 +10,18 @@ import ModalHeader from 'Components/Modal/ModalHeader'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import { icons, kinds, sizes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import RecentFolderRow from './RecentFolderRow'; import styles from './InteractiveImportSelectFolderModalContent.css'; const recentFoldersColumns = [ { name: 'folder', - label: 'Folder' + label: translate('Folder') }, { name: 'lastUsed', - label: 'Last Used' + label: translate('LastUsed') }, { name: 'actions', @@ -75,7 +76,7 @@ class InteractiveImportSelectFolderModalContent extends Component { return ( - Manual Import - Select Folder + {translate('ManualImport')} - {translate('SelectFolder')} @@ -124,7 +125,7 @@ class InteractiveImportSelectFolderModalContent extends Component { name={icons.QUICK} /> - Move Automatically + {translate('MoveAutomatically')}
@@ -141,7 +142,7 @@ class InteractiveImportSelectFolderModalContent extends Component { name={icons.INTERACTIVE} /> - Interactive Import + {translate('InteractiveImport')} @@ -149,7 +150,7 @@ class InteractiveImportSelectFolderModalContent extends Component { diff --git a/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js b/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js index cb6c7b62f..be555d969 100644 --- a/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js +++ b/frontend/src/InteractiveImport/Interactive/InteractiveImportModalContent.js @@ -22,6 +22,7 @@ import SelectArtistModal from 'InteractiveImport/Artist/SelectArtistModal'; import ConfirmImportModal from 'InteractiveImport/Confirmation/ConfirmImportModal'; import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; +import translate from 'Utilities/String/translate'; import getSelectedIds from 'Utilities/Table/getSelectedIds'; import selectAll from 'Utilities/Table/selectAll'; import toggleSelected from 'Utilities/Table/toggleSelected'; @@ -31,35 +32,35 @@ import styles from './InteractiveImportModalContent.css'; const columns = [ { name: 'path', - label: 'Path', + label: translate('Path'), isSortable: true, isVisible: true }, { name: 'artist', - label: 'Artist', + label: translate('Artist'), isSortable: true, isVisible: true }, { name: 'album', - label: 'Album', + label: translate('Album'), isVisible: true }, { name: 'tracks', - label: 'Track(s)', + label: translate('Tracks'), isVisible: true }, { name: 'quality', - label: 'Quality', + label: translate('Quality'), isSortable: true, isVisible: true }, { name: 'size', - label: 'Size', + label: translate('Size'), isSortable: true, isVisible: true }, @@ -80,8 +81,8 @@ const filterExistingFilesOptions = { }; const importModeOptions = [ - { key: 'move', value: 'Move Files' }, - { key: 'copy', value: 'Hardlink/Copy Files' } + { key: 'move', value: translate('MoveFiles') }, + { key: 'copy', value: translate('HardlinkCopyFiles') } ]; const SELECT = 'select'; @@ -288,23 +289,23 @@ class InteractiveImportModalContent extends Component { const errorMessage = getErrorMessage(error, 'Unable to load manual import items'); const bulkSelectOptions = [ - { key: SELECT, value: 'Select...', disabled: true }, - { key: ALBUM, value: 'Select Album' }, - { key: ALBUM_RELEASE, value: 'Select Album Release' }, - { key: QUALITY, value: 'Select Quality' } + { key: SELECT, value: translate('Select...'), disabled: true }, + { key: ALBUM, value: translate('SelectAlbum') }, + { key: ALBUM_RELEASE, value: translate('SelectAlbumRelease') }, + { key: QUALITY, value: translate('SelectQuality') } ]; if (allowArtistChange) { bulkSelectOptions.splice(1, 0, { key: ARTIST, - value: 'Select Artist' + value: translate('SelectArtist') }); } return ( - Manual Import - {title || folder} + {translate('ManualImport')} - {title || folder} @@ -320,7 +321,7 @@ class InteractiveImportModalContent extends Component {
{ - filterExistingFiles ? 'Unmapped Files Only' : 'All Files' + filterExistingFiles ? translate('UnmappedFilesOnly') : translate('AllFiles') }
@@ -331,7 +332,7 @@ class InteractiveImportModalContent extends Component { isSelected={!filterExistingFiles} onPress={this.onFilterExistingFilesChange} > - All Files + {translate('AllFiles')} - Unmapped Files Only + {translate('UnmappedFilesOnly')} @@ -366,7 +367,7 @@ class InteractiveImportModalContent extends Component { isSelected={!replaceExistingFiles} onPress={this.onReplaceExistingFilesChange} > - Combine With Existing Files + {translate('CombineWithExistingFiles')} - Replace Existing Files + {translate('ReplaceExistingFiles')} @@ -474,7 +475,7 @@ class InteractiveImportModalContent extends Component {
{ @@ -487,7 +488,7 @@ class InteractiveImportModalContent extends Component { isDisabled={!selectedIds.length || !!invalidRowsSelected.length || inconsistentAlbumReleases} onPress={this.onImportSelectedPress} > - Import + {translate('Import')}
diff --git a/frontend/src/InteractiveImport/Quality/SelectQualityModalContent.js b/frontend/src/InteractiveImport/Quality/SelectQualityModalContent.js index 6b57735a6..e7abd1184 100644 --- a/frontend/src/InteractiveImport/Quality/SelectQualityModalContent.js +++ b/frontend/src/InteractiveImport/Quality/SelectQualityModalContent.js @@ -81,7 +81,7 @@ class SelectQualityModalContent extends Component { return ( - Manual Import - Select Quality + {translate('ManualImport')} - {translate('SelectQuality')} @@ -145,14 +145,14 @@ class SelectQualityModalContent extends Component { diff --git a/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js index 482e9024a..ea70de52c 100644 --- a/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js +++ b/frontend/src/InteractiveImport/Track/SelectTrackModalContent.js @@ -12,6 +12,7 @@ import TableBody from 'Components/Table/TableBody'; import { kinds } from 'Helpers/Props'; import ExpandingFileDetails from 'TrackFile/ExpandingFileDetails'; import getErrorMessage from 'Utilities/Object/getErrorMessage'; +import translate from 'Utilities/String/translate'; import getSelectedIds from 'Utilities/Table/getSelectedIds'; import selectAll from 'Utilities/Table/selectAll'; import toggleSelected from 'Utilities/Table/toggleSelected'; @@ -20,7 +21,7 @@ import SelectTrackRow from './SelectTrackRow'; const columns = [ { name: 'mediumNumber', - label: 'Medium', + label: translate('Medium'), isSortable: true, isVisible: true }, @@ -32,12 +33,12 @@ const columns = [ }, { name: 'title', - label: 'Title', + label: translate('Title'), isVisible: true }, { name: 'trackStatus', - label: 'Status', + label: translate('Status'), isVisible: true } ]; @@ -137,7 +138,7 @@ class SelectTrackModalContent extends Component { return ( - Manual Import - Select Track(s): + {translate('ManualImport')} - {translate('SelectTracks')} @@ -201,14 +202,14 @@ class SelectTrackModalContent extends Component { diff --git a/frontend/src/InteractiveSearch/InteractiveSearch.js b/frontend/src/InteractiveSearch/InteractiveSearch.js index 719a781bc..c91bdf6f8 100644 --- a/frontend/src/InteractiveSearch/InteractiveSearch.js +++ b/frontend/src/InteractiveSearch/InteractiveSearch.js @@ -7,6 +7,7 @@ import PageMenuButton from 'Components/Menu/PageMenuButton'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import { align, icons, sortDirections } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import InteractiveSearchFilterModalConnector from './InteractiveSearchFilterModalConnector'; import InteractiveSearchRow from './InteractiveSearchRow'; import styles from './InteractiveSearch.css'; @@ -14,43 +15,43 @@ import styles from './InteractiveSearch.css'; const columns = [ { name: 'protocol', - label: 'Source', + label: translate('Source'), isSortable: true, isVisible: true }, { name: 'age', - label: 'Age', + label: translate('Age'), isSortable: true, isVisible: true }, { name: 'title', - label: 'Title', + label: translate('Title'), isSortable: true, isVisible: true }, { name: 'indexer', - label: 'Indexer', + label: translate('Indexer'), isSortable: true, isVisible: true }, { name: 'size', - label: 'Size', + label: translate('Size'), isSortable: true, isVisible: true }, { name: 'peers', - label: 'Peers', + label: translate('Peers'), isSortable: true, isVisible: true }, { name: 'qualityWeight', - label: 'Quality', + label: translate('Quality'), isSortable: true, isVisible: true }, @@ -58,7 +59,7 @@ const columns = [ name: 'preferredWordScore', label: React.createElement(Icon, { name: icons.SCORE, - title: 'Preferred word score' + title: translate('PreferredWordScore') }), isSortable: true, isVisible: true @@ -67,7 +68,7 @@ const columns = [ name: 'rejections', label: React.createElement(Icon, { name: icons.DANGER, - title: 'Rejections' + title: translate('rejections') }), isSortable: true, fixedSortDirection: sortDirections.ASCENDING, @@ -125,7 +126,7 @@ function InteractiveSearch(props) { { !isFetching && error ?
- Unable to load results for this album search. Try again later + {translate('UnableToLoadInteractiveSearch')}
: null } @@ -133,7 +134,7 @@ function InteractiveSearch(props) { { !isFetching && isPopulated && !totalReleasesCount ?
- No results found + {translate('NoResults')}
: null } @@ -141,7 +142,7 @@ function InteractiveSearch(props) { { !!totalReleasesCount && isPopulated && !items.length ?
- All results are hidden by the applied filter + {translate('AllResultsFiltered')}
: null } @@ -177,7 +178,7 @@ function InteractiveSearch(props) { { totalReleasesCount !== items.length && !!items.length ?
- Some results are hidden by the applied filter + {translate('SomeResultsFiltered')}
: null } diff --git a/frontend/src/Organize/OrganizePreviewModalContent.js b/frontend/src/Organize/OrganizePreviewModalContent.js index d714b6cc8..61e24d9fa 100644 --- a/frontend/src/Organize/OrganizePreviewModalContent.js +++ b/frontend/src/Organize/OrganizePreviewModalContent.js @@ -160,14 +160,14 @@ class OrganizePreviewModalContent extends Component {
diff --git a/frontend/src/Retag/RetagPreviewModalContent.js b/frontend/src/Retag/RetagPreviewModalContent.js index ef73eed77..06b209260 100644 --- a/frontend/src/Retag/RetagPreviewModalContent.js +++ b/frontend/src/Retag/RetagPreviewModalContent.js @@ -89,7 +89,7 @@ class RetagPreviewModalContent extends Component { return ( - Write Metadata Tags + {translate('WriteMetadataTags')} @@ -156,14 +156,14 @@ class RetagPreviewModalContent extends Component { diff --git a/frontend/src/Settings/AdvancedSettingsButton.js b/frontend/src/Settings/AdvancedSettingsButton.js index cc7be45a5..d786bad50 100644 --- a/frontend/src/Settings/AdvancedSettingsButton.js +++ b/frontend/src/Settings/AdvancedSettingsButton.js @@ -45,7 +45,7 @@ function AdvancedSettingsButton(props) {
- {advancedSettings ? 'Hide Advanced' : 'Show Advanced'} + {advancedSettings ? translate('HideAdvanced') : translate('ShowAdvanced')}
diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/AddDownloadClientItem.js b/frontend/src/Settings/DownloadClients/DownloadClients/AddDownloadClientItem.js index 2abf039dc..0b1113022 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/AddDownloadClientItem.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/AddDownloadClientItem.js @@ -5,6 +5,7 @@ import Link from 'Components/Link/Link'; import Menu from 'Components/Menu/Menu'; import MenuContent from 'Components/Menu/MenuContent'; import { sizes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import AddDownloadClientPresetMenuItem from './AddDownloadClientPresetMenuItem'; import styles from './AddDownloadClientItem.css'; @@ -57,7 +58,7 @@ class AddDownloadClientItem extends Component { size={sizes.SMALL} onPress={this.onDownloadClientSelect} > - Custom + {translate('Custom')} @@ -65,7 +66,7 @@ class AddDownloadClientItem extends Component { className={styles.presetsMenuButton} size={sizes.SMALL} > - Presets + {translate('Presets')} @@ -90,7 +91,7 @@ class AddDownloadClientItem extends Component { to={infoLink} size={sizes.SMALL} > - More info + {translate('MoreInfo')} diff --git a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js index 99ba8788e..4fed8bc4a 100644 --- a/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js +++ b/frontend/src/Settings/DownloadClients/DownloadClients/EditDownloadClientModalContent.js @@ -189,7 +189,7 @@ class EditDownloadClientModalContent extends Component { kind={kinds.DANGER} onPress={onDeleteDownloadClientPress} > - Delete + {translate('Delete')} } @@ -198,13 +198,13 @@ class EditDownloadClientModalContent extends Component { error={saveError} onPress={onTestPress} > - Test + {translate('Test')} - Save + {translate('Save')} diff --git a/frontend/src/Settings/DownloadClients/RemotePathMappings/EditRemotePathMappingModalContent.js b/frontend/src/Settings/DownloadClients/RemotePathMappings/EditRemotePathMappingModalContent.js index bc2a08740..3c07a22fa 100644 --- a/frontend/src/Settings/DownloadClients/RemotePathMappings/EditRemotePathMappingModalContent.js +++ b/frontend/src/Settings/DownloadClients/RemotePathMappings/EditRemotePathMappingModalContent.js @@ -41,7 +41,7 @@ function EditRemotePathMappingModalContent(props) { return ( - {id ? 'Edit Remote Path Mapping' : 'Add Remote Path Mapping'} + {id ? translate('EditRemotePathMapping') : translate('AddRemotePathMapping')} @@ -114,14 +114,14 @@ function EditRemotePathMappingModalContent(props) { kind={kinds.DANGER} onPress={onDeleteRemotePathMappingPress} > - Delete + {translate('Delete')} } - Save + {translate('Save')} diff --git a/frontend/src/Settings/DownloadClients/RemotePathMappings/RemotePathMappings.js b/frontend/src/Settings/DownloadClients/RemotePathMappings/RemotePathMappings.js index 0e9635af4..3795917ba 100644 --- a/frontend/src/Settings/DownloadClients/RemotePathMappings/RemotePathMappings.js +++ b/frontend/src/Settings/DownloadClients/RemotePathMappings/RemotePathMappings.js @@ -51,9 +51,15 @@ class RemotePathMappings extends Component { {...otherProps} >
-
Host
-
Remote Path
-
Local Path
+
+ {translate('Host')} +
+
+ {translate('RemotePath')} +
+
+ {translate('LocalPath')} +
diff --git a/frontend/src/Settings/ImportLists/ImportListExclusions/EditImportListExclusionModalContent.js b/frontend/src/Settings/ImportLists/ImportListExclusions/EditImportListExclusionModalContent.js index fe38bfb67..f61da304f 100644 --- a/frontend/src/Settings/ImportLists/ImportListExclusions/EditImportListExclusionModalContent.js +++ b/frontend/src/Settings/ImportLists/ImportListExclusions/EditImportListExclusionModalContent.js @@ -39,7 +39,7 @@ function EditImportListExclusionModalContent(props) { return ( - {id ? 'Edit Import List Exclusion' : 'Add Import List Exclusion'} + {id ? translate('EditImportListExclusion') : translate('AddImportListExclusion')} @@ -99,14 +99,14 @@ function EditImportListExclusionModalContent(props) { kind={kinds.DANGER} onPress={onDeleteImportListExclusionPress} > - Delete + {translate('Delete')} } - Save + {translate('Save')} diff --git a/frontend/src/Settings/ImportLists/ImportLists/AddImportListItem.js b/frontend/src/Settings/ImportLists/ImportLists/AddImportListItem.js index a7f9e8603..40a10f657 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/AddImportListItem.js +++ b/frontend/src/Settings/ImportLists/ImportLists/AddImportListItem.js @@ -5,6 +5,7 @@ import Link from 'Components/Link/Link'; import Menu from 'Components/Menu/Menu'; import MenuContent from 'Components/Menu/MenuContent'; import { sizes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import AddImportListPresetMenuItem from './AddImportListPresetMenuItem'; import styles from './AddImportListItem.css'; @@ -57,7 +58,7 @@ class AddImportListItem extends Component { size={sizes.SMALL} onPress={this.onListSelect} > - Custom + {translate('Custom')} @@ -65,7 +66,7 @@ class AddImportListItem extends Component { className={styles.presetsMenuButton} size={sizes.SMALL} > - Presets + {translate('Presets')} @@ -90,7 +91,7 @@ class AddImportListItem extends Component { to={infoLink} size={sizes.SMALL} > - More info + {translate('MoreInfo')}
diff --git a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js index c30e9f42a..e65c68b27 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js +++ b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js @@ -28,17 +28,17 @@ function ImportListMonitoringOptionsPopoverContent() { ); @@ -47,9 +47,9 @@ function ImportListMonitoringOptionsPopoverContent() { function EditImportListModalContent(props) { const monitorOptions = [ - { key: 'none', value: 'None' }, - { key: 'specificAlbum', value: 'Specific Album' }, - { key: 'entireArtist', value: 'All Artist Albums' } + { key: 'none', value: translate('None') }, + { key: 'specificAlbum', value: translate('SpecificAlbum') }, + { key: 'entireArtist', value: translate('All Artist Albums') } ]; const { @@ -89,7 +89,7 @@ function EditImportListModalContent(props) { return ( - {id ? 'Edit List' : 'Add List'} + {id ? translate('EditList') : translate('AddList')} @@ -318,7 +318,7 @@ function EditImportListModalContent(props) { kind={kinds.DANGER} onPress={onDeleteImportListPress} > - Delete + {translate('Delete')} } @@ -327,13 +327,13 @@ function EditImportListModalContent(props) { error={saveError} onPress={onTestPress} > - Test + {translate('Test')} - Save + {translate('Save')} diff --git a/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.js b/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.js index 9138114f1..58b7ce50d 100644 --- a/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.js +++ b/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.js @@ -5,6 +5,7 @@ import Link from 'Components/Link/Link'; import Menu from 'Components/Menu/Menu'; import MenuContent from 'Components/Menu/MenuContent'; import { sizes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import AddIndexerPresetMenuItem from './AddIndexerPresetMenuItem'; import styles from './AddIndexerItem.css'; @@ -57,7 +58,7 @@ class AddIndexerItem extends Component { size={sizes.SMALL} onPress={this.onIndexerSelect} > - Custom + {translate('Custom')} @@ -65,7 +66,7 @@ class AddIndexerItem extends Component { className={styles.presetsMenuButton} size={sizes.SMALL} > - Presets + {translate('Presets')} @@ -90,7 +91,7 @@ class AddIndexerItem extends Component { to={infoLink} size={sizes.SMALL} > - More info + {translate('MoreInfo')} diff --git a/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js b/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js index 3ddd0223c..3baaa72f2 100644 --- a/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js +++ b/frontend/src/Settings/Indexers/Indexers/EditIndexerModalContent.js @@ -53,7 +53,7 @@ function EditIndexerModalContent(props) { return ( - {`${id ? 'Edit' : 'Add'} Indexer - ${implementationName}`} + {`${id ? translate('EditIndexer') : translate('AddIndexer')} - ${implementationName}`} @@ -204,7 +204,7 @@ function EditIndexerModalContent(props) { kind={kinds.DANGER} onPress={onDeleteIndexerPress} > - Delete + {translate('Delete')} } @@ -213,13 +213,13 @@ function EditIndexerModalContent(props) { error={saveError} onPress={onTestPress} > - Test + {translate('Test')} - Save + {translate('Save')} diff --git a/frontend/src/Settings/MediaManagement/MediaManagement.js b/frontend/src/Settings/MediaManagement/MediaManagement.js index cc1321976..37c0bb9b6 100644 --- a/frontend/src/Settings/MediaManagement/MediaManagement.js +++ b/frontend/src/Settings/MediaManagement/MediaManagement.js @@ -15,26 +15,26 @@ import NamingConnector from './Naming/NamingConnector'; import RootFoldersConnector from './RootFolder/RootFoldersConnector'; const rescanAfterRefreshOptions = [ - { key: 'always', value: 'Always' }, - { key: 'afterManual', value: 'After Manual Refresh' }, - { key: 'never', value: 'Never' } + { key: 'always', value: translate('Always') }, + { key: 'afterManual', value: translate('AfterManualRefresh') }, + { key: 'never', value: translate('Never') } ]; const allowFingerprintingOptions = [ - { key: 'allFiles', value: 'Always' }, - { key: 'newFiles', value: 'For new imports only' }, - { key: 'never', value: 'Never' } + { key: 'allFiles', value: translate('Always') }, + { key: 'newFiles', value: translate('ForNewImportsOnly') }, + { key: 'never', value: translate('Never') } ]; const downloadPropersAndRepacksOptions = [ - { key: 'preferAndUpgrade', value: 'Prefer and Upgrade' }, - { key: 'doNotUpgrade', value: 'Do not Upgrade Automatically' }, - { key: 'doNotPrefer', value: 'Do not Prefer' } + { key: 'preferAndUpgrade', value: translate('PreferAndUpgrade') }, + { key: 'doNotUpgrade', value: translate('DoNotUpgradeAutomatically') }, + { key: 'doNotPrefer', value: translate('DoNotPrefer') } ]; const fileDateOptions = [ - { key: 'none', value: 'None' }, - { key: 'albumReleaseDate', value: 'Album Release Date' } + { key: 'none', value: translate('None') }, + { key: 'albumReleaseDate', value: translate('AlbumReleaseDate') } ]; class MediaManagement extends Component { diff --git a/frontend/src/Settings/MediaManagement/RootFolder/EditRootFolderModalContent.js b/frontend/src/Settings/MediaManagement/RootFolder/EditRootFolderModalContent.js index e68f03459..3aab11085 100644 --- a/frontend/src/Settings/MediaManagement/RootFolder/EditRootFolderModalContent.js +++ b/frontend/src/Settings/MediaManagement/RootFolder/EditRootFolderModalContent.js @@ -51,7 +51,7 @@ function EditRootFolderModalContent(props) { return ( - {id ? 'Edit Root Folder' : 'Add Root Folder'} + {id ? translate('EditRootFolder') : translate('AddRootFolder')} @@ -216,14 +216,14 @@ function EditRootFolderModalContent(props) { kind={kinds.DANGER} onPress={onDeleteRootFolderPress} > - Delete + {translate('Delete')} } - Save + {translate('Save')} diff --git a/frontend/src/Settings/Metadata/Metadata/EditMetadataModalContent.js b/frontend/src/Settings/Metadata/Metadata/EditMetadataModalContent.js index 4a1699975..812478d23 100644 --- a/frontend/src/Settings/Metadata/Metadata/EditMetadataModalContent.js +++ b/frontend/src/Settings/Metadata/Metadata/EditMetadataModalContent.js @@ -35,7 +35,7 @@ function EditMetadataModalContent(props) { return ( - Edit {name.value} Metadata + {translate('EditMetadata')} - {name.value} @@ -75,7 +75,7 @@ function EditMetadataModalContent(props) { - Save + {translate('Save')} diff --git a/frontend/src/Settings/Notifications/Notifications/AddNotificationItem.js b/frontend/src/Settings/Notifications/Notifications/AddNotificationItem.js index 19fda3281..4cf8a6d57 100644 --- a/frontend/src/Settings/Notifications/Notifications/AddNotificationItem.js +++ b/frontend/src/Settings/Notifications/Notifications/AddNotificationItem.js @@ -5,6 +5,7 @@ import Link from 'Components/Link/Link'; import Menu from 'Components/Menu/Menu'; import MenuContent from 'Components/Menu/MenuContent'; import { sizes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import AddNotificationPresetMenuItem from './AddNotificationPresetMenuItem'; import styles from './AddNotificationItem.css'; @@ -57,7 +58,7 @@ class AddNotificationItem extends Component { size={sizes.SMALL} onPress={this.onNotificationSelect} > - Custom + {translate('Custom')} @@ -65,7 +66,7 @@ class AddNotificationItem extends Component { className={styles.presetsMenuButton} size={sizes.SMALL} > - Presets + {translate('Presets')} @@ -90,7 +91,7 @@ class AddNotificationItem extends Component { to={infoLink} size={sizes.SMALL} > - More info + {translate('MoreInfo')} diff --git a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js index 45708a731..cc3977661 100644 --- a/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js +++ b/frontend/src/Settings/Notifications/Notifications/EditNotificationModalContent.js @@ -48,7 +48,7 @@ function EditNotificationModalContent(props) { return ( - {`${id ? 'Edit' : 'Add'} Connection - ${implementationName}`} + {`${id ? translate('EditConnection') : translate('AddConnection')} - ${implementationName}`} @@ -136,7 +136,7 @@ function EditNotificationModalContent(props) { kind={kinds.DANGER} onPress={onDeleteNotificationPress} > - Delete + {translate('Delete')} } @@ -145,13 +145,13 @@ function EditNotificationModalContent(props) { error={saveError} onPress={onTestPress} > - Test + {translate('Test')} - Save + {translate('Save')} diff --git a/frontend/src/Settings/Profiles/Delay/DelayProfile.js b/frontend/src/Settings/Profiles/Delay/DelayProfile.js index 4e2473599..c0d5912bc 100644 --- a/frontend/src/Settings/Profiles/Delay/DelayProfile.js +++ b/frontend/src/Settings/Profiles/Delay/DelayProfile.js @@ -88,9 +88,9 @@ class DelayProfile extends Component { let preferred = titleCase(preferredProtocol); if (!enableUsenet) { - preferred = 'Only Torrent'; + preferred = translate('OnlyTorrent'); } else if (!enableTorrent) { - preferred = 'Only Usenet'; + preferred = translate('OnlyUsenet'); } return ( diff --git a/frontend/src/Settings/Profiles/Delay/DelayProfiles.js b/frontend/src/Settings/Profiles/Delay/DelayProfiles.js index ed77a223f..83ac09bf8 100644 --- a/frontend/src/Settings/Profiles/Delay/DelayProfiles.js +++ b/frontend/src/Settings/Profiles/Delay/DelayProfiles.js @@ -82,10 +82,18 @@ class DelayProfiles extends Component { >
-
Protocol
-
Usenet Delay
-
Torrent Delay
-
Tags
+
+ {translate('PreferredProtocol')} +
+
+ {translate('UsenetDelay')} +
+
+ {translate('TorrentDelay')} +
+
+ {translate('Tags')} +
diff --git a/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContent.js b/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContent.js index 6868b4f31..b31e7ce5c 100644 --- a/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContent.js +++ b/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContent.js @@ -17,6 +17,13 @@ import { boolSettingShape, numberSettingShape, tagSettingShape } from 'Helpers/P import translate from 'Utilities/String/translate'; import styles from './EditDelayProfileModalContent.css'; +const protocolOptions = [ + { key: 'preferUsenet', value: translate('PreferUsenet') }, + { key: 'preferTorrent', value: translate('PreferTorrent') }, + { key: 'onlyUsenet', value: translate('OnlyUsenet') }, + { key: 'onlyTorrent', value: translate('OnlyTorrent') } +]; + function EditDelayProfileModalContent(props) { const { id, @@ -26,7 +33,6 @@ function EditDelayProfileModalContent(props) { saveError, item, protocol, - protocolOptions, onInputChange, onProtocolChange, onSavePress, @@ -46,29 +52,29 @@ function EditDelayProfileModalContent(props) { return ( - {id ? 'Edit Delay Profile' : 'Add Delay Profile'} + {id ? translate('EditDelayProfile') : translate('AddDelayProfile')} { - isFetching && - + isFetching ? + : + null } { - !isFetching && !!error && + !isFetching && !!error ?
{translate('UnableToAddANewQualityProfilePleaseTryAgain')} -
+
: + null } { - !isFetching && !error && + !isFetching && !error ?
- - {translate('Protocol')} - + {translate('PreferredProtocol')} - - {translate('UsenetDelay')} - + {translate('UsenetDelay')} - - {translate('TorrentDelay')} - + {translate('TorrentDelay')} - This is the default profile. It applies to all artist that don't have an explicit profile. + {translate('DefaultDelayProfileHelpText')} : - - {translate('Tags')} - + {translate('Tags')} } - + : + null } { - id && id > 1 && + id && id > 1 ? + {translate('Delete')} + : + null } - Save + {translate('Save')} @@ -186,7 +188,6 @@ EditDelayProfileModalContent.propTypes = { saveError: PropTypes.object, item: PropTypes.shape(delayProfileShape).isRequired, protocol: PropTypes.string.isRequired, - protocolOptions: PropTypes.arrayOf(PropTypes.object).isRequired, onInputChange: PropTypes.func.isRequired, onProtocolChange: PropTypes.func.isRequired, onSavePress: PropTypes.func.isRequired, diff --git a/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContentConnector.js b/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContentConnector.js index 65b700747..7606cb347 100644 --- a/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContentConnector.js +++ b/frontend/src/Settings/Profiles/Delay/EditDelayProfileModalContentConnector.js @@ -16,13 +16,6 @@ const newDelayProfile = { tags: [] }; -const protocolOptions = [ - { key: 'preferUsenet', value: 'Prefer Usenet' }, - { key: 'preferTorrent', value: 'Prefer Torrent' }, - { key: 'onlyUsenet', value: 'Only Usenet' }, - { key: 'onlyTorrent', value: 'Only Torrent' } -]; - function createDelayProfileSelector() { return createSelector( (state, { id }) => id, @@ -78,7 +71,6 @@ function createMapStateToProps() { return { protocol, - protocolOptions, ...delayProfile }; } diff --git a/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js b/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js index eda520bea..c6b9c4464 100644 --- a/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js +++ b/frontend/src/Settings/Profiles/Metadata/EditMetadataProfileModalContent.js @@ -46,7 +46,7 @@ function EditMetadataProfileModalContent(props) { return ( - {id ? 'Edit Metadata Profile' : 'Add Metadata Profile'} + {id ? translate('EditMetadataProfile') : translate('AddMetadataProfile')} @@ -117,7 +117,7 @@ function EditMetadataProfileModalContent(props) { isDisabled={isInUse} onPress={onDeleteMetadataProfilePress} > - Delete + {translate('Delete')}
} @@ -125,7 +125,7 @@ function EditMetadataProfileModalContent(props) { - Save + {translate('Save')} diff --git a/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js b/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js index edd41c55a..b275792e8 100644 --- a/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js +++ b/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js @@ -119,7 +119,7 @@ class EditQualityProfileModalContent extends Component { onMeasure={this.onHeaderMeasure} > - {id ? 'Edit Quality Profile' : 'Add Quality Profile'} + {id ? translate('EditQualityProfile') : translate('AddQualityProfile')} @@ -161,7 +161,7 @@ class EditQualityProfileModalContent extends Component { - Upgrades Allowed + {translate('UpgradesAllowed')} - Delete + {translate('Delete')} } @@ -234,7 +234,7 @@ class EditQualityProfileModalContent extends Component { - Save + {translate('Save')} diff --git a/frontend/src/Settings/Profiles/Release/EditReleaseProfileModalContent.js b/frontend/src/Settings/Profiles/Release/EditReleaseProfileModalContent.js index 486a707ff..200a65cde 100644 --- a/frontend/src/Settings/Profiles/Release/EditReleaseProfileModalContent.js +++ b/frontend/src/Settings/Profiles/Release/EditReleaseProfileModalContent.js @@ -43,7 +43,7 @@ function EditReleaseProfileModalContent(props) { return ( - {id ? 'Edit Release Profile' : 'Add Release Profile'} + {id ? translate('EditReleaseProfile') : translate('AddReleaseProfile')} @@ -170,14 +170,14 @@ function EditReleaseProfileModalContent(props) { kind={kinds.DANGER} onPress={onDeleteReleaseProfilePress} > - Delete + {translate('Delete')} } - Save + {translate('Save')} diff --git a/frontend/src/Settings/Quality/Definition/QualityDefinitions.js b/frontend/src/Settings/Quality/Definition/QualityDefinitions.js index e7303679d..392b9e1a7 100644 --- a/frontend/src/Settings/Quality/Definition/QualityDefinitions.js +++ b/frontend/src/Settings/Quality/Definition/QualityDefinitions.js @@ -25,9 +25,16 @@ class QualityDefinitions extends Component { {...otherProps} >
-
Quality
-
Title
-
Size Limit
+
+ {translate('Quality')} +
+
+ {translate('Title')} +
+
+ {translate('SizeLimit')} +
+ { advancedSettings ?
@@ -53,7 +60,7 @@ class QualityDefinitions extends Component {
- Limits are automatically adjusted for the album duration. + {translate('QualityLimitsHelpText')}
diff --git a/frontend/src/Settings/UI/UISettings.js b/frontend/src/Settings/UI/UISettings.js index 3bfc84e06..614ae659b 100644 --- a/frontend/src/Settings/UI/UISettings.js +++ b/frontend/src/Settings/UI/UISettings.js @@ -187,23 +187,19 @@ class UISettings extends Component { legend={translate('Style')} > - Theme + {translate('Theme')} - - {translate('EnableColorImpairedMode')} - - - Enable Color-Impaired Mode + {translate('EnableColorImpairedMode')} { @@ -324,12 +325,12 @@ export const defaultState = { }, { name: 'ratings', - label: 'Rating', + label: translate('Rating'), type: filterBuilderTypes.NUMBER }, { name: 'tags', - label: 'Tags', + label: translate('Tags'), type: filterBuilderTypes.ARRAY, valueType: filterBuilderValueTypes.TAG } diff --git a/frontend/src/Store/Actions/blocklistActions.js b/frontend/src/Store/Actions/blocklistActions.js index efc74640c..b529f10c6 100644 --- a/frontend/src/Store/Actions/blocklistActions.js +++ b/frontend/src/Store/Actions/blocklistActions.js @@ -4,6 +4,7 @@ import { sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; +import translate from 'Utilities/String/translate'; import { set, updateItem } from './baseActions'; import createHandleActions from './Creators/createHandleActions'; import createRemoveItemHandler from './Creators/createRemoveItemHandler'; @@ -32,36 +33,36 @@ export const defaultState = { columns: [ { name: 'artists.sortName', - label: 'Artist Name', + label: translate('ArtistName'), isSortable: true, isVisible: true }, { name: 'sourceTitle', - label: 'Source Title', + label: translate('SourceTitle'), isSortable: true, isVisible: true }, { name: 'quality', - label: 'Quality', + label: translate('Quality'), isVisible: true }, { name: 'date', - label: 'Date', + label: translate('Date'), isSortable: true, isVisible: true }, { name: 'indexer', - label: 'Indexer', + label: translate('Indexer'), isSortable: true, isVisible: false }, { name: 'actions', - columnLabel: 'Actions', + columnLabel: translate('Actions'), isVisible: true, isModifiable: false } diff --git a/frontend/src/Store/Actions/calendarActions.js b/frontend/src/Store/Actions/calendarActions.js index 8da7f44be..b7215ea76 100644 --- a/frontend/src/Store/Actions/calendarActions.js +++ b/frontend/src/Store/Actions/calendarActions.js @@ -7,6 +7,7 @@ import * as commandNames from 'Commands/commandNames'; import { filterTypes } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; +import translate from 'Utilities/String/translate'; import { set, update } from './baseActions'; import { executeCommandHelper } from './commandActions'; import createHandleActions from './Creators/createHandleActions'; @@ -50,7 +51,7 @@ export const defaultState = { filters: [ { key: 'all', - label: 'All', + label: translate('All'), filters: [ { key: 'monitored', @@ -61,7 +62,7 @@ export const defaultState = { }, { key: 'monitored', - label: 'Monitored Only', + label: translate('MonitoredOnly'), filters: [ { key: 'monitored', diff --git a/frontend/src/Store/Actions/historyActions.js b/frontend/src/Store/Actions/historyActions.js index aba7b5345..7bfdb5843 100644 --- a/frontend/src/Store/Actions/historyActions.js +++ b/frontend/src/Store/Actions/historyActions.js @@ -3,6 +3,7 @@ import { filterTypes, sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; +import translate from 'Utilities/String/translate'; import { updateItem } from './baseActions'; import createHandleActions from './Creators/createHandleActions'; import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers'; @@ -29,61 +30,61 @@ export const defaultState = { columns: [ { name: 'eventType', - columnLabel: 'Event Type', + columnLabel: translate('EventType'), isVisible: true, isModifiable: false }, { name: 'artists.sortName', - label: 'Artist', + label: translate('Artist'), isSortable: true, isVisible: true }, { name: 'albums.title', - label: 'Album Title', + label: translate('AlbumTitle'), isSortable: true, isVisible: true }, { name: 'trackTitle', - label: 'Track Title', + label: translate('TrackTitle'), isVisible: true }, { name: 'quality', - label: 'Quality', + label: translate('Quality'), isVisible: true }, { name: 'date', - label: 'Date', + label: translate('Date'), isSortable: true, isVisible: true }, { name: 'downloadClient', - label: 'Download Client', + label: translate('DownloadClient'), isVisible: false }, { name: 'indexer', - label: 'Indexer', + label: translate('Indexer'), isVisible: false }, { name: 'releaseGroup', - label: 'Release Group', + label: translate('ReleaseGroup'), isVisible: false }, { name: 'sourceTitle', - label: 'Source Title', + label: translate('SourceTitle'), isVisible: false }, { name: 'details', - columnLabel: 'Details', + columnLabel: translate('Details'), isVisible: true, isModifiable: false } @@ -94,12 +95,12 @@ export const defaultState = { filters: [ { key: 'all', - label: 'All', + label: translate('All'), filters: [] }, { key: 'grabbed', - label: 'Grabbed', + label: translate('Grabbed'), filters: [ { key: 'eventType', @@ -110,7 +111,7 @@ export const defaultState = { }, { key: 'trackFileImported', - label: 'Track Imported', + label: translate('TrackImported'), filters: [ { key: 'eventType', @@ -121,7 +122,7 @@ export const defaultState = { }, { key: 'failed', - label: 'Download Failed', + label: translate('DownloadFailed'), filters: [ { key: 'eventType', @@ -132,7 +133,7 @@ export const defaultState = { }, { key: 'importFailed', - label: 'Import Failed', + label: translate('ImportFailed'), filters: [ { key: 'eventType', @@ -143,7 +144,7 @@ export const defaultState = { }, { key: 'downloadImported', - label: 'Download Imported', + label: translate('DownloadImported'), filters: [ { key: 'eventType', @@ -154,7 +155,7 @@ export const defaultState = { }, { key: 'deleted', - label: 'Deleted', + label: translate('Deleted'), filters: [ { key: 'eventType', @@ -165,7 +166,7 @@ export const defaultState = { }, { key: 'renamed', - label: 'Renamed', + label: translate('Renamed'), filters: [ { key: 'eventType', @@ -176,7 +177,7 @@ export const defaultState = { }, { key: 'retagged', - label: 'Retagged', + label: translate('Retagged'), filters: [ { key: 'eventType', @@ -187,7 +188,7 @@ export const defaultState = { }, { key: 'ignored', - label: 'Ignored', + label: translate('Ignored'), filters: [ { key: 'eventType', diff --git a/frontend/src/Store/Actions/queueActions.js b/frontend/src/Store/Actions/queueActions.js index 581427959..4449f24d4 100644 --- a/frontend/src/Store/Actions/queueActions.js +++ b/frontend/src/Store/Actions/queueActions.js @@ -5,6 +5,7 @@ import { sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; +import translate from 'Utilities/String/translate'; import { set, updateItem } from './baseActions'; import createFetchHandler from './Creators/createFetchHandler'; import createHandleActions from './Creators/createHandleActions'; @@ -57,86 +58,86 @@ export const defaultState = { columns: [ { name: 'status', - columnLabel: 'Status', + columnLabel: translate('Status'), isSortable: true, isVisible: true, isModifiable: false }, { name: 'artists.sortName', - label: 'Artist', + label: translate('Artist'), isSortable: true, isVisible: true }, { name: 'albums.title', - label: 'Album Title', + label: translate('AlbumTitle'), isSortable: true, isVisible: true }, { name: 'albums.releaseDate', - label: 'Album Release Date', + label: translate('AlbumReleaseDate'), isSortable: true, isVisible: false }, { name: 'quality', - label: 'Quality', + label: translate('Quality'), isSortable: true, isVisible: true }, { name: 'protocol', - label: 'Protocol', + label: translate('Protocol'), isSortable: true, isVisible: false }, { name: 'indexer', - label: 'Indexer', + label: translate('Indexer'), isSortable: true, isVisible: false }, { name: 'downloadClient', - label: 'Download Client', + label: translate('DownloadClient'), isSortable: true, isVisible: false }, { name: 'title', - label: 'Release Title', + label: translate('ReleaseTitle'), isSortable: true, isVisible: false }, { name: 'size', - label: 'Size', + label: translate('Size'), isSortable: true, isVisibile: false }, { name: 'outputPath', - label: 'Output Path', + label: translate('OutputPath'), isSortable: false, isVisible: false }, { name: 'estimatedCompletionTime', - label: 'Time Left', + label: translate('TimeLeft'), isSortable: true, isVisible: true }, { name: 'progress', - label: 'Progress', + label: translate('Progress'), isSortable: true, isVisible: true }, { name: 'actions', - columnLabel: 'Actions', + columnLabel: translate('Actions'), isVisible: true, isModifiable: false } diff --git a/frontend/src/Store/Actions/releaseActions.js b/frontend/src/Store/Actions/releaseActions.js index 0adf2d12b..582f6e361 100644 --- a/frontend/src/Store/Actions/releaseActions.js +++ b/frontend/src/Store/Actions/releaseActions.js @@ -2,6 +2,7 @@ import { createAction } from 'redux-actions'; import { filterBuilderTypes, filterBuilderValueTypes, filterTypes, sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; +import translate from 'Utilities/String/translate'; import createFetchHandler from './Creators/createFetchHandler'; import createHandleActions from './Creators/createHandleActions'; import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer'; @@ -51,12 +52,12 @@ export const defaultState = { filters: [ { key: 'all', - label: 'All', + label: translate('All'), filters: [] }, { key: 'discography-pack', - label: 'Discography', + label: translate('Discography'), filters: [ { key: 'discography', @@ -67,7 +68,7 @@ export const defaultState = { }, { key: 'not-discography-pack', - label: 'Not Discography', + label: translate('NotDiscography'), filters: [ { key: 'discography', @@ -154,51 +155,51 @@ export const defaultState = { filterBuilderProps: [ { name: 'title', - label: 'Title', + label: translate('Title'), type: filterBuilderTypes.STRING }, { name: 'age', - label: 'Age', + label: translate('Age'), type: filterBuilderTypes.NUMBER }, { name: 'protocol', - label: 'Protocol', + label: translate('Protocol'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.PROTOCOL }, { name: 'indexerId', - label: 'Indexer', + label: translate('Indexer'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.INDEXER }, { name: 'size', - label: 'Size', + label: translate('Size'), type: filterBuilderTypes.NUMBER, valueType: filterBuilderValueTypes.BYTES }, { name: 'seeders', - label: 'Seeders', + label: translate('Seeders'), type: filterBuilderTypes.NUMBER }, { name: 'leechers', - label: 'Peers', + label: translate('Peers'), type: filterBuilderTypes.NUMBER }, { name: 'quality', - label: 'Quality', + label: translate('Quality'), type: filterBuilderTypes.EXACT, valueType: filterBuilderValueTypes.QUALITY }, { name: 'rejectionCount', - label: 'Rejection Count', + label: translate('RejectionCount'), type: filterBuilderTypes.NUMBER } ], diff --git a/frontend/src/Store/Actions/systemActions.js b/frontend/src/Store/Actions/systemActions.js index eac93e69c..4910e462d 100644 --- a/frontend/src/Store/Actions/systemActions.js +++ b/frontend/src/Store/Actions/systemActions.js @@ -121,12 +121,12 @@ export const defaultState = { filters: [ { key: 'all', - label: 'All', + label: translate('All'), filters: [] }, { key: 'info', - label: 'Info', + label: translate('Info'), filters: [ { key: 'level', @@ -137,7 +137,7 @@ export const defaultState = { }, { key: 'warn', - label: 'Warn', + label: translate('Warn'), filters: [ { key: 'level', @@ -148,7 +148,7 @@ export const defaultState = { }, { key: 'error', - label: 'Error', + label: translate('Error'), filters: [ { key: 'level', diff --git a/frontend/src/Store/Actions/trackActions.js b/frontend/src/Store/Actions/trackActions.js index d8f474159..d40e2860d 100644 --- a/frontend/src/Store/Actions/trackActions.js +++ b/frontend/src/Store/Actions/trackActions.js @@ -1,6 +1,7 @@ import { createAction } from 'redux-actions'; import { sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; +import translate from 'Utilities/String/translate'; import createFetchHandler from './Creators/createFetchHandler'; import createHandleActions from './Creators/createHandleActions'; import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer'; @@ -27,42 +28,42 @@ export const defaultState = { columns: [ { name: 'medium', - label: 'Medium', + label: translate('Medium'), isVisible: false }, { name: 'absoluteTrackNumber', - label: 'Track', + label: translate('Track'), isVisible: true }, { name: 'title', - label: 'Title', + label: translate('Title'), isVisible: true }, { name: 'path', - label: 'Path', + label: translate('Path'), isVisible: false }, { name: 'duration', - label: 'Duration', + label: translate('Duration'), isVisible: true }, { name: 'audioInfo', - label: 'Audio Info', + label: translate('AudioInfo'), isVisible: true }, { name: 'status', - label: 'Status', + label: translate('Status'), isVisible: true }, { name: 'actions', - columnLabel: 'Actions', + columnLabel: translate('Actions'), isVisible: true, isModifiable: false } diff --git a/frontend/src/Store/Actions/trackFileActions.js b/frontend/src/Store/Actions/trackFileActions.js index cf676ddd2..0e4f91d54 100644 --- a/frontend/src/Store/Actions/trackFileActions.js +++ b/frontend/src/Store/Actions/trackFileActions.js @@ -5,6 +5,7 @@ import albumEntities from 'Album/albumEntities'; import { sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import createAjaxRequest from 'Utilities/createAjaxRequest'; +import translate from 'Utilities/String/translate'; import { removeItem, set, updateItem } from './baseActions'; import createFetchHandler from './Creators/createFetchHandler'; import createHandleActions from './Creators/createHandleActions'; @@ -43,32 +44,32 @@ export const defaultState = { columns: [ { name: 'path', - label: 'Path', + label: translate('Path'), isSortable: true, isVisible: true, isModifiable: false }, { name: 'size', - label: 'Size', + label: translate('Size'), isSortable: true, isVisible: true }, { name: 'dateAdded', - label: 'Date Added', + label: translate('DateAdded'), isSortable: true, isVisible: true }, { name: 'quality', - label: 'Quality', + label: translate('Quality'), isSortable: true, isVisible: true }, { name: 'actions', - columnLabel: 'Actions', + columnLabel: translate('Actions'), isVisible: true, isModifiable: false } diff --git a/frontend/src/Store/Actions/wantedActions.js b/frontend/src/Store/Actions/wantedActions.js index f8a63d982..da7fd2162 100644 --- a/frontend/src/Store/Actions/wantedActions.js +++ b/frontend/src/Store/Actions/wantedActions.js @@ -2,6 +2,7 @@ import { createAction } from 'redux-actions'; import { filterTypes, sortDirections } from 'Helpers/Props'; import { createThunk, handleThunks } from 'Store/thunks'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; +import translate from 'Utilities/String/translate'; import createBatchToggleAlbumMonitoredHandler from './Creators/createBatchToggleAlbumMonitoredHandler'; import createHandleActions from './Creators/createHandleActions'; import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers'; @@ -29,25 +30,25 @@ export const defaultState = { columns: [ { name: 'artists.sortName', - label: 'Artist Name', + label: translate('ArtistName'), isSortable: true, isVisible: true }, { name: 'albums.title', - label: 'Album Title', + label: translate('AlbumTitle'), isSortable: true, isVisible: true }, { name: 'albumType', - label: 'Album Type', + label: translate('AlbumType'), isSortable: true, isVisible: true }, { name: 'releaseDate', - label: 'Release Date', + label: translate('ReleaseDate'), isSortable: true, isVisible: true }, @@ -58,7 +59,7 @@ export const defaultState = { // }, { name: 'actions', - columnLabel: 'Actions', + columnLabel: translate('Actions'), isVisible: true, isModifiable: false } @@ -69,7 +70,7 @@ export const defaultState = { filters: [ { key: 'monitored', - label: 'Monitored', + label: translate('Monitored'), filters: [ { key: 'monitored', @@ -80,7 +81,7 @@ export const defaultState = { }, { key: 'unmonitored', - label: 'Unmonitored', + label: translate('Unmonitored'), filters: [ { key: 'monitored', @@ -103,25 +104,25 @@ export const defaultState = { columns: [ { name: 'artists.sortName', - label: 'Artist Name', + label: translate('ArtistName'), isSortable: true, isVisible: true }, { name: 'albums.title', - label: 'Album Title', + label: translate('AlbumTitle'), isSortable: true, isVisible: true }, { name: 'albumType', - label: 'Album Type', + label: translate('AlbumType'), isSortable: true, isVisible: true }, { name: 'releaseDate', - label: 'Release Date', + label: translate('ReleaseDate'), isSortable: true, isVisible: true }, @@ -132,7 +133,7 @@ export const defaultState = { // }, { name: 'actions', - columnLabel: 'Actions', + columnLabel: translate('Actions'), isVisible: true, isModifiable: false } @@ -143,7 +144,7 @@ export const defaultState = { filters: [ { key: 'monitored', - label: 'Monitored', + label: translate('Monitored'), filters: [ { key: 'monitored', @@ -154,7 +155,7 @@ export const defaultState = { }, { key: 'unmonitored', - label: 'Unmonitored', + label: translate('Unmonitored'), filters: [ { key: 'monitored', diff --git a/frontend/src/System/Backup/BackupRow.js b/frontend/src/System/Backup/BackupRow.js index 53274f289..a7f122e6f 100644 --- a/frontend/src/System/Backup/BackupRow.js +++ b/frontend/src/System/Backup/BackupRow.js @@ -76,14 +76,14 @@ class BackupRow extends Component { } = this.state; let iconClassName = icons.SCHEDULED; - let iconTooltip = translate('IconTooltip'); + 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 ( diff --git a/frontend/src/System/Backup/Backups.js b/frontend/src/System/Backup/Backups.js index 67aa72cc3..7a5e399d0 100644 --- a/frontend/src/System/Backup/Backups.js +++ b/frontend/src/System/Backup/Backups.js @@ -20,17 +20,17 @@ const columns = [ }, { name: 'name', - label: 'Name', + label: translate('Name'), isVisible: true }, { name: 'size', - label: 'Size', + label: translate('Size'), isVisible: true }, { name: 'time', - label: 'Time', + label: translate('Time'), isVisible: true }, { diff --git a/frontend/src/System/Backup/RestoreBackupModalContent.js b/frontend/src/System/Backup/RestoreBackupModalContent.js index 24926e685..a277a5499 100644 --- a/frontend/src/System/Backup/RestoreBackupModalContent.js +++ b/frontend/src/System/Backup/RestoreBackupModalContent.js @@ -14,7 +14,7 @@ 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; @@ -146,7 +146,7 @@ class RestoreBackupModalContent extends Component { { - !!id && `Would you like to restore the backup '${name}'?` + !!id && translate('WouldYouLikeToRestoreBackup', [name]) } { @@ -203,11 +203,11 @@ class RestoreBackupModalContent extends Component {
- Note: Lidarr will automatically restart and reload the UI during the restore process. + {translate('RestoreBackupAdditionalInfo')}
- Restore + {translate('Restore')}
diff --git a/frontend/src/System/Logs/Files/LogFiles.js b/frontend/src/System/Logs/Files/LogFiles.js index aceb19351..48ac75ddb 100644 --- a/frontend/src/System/Logs/Files/LogFiles.js +++ b/frontend/src/System/Logs/Files/LogFiles.js @@ -19,12 +19,12 @@ import LogFilesTableRow from './LogFilesTableRow'; const columns = [ { name: 'filename', - label: 'Filename', + label: translate('Filename'), isVisible: true }, { name: 'lastWriteTime', - label: 'Last Write Time', + label: translate('LastWriteTime'), isVisible: true }, { diff --git a/frontend/src/System/Status/DiskSpace/DiskSpace.js b/frontend/src/System/Status/DiskSpace/DiskSpace.js index 87674c7a9..b05b27f4b 100644 --- a/frontend/src/System/Status/DiskSpace/DiskSpace.js +++ b/frontend/src/System/Status/DiskSpace/DiskSpace.js @@ -15,17 +15,17 @@ import styles from './DiskSpace.css'; const columns = [ { name: 'path', - label: 'Location', + label: translate('Location'), isVisible: true }, { name: 'freeSpace', - label: 'Free Space', + label: translate('FreeSpace'), isVisible: true }, { name: 'totalSpace', - label: 'Total Space', + label: translate('TotalSpace'), isVisible: true }, { diff --git a/frontend/src/System/Status/Donations/Donations.js b/frontend/src/System/Status/Donations/Donations.js index 220fbee25..b3bff8dff 100644 --- a/frontend/src/System/Status/Donations/Donations.js +++ b/frontend/src/System/Status/Donations/Donations.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import FieldSet from 'Components/FieldSet'; import Link from 'Components/Link/Link'; +import translate from 'Utilities/String/translate'; import styles from '../styles.css'; class Donations extends Component { @@ -10,7 +11,7 @@ class Donations extends Component { render() { return ( -
+
- Close + {translate('Close')} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 88662d08c..4dc606652 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -5,34 +5,61 @@ "About": "About", "Absolute": "Absolute", "Actions": "Actions", + "Activity": "Activity", + "Add": "Add", + "AddConnection": "Add Connection", + "AddDelayProfile": "Add Delay Profile", + "Added": "Added", "AddedArtistSettings": "Added Artist Settings", + "AddImportListExclusion": "Add Import List Exclusion", "AddImportListExclusionHelpText": "Prevent artist from being added to Lidarr by Import lists", + "AddIndexer": "Add Indexer", "AddingTag": "Adding tag", + "AddList": "Add List", "AddListExclusion": "Add List Exclusion", + "AddMetadataProfile": "Add Metadata Profile", "AddMissing": "Add missing", + "AddNew": "Add New", "AddNewItem": "Add New Item", + "AddQualityProfile": "Add Quality Profile", + "AddReleaseProfile": "Add Release Profile", + "AddRemotePathMapping": "Add Remote Path Mapping", + "AddRootFolder": "Add Root Folder", "AdvancedSettingsHiddenClickToShow": "Hidden, click to show", "AdvancedSettingsShownClickToHide": "Shown, click to hide", + "AfterManualRefresh": "After Manual Refresh", + "Age": "Age", "AgeWhenGrabbed": "Age (when grabbed)", "Album": "Album", "AlbumHasNotAired": "Album has not aired", "AlbumIsDownloading": "Album is downloading", "AlbumIsDownloadingInterp": "Album is downloading - {0}% {1}", "AlbumIsNotMonitored": "Album is not monitored", + "AlbumRelease": "Album Release", + "AlbumReleaseDate": "Album Release Date", + "Albums": "Albums", + "AlbumStatus": "Album Status", "AlbumStudio": "Album Studio", + "AlbumTitle": "Album Title", + "AlbumType": "Album Type", + "All": "All", "AllAlbums": "All Albums", "AllAlbumsData": "Monitor all albums except specials", "AllArtistAlbums": "All Artist Albums", "AllExpandedCollapseAll": "Collapse All", "AllExpandedExpandAll": "Expand All", + "AllFiles": "All Files", + "AllMonitoringOptionHelpText": "Monitor artists and all albums for each artist included on the import list", "AllowArtistChangeClickToChangeArtist": "Click to change artist", "AllowFingerprinting": "Allow Fingerprinting", "AllowFingerprintingHelpText": "Use fingerprinting to improve accuracy of track matching", "AllowFingerprintingHelpTextWarning": "This requires Lidarr to read parts of the file which will slow down scans and may cause high disk or network activity.", + "AllResultsFiltered": "All results are hidden by the applied filter", "AlreadyInYourLibrary": "Already in your library", "AlternateTitles": "Alternate Titles", "AlternateTitleslength1Title": "Title", "AlternateTitleslength1Titles": "Titles", + "Always": "Always", "Analytics": "Analytics", "AnalyticsEnabledHelpText": "Send anonymous usage and error information to Lidarr's servers. This includes information on your browser, which Lidarr WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes.", "AnalyticsEnabledHelpTextWarning": "Requires restart to take effect", @@ -43,28 +70,35 @@ "AppDataDirectory": "AppData directory", "ApplicationURL": "Application URL", "ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base", + "Apply": "Apply", "ApplyTags": "Apply Tags", "ApplyTagsHelpTexts1": "How to apply tags to the selected artist", "ApplyTagsHelpTexts2": "Add: Add the tags the existing list of tags", "ApplyTagsHelpTexts3": "Remove: Remove the entered tags", "ApplyTagsHelpTexts4": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)", + "AreYouSure": "Are you sure?", "Artist": "Artist", "ArtistAlbumClickToChangeTrack": "Click to change track", "ArtistClickToChangeAlbum": "Click to change album", "ArtistEditor": "Artist Editor", "ArtistFolderFormat": "Artist Folder Format", + "ArtistName": "Artist Name", "ArtistNameHelpText": "The name of the artist/album to exclude (can be anything meaningful)", "Artists": "Artists", + "ArtistType": "Artist Type", + "AudioInfo": "Audio Info", "Authentication": "Authentication", "AuthenticationMethodHelpText": "Require Username and Password to access Lidarr", "Automatic": "Automatic", "AutomaticallySwitchRelease": "Automatically Switch Release", "AutoRedownloadFailedHelpText": "Automatically search for and attempt to download a different release", + "Backup": "Backup", "BackupFolderHelpText": "Relative paths will be under Lidarr's AppData directory", "BackupIntervalHelpText": "Interval to backup the Lidarr DB and settings", "BackupNow": "Backup Now", "BackupRetentionHelpText": "Automatic backups older than the retention period will be cleaned up automatically", "Backups": "Backups", + "BeforeUpdate": "Before Update", "BindAddress": "Bind Address", "BindAddressHelpText": "Valid IPv4 address or '*' for all interfaces", "BindAddressHelpTextWarning": "Requires restart to take effect", @@ -93,27 +127,36 @@ "ClientPriority": "Client Priority", "CloneIndexer": "Clone Indexer", "CloneProfile": "Clone Profile", + "Close": "Close", "CollapseMultipleAlbums": "Collapse Multiple Albums", "CollapseMultipleAlbumsHelpText": "Collapse multiple albums releasing on the same day", "Columns": "Columns", + "CombineWithExistingFiles": "Combine With Existing Files", "CompletedDownloadHandling": "Completed Download Handling", "Component": "Component", + "Connect": "Connect", "Connections": "Connections", "ConnectSettings": "Connect Settings", "Continuing": "Continuing", "ContinuingAllTracksDownloaded": "Continuing (All tracks downloaded)", "ContinuingMoreAlbumsAreExpected": "More albums are expected", "ContinuingNoAdditionalAlbumsAreExpected": "No additional albums are expected", + "ContinuingOnly": "ContinuingOnly", "CopyUsingHardlinksHelpText": "Use Hardlinks when trying to copy files from torrents that are still being seeded", "CopyUsingHardlinksHelpTextWarning": "Occasionally, file locks may prevent renaming files that are being seeded. You may temporarily disable seeding and use Lidarr's rename function as a work around.", "Country": "Country", "CreateEmptyArtistFolders": "Create empty artist folders", "CreateEmptyArtistFoldersHelpText": "Create missing artist folders during disk scan", "CreateGroup": "Create group", + "Custom": "Custom", + "CustomFilters": "Custom Filters", "CutoffHelpText": "Once this quality is reached Lidarr will no longer download albums", "CutoffUnmet": "Cutoff Unmet", + "Date": "Date", + "DateAdded": "Date Added", "Dates": "Dates", "DBMigration": "DB Migration", + "DefaultDelayProfileHelpText": "This is the default profile. It applies to all artist that don't have an explicit profile.", "DefaultLidarrTags": "Default Lidarr Tags", "DefaultMetadataProfileIdHelpText": "Default Metadata Profile for artists detected in this folder", "DefaultMonitorOptionHelpText": "Which albums should be monitored on initial add for artists detected in this folder", @@ -123,8 +166,10 @@ "DelayProfile": "Delay Profile", "DelayProfiles": "Delay Profiles", "Delete": "Delete", + "DeleteArtist": "Delete Selected Artist", "DeleteBackup": "Delete Backup", "DeleteBackupMessageText": "Are you sure you want to delete the backup '{0}'?", + "Deleted": "Deleted", "DeleteDelayProfile": "Delete Delay Profile", "DeleteDelayProfileMessageText": "Are you sure you want to delete this delay profile?", "DeleteDownloadClient": "Delete Download Client", @@ -157,16 +202,23 @@ "DestinationPath": "Destination Path", "DetailedProgressBar": "Detailed Progress Bar", "DetailedProgressBarHelpText": "Show text on progess bar", + "Details": "Details", "Disambiguation": "Disambiguation", "DiscCount": "Disc Count", "DiscNumber": "Disc Number", + "Discography": "Discography", "DiskSpace": "Disk Space", "Docker": "Docker", + "Donations": "Donations", + "DoNotPrefer": "Do Not Prefer", + "DoNotUpgradeAutomatically": "Do not Upgrade Automatically", "DownloadClient": "Download Client", "DownloadClients": "Download Clients", "DownloadClientSettings": "Download Client Settings", + "DownloadFailed": "Download Failed", "DownloadFailedCheckDownloadClientForMoreDetails": "Download failed: check download client for more details", "DownloadFailedInterp": "Download failed: {0}", + "DownloadImported": "Download Imported", "Downloading": "Downloading", "DownloadPropersAndRepacksHelpTexts1": "Whether or not to automatically upgrade to Propers/Repacks", "DownloadPropersAndRepacksHelpTexts2": "Use 'Do not Prefer' to sort by preferred word score over propers/repacks", @@ -174,6 +226,17 @@ "Duration": "Duration", "Edit": "Edit", "EditArtist": "Edit Artist", + "EditConnection": "Edit Connection", + "EditDelayProfile": "Edit Delay Profile", + "EditImportListExclusion": "Edit Import List Exclusion", + "EditIndexer": "Edit Indexer", + "EditList": "Edit List", + "EditMetadata": "Edit Metadata", + "EditMetadataProfile": "Edit Metadata Profile", + "EditQualityProfile": "Edit Quality Profile", + "EditReleaseProfile": "Edit Release Profile", + "EditRemotePathMapping": "Edit Remote Path Mapping", + "EditRootFolder": "Edit Root Folder", "Enable": "Enable", "EnableAutomaticAdd": "Enable Automatic Add", "EnableAutomaticAddHelpText": "Add artist/albums to Lidarr when syncs are performed via the UI or by Lidarr", @@ -190,11 +253,16 @@ "EnableSslHelpText": " Requires restart running as administrator to take effect", "Ended": "Ended", "EndedAllTracksDownloaded": "Ended (All tracks downloaded)", + "EndedOnly": "Ended Only", "EntityName": "Entity Name", "Episode": "Episode", "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Episode does not have an absolute episode number", + "Error": "Error", "ErrorLoadingContents": "Error loading contents", "ErrorLoadingPreviews": "Error loading previews", + "ErrorRestoringBackup": "Error restoring backup", + "Events": "Events", + "EventType": "Event Type", "Exception": "Exception", "ExistingAlbums": "Existing Albums", "ExistingAlbumsData": "Monitor albums that have files or have not released yet", @@ -213,6 +281,7 @@ "FileNames": "File Names", "Files": "Files", "FilterPlaceHolder": "Filter artist", + "Filters": "Filters", "FirstAlbum": "First Album", "FirstAlbumData": "Monitor the first albums. All other albums will be ignored", "FirstDayOfWeek": "First Day of Week", @@ -223,23 +292,30 @@ "ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "For more information on the individual download clients, click the more info buttons.", "ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons": "For more information on the individual indexers, click on the info buttons.", "ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "For more information on the individual lists, click on the info buttons.", + "ForNewImportsOnly": "For new imports only", + "FreeSpace": "Free Space", "FutureAlbums": "Future Albums", "FutureAlbumsData": "Monitor albums that have not released yet", "FutureDays": "Future Days", "FutureDaysHelpText": "Days for iCal feed to look into the future", + "General": "General", "GeneralSettings": "General Settings", + "Genres": "Genres", "Global": "Global", "GoToArtistListing": "Go to artist listing", "GoToInterp": "Go to {0}", "Grab": "Grab", + "Grabbed": "Grabbed", "GrabID": "Grab ID", "GrabRelease": "Grab Release", "GrabReleaseMessageText": "Lidarr was unable to determine which artist and album this release was for. Lidarr may be unable to automatically import this release. Do you want to grab '{0}'?", "GrabSelected": "Grab Selected", "Group": "Group", + "HardlinkCopyFiles": "Hardlink/Copy Files", "HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "No monitored albums for this artist", "HasPendingChangesNoChanges": "No Changes", "HasPendingChangesSaveChanges": "Save Changes", + "HideAdvanced": "Hide Advanced", "HideAlbums": "Hide albums", "HideTracks": "Hide tracks", "History": "History", @@ -252,13 +328,16 @@ "IconForCutoffUnmet": "Icon for Cutoff Unmet", "IconTooltip": "Scheduled", "IfYouDontAddAnImportListExclusionAndTheArtistHasAMetadataProfileOtherThanNoneThenThisAlbumMayBeReaddedDuringTheNextArtistRefresh": "If you don't add an import list exclusion and the artist has a metadata profile other than 'None' then this album may be re-added during the next artist refresh.", + "Ignored": "Ignored", "IgnoredAddresses": "Ignored Addresses", "IgnoredHelpText": "The release will be rejected if it contains one or more of terms (case insensitive)", "IgnoredPlaceHolder": "Add new restriction", "IllRestartLater": "I'll restart later", + "Import": "Import", "ImportedTo": "Imported To", "ImportExtraFiles": "Import Extra Files", "ImportExtraFilesHelpText": "Import matching extra files (subtitles, nfo, etc) after importing an track file", + "ImportFailed": "Import Failed", "ImportFailedInterp": "Import failed: {0}", "ImportFailures": "Import failures", "Importing": "Importing", @@ -280,8 +359,10 @@ "Indexers": "Indexers", "IndexerSettings": "Indexer Settings", "IndexerTagHelpText": "Only use this indexer for artist with at least one matching tag. Leave blank to use with all artists.", + "Info": "Info", "InstanceName": "Instance Name", "InstanceNameHelpText": "Instance name in tab and for Syslog app name", + "InteractiveImport": "Interactive Import", "InteractiveSearch": "Interactive Search", "Interval": "Interval", "IsCutoffCutoff": "Cutoff", @@ -299,11 +380,16 @@ "IsTagUsedCannotBeDeletedWhileInUse": "Cannot be deleted while in use", "Label": "Label", "Language": "Language", + "LastAlbum": "Last Album", + "LastDuration": "Last Duration", + "LastExecution": "Last Execution", + "LastUsed": "Last Used", + "LastWriteTime": "Last Write Time", "LatestAlbum": "Latest Album", "LatestAlbumData": "Monitor the latest albums and future albums", "LaunchBrowserHelpText": " Open a web browser and navigate to Lidarr homepage on app start.", "Level": "Level", - "Lidarr": "Lidarr", + "Library": "Library", "LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "Lidarr supports many popular torrent and usenet download clients.", "LidarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow": "Lidarr supports any indexer that uses the Newznab standard, as well as other indexers listed below.", "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "Lidarr supports multiple lists for importing Albums and Artists into the database.", @@ -313,6 +399,7 @@ "Local": "Local", "LocalPath": "Local Path", "LocalPathHelpText": "Path that Lidarr should use to access the remote path locally", + "Location": "Location", "LogFiles": "Log Files", "Logging": "Logging", "LogLevel": "Log Level", @@ -321,21 +408,26 @@ "LongDateFormat": "Long Date Format", "MaintenanceRelease": "Maintenance release", "ManageTracks": "Manage Tracks", + "Manual": "Manual", "ManualDownload": "Manual Download", "ManualImport": "Manual Import", "MarkAsFailed": "Mark as Failed", "MarkAsFailedMessageText": "Are you sure you want to mark '{0}' as failed?", "MassAlbumsCutoffUnmetWarning": "Are you sure you want to search for all '{0}' Cutoff Unmet albums?", "MassAlbumsSearchWarning": "Are you sure you want to search for all '{0}' missing albums?", + "MassEditor": "Mass Editor", "MaximumLimits": "Maximum Limits", "MaximumSize": "Maximum Size", "MaximumSizeHelpText": "Maximum size for a release to be grabbed in MB. Set to zero to set to unlimited.", "Mechanism": "Mechanism", + "MediaCount": "Media Count", "MediaInfo": "Media Info", + "MediaManagement": "MediaManagement", "MediaManagementSettings": "Media Management Settings", "Medium": "Medium", "MediumFormat": "Medium Format", "Message": "Message", + "Metadata": "Metadata", "MetadataConsumers": "Metadata Consumers", "MetadataProfile": "Metadata Profile", "MetadataProfileIdHelpText": "Metadata Profile list items should be added with", @@ -353,6 +445,7 @@ "Missing": "Missing", "MissingAlbums": "Missing Albums", "MissingAlbumsData": "Monitor albums that do not have files or have not released yet", + "MissingTracks": "Missing Tracks", "MissingTracksArtistMonitored": "Missing Tracks (Artist monitored)", "MissingTracksArtistNotMonitored": "Missing Tracks (Artist not monitored)", "Mode": "Mode", @@ -360,12 +453,15 @@ "MonitorArtist": "Monitor Artist", "Monitored": "Monitored", "MonitoredHelpText": "Download monitored albums from this artist", + "MonitoredOnly": "Monitored Only", "MonitoringOptions": "Monitoring Options", "MonitoringOptionsHelpText": "Which albums should be monitored after the artist is added (one-time adjustment)", "MonitorNewItems": "Monitor New Albums", "MonitorNewItemsHelpText": "Which new albums should be monitored", "MonoVersion": "Mono Version", "MoreInfo": "More Info", + "MoveAutomatically": "Move Automatically", + "MoveFiles": "Move Files", "MultiDiscTrackFormat": "Multi Disc Track Format", "MusicBrainzAlbumID": "MusicBrainz Album ID", "MusicBrainzArtistID": "MusicBrainz Artist ID", @@ -378,8 +474,11 @@ "Name": "Name", "NamingSettings": "Naming Settings", "NETCore": ".NET", + "Never": "Never", "New": "New", "NewAlbums": "New Albums", + "NextAlbum": "Next Album", + "NextExecution": "Next Execution", "NoBackupsAreAvailable": "No backups are available", "NoHistory": "No history.", "NoLeaveIt": "No, Leave It", @@ -388,9 +487,13 @@ "NoMinimumForAnyRuntime": "No minimum for any runtime", "None": "None", "NoneData": "No albums will be monitored", + "NoneMonitoringOptionHelpText": "Do not monitor artists or albums", + "NoResults": "No Results Found", "NoTagsHaveBeenAddedYet": "No tags have been added yet", + "NotDiscography": "Not Discography", "NotificationTriggers": "Notification Triggers", "NoUpdatesAreAvailable": "No updates are available", + "Ok": "Ok", "OnApplicationUpdate": "On Application Update", "OnApplicationUpdateHelpText": "On Application Update", "OnDownloadFailure": "On Download Failure", @@ -401,6 +504,8 @@ "OnHealthIssueHelpText": "On Health Issue", "OnImportFailure": "On Import Failure", "OnImportFailureHelpText": "On Import Failure", + "OnlyTorrent": "Only Torrent", + "OnlyUsenet": "Only Usenet", "OnReleaseImport": "On Release Import", "OnReleaseImportHelpText": "On Release Import", "OnRename": "On Rename", @@ -411,8 +516,11 @@ "OnUpgradeHelpText": "On Upgrade", "OpenBrowserOnStart": "Open browser on start", "Options": "Options", + "Organize": "Organize", + "OrganizeArtist": "Organize Selected Artist", "Original": "Original", "Other": "Other", + "OutputPath": "Output Path", "PackageVersion": "Package Version", "PageSize": "Page Size", "PageSizeHelpText": "Number of items to show on each page", @@ -422,20 +530,28 @@ "Path": "Path", "PathHelpText": "Root Folder containing your music library", "PathHelpTextWarning": "This must be different to the directory where your download client puts files", + "Peers": "Peers", "Permissions": "Permissions", + "Playlist": "Playlist", "Port": "Port", "PortNumber": "Port Number", "PosterSize": "Poster Size", + "PreferAndUpgrade": "Prefer and Upgrade", "Preferred": "Preferred", "PreferredHelpTexts1": "The release will be preferred based on the each term's score (case insensitive)", "PreferredHelpTexts2": "A positive score will be more preferred", "PreferredHelpTexts3": "A negative score will be less preferred", + "PreferredProtocol": "Preferred Protocol", + "PreferredWordScore": "Preferred word score", + "Presets": "Presets", "PreviewRename": "Preview Rename", "PreviewRetag": "Preview Retag", "PrimaryAlbumTypes": "Primary Album Types", "PrimaryTypes": "Primary Types", "PriorityHelpText": "Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25. Used when grabbing releases as a tiebreaker for otherwise equal releases, Lidarr will still use all enabled indexers for RSS Sync and Searching.", + "Proceed": "Proceed", "Profiles": "Profiles", + "Progress": "Progress", "Proper": "Proper", "PropersAndRepacks": "Propers and Repacks", "Protocol": "Protocol", @@ -449,13 +565,14 @@ "PublishedDate": "Published Date", "Quality": "Quality", "QualityDefinitions": "Quality Definitions", + "QualityLimitsHelpText": "Limits are automatically adjusted for the album duration.", "QualityProfile": "Quality Profile", "QualityProfileIdHelpText": "Quality Profile list items should be added with", "QualityProfiles": "Quality Profiles", "QualitySettings": "Quality Settings", "Queue": "Queue", - "Radarr": "Radarr", - "Readarr": "Readarr", + "Queued": "Queued", + "Rating": "Rating", "ReadTheWikiForMoreInformation": "Read the Wiki for more information", "Real": "Real", "Reason": "Reason", @@ -469,6 +586,7 @@ "RefreshArtist": "Refresh Artist", "RefreshInformationAndScanDisk": "Refresh information and scan disk", "RefreshScan": "Refresh & Scan", + "RejectionCount": "Rejection Count", "Release": " Release", "ReleaseDate": "Release Date", "ReleaseGroup": "Release Group", @@ -476,6 +594,7 @@ "ReleaseRejected": "Release Rejected", "ReleasesHelpText": "Change release for this album", "ReleaseStatuses": "Release Statuses", + "ReleaseTitle": "Release Title", "ReleaseWillBeProcessedInterp": "Release will be processed {0}", "Reload": "Reload", "RemotePath": "Remote Path", @@ -497,9 +616,12 @@ "RemoveSelectedMessageText": "Are you sure you want to remove the selected items from the blocklist?", "RemoveTagExistingTag": "Existing tag", "RemoveTagRemovingTag": "Removing tag", + "Renamed": "Renamed", "RenameTracks": "Rename Tracks", "RenameTracksHelpText": "Lidarr will use the existing file name if renaming is disabled", "Reorder": "Reorder", + "Replace": "Replace", + "ReplaceExistingFiles": "Replace Existing Files", "ReplaceIllegalCharacters": "Replace Illegal Characters", "ReplaceIllegalCharactersHelpText": "Replace illegal characters. If unchecked, Lidarr will remove them instead", "RequiredHelpText": "The release must contain at least one of these terms (case insensitive)", @@ -514,18 +636,24 @@ "Restart": "Restart", "RestartLidarr": "Restart Lidarr", "RestartNow": "Restart Now", + "RestartRequiredHelpTextWarning": "Requires restart to take effect", "Restore": "Restore", "RestoreBackup": "Restore Backup", + "RestoreBackupAdditionalInfo": "Note: Lidarr will automatically restart and reload the UI during the restore process.", "Result": "Result", + "Retag": "Retag", + "Retagged": "Retagged", "Retention": "Retention", "RetentionHelpText": "Usenet only: Set to zero to set for unlimited retention", "RetryingDownloadInterp": "Retrying download {0} at {1}", "RootFolder": "Root Folder", + "RootFolderPath": "Root Folder Path", "RootFolderPathHelpText": "Root Folder list items will be added to", "RootFolders": "Root Folders", "RSSSync": "RSS Sync", "RSSSyncInterval": "RSS Sync Interval", "RssSyncIntervalHelpText": "Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)", + "Save": "Save", "SceneInformation": "Scene Information", "SceneNumberHasntBeenVerifiedYet": "Scene number hasn't been verified yet", "Scheduled": "Scheduled", @@ -544,10 +672,19 @@ "SearchMonitored": "Search Monitored", "SearchSelected": "Search Selected", "Season": "Season", + "SecificMonitoringOptionHelpText": "Monitor artists but only monitor albums explicitly included in the list", "SecondaryAlbumTypes": "Secondary Album Types", "SecondaryTypes": "Secondary Types", "Security": "Security", + "Seeders": "Seeders", + "Select...": "Select...", + "SelectAlbum": "Select Album", + "SelectAlbumRelease": "Select Album Release", + "SelectArtist": "Select Artist", "SelectedCountArtistsSelectedInterp": "{0} Artist(s) Selected", + "SelectFolder": "Select Folder", + "SelectQuality": "Select Quality", + "SelectTracks": "Select Tracks", "SendAnonymousUsageData": "Send Anonymous Usage Data", "SetPermissions": "Set Permissions", "SetPermissionsLinuxHelpText": "Should chmod be run when files are imported/renamed?", @@ -559,6 +696,7 @@ "ShouldMonitorHelpText": "Monitor artists and albums added from this list", "ShouldSearch": "Search for New Items", "ShouldSearchHelpText": "Search indexers for newly added items. Use with caution for large lists.", + "ShowAdvanced": "Show Advanced", "ShowAlbumCount": "Show Album Count", "ShowBanners": "Show Banners", "ShowBannersHelpText": "Show banners instead of names", @@ -580,15 +718,18 @@ "ShowTitleHelpText": "Show artist name under poster", "ShowUnknownArtistItems": "Show Unknown Artist Items", "Size": " Size", + "SizeLimit": "Size Limit", + "SizeOnDisk": "Size on Disk", "SkipFreeSpaceCheck": "Skip Free Space Check", "SkipFreeSpaceCheckWhenImportingHelpText": "Use when Lidarr is unable to detect free space from your artist root folder", "SkipRedownload": "Skip Redownload", "SkipredownloadHelpText": "Prevents Lidarr from trying download alternative releases for the removed items", - "Sonarr": "Sonarr", + "SomeResultsFiltered": "Some results are hidden by the applied filter", "SorryThatAlbumCannotBeFound": "Sorry, that album cannot be found.", "SorryThatArtistCannotBeFound": "Sorry, that artist cannot be found.", "Source": "Source", "SourcePath": "Source Path", + "SourceTitle": "Source Title", "SpecificAlbum": "Specific Album", "SSLCertPassword": "SSL Cert Password", "SslCertPasswordHelpText": "Password for pfx file", @@ -599,6 +740,7 @@ "SSLPort": "SSL Port", "SslPortHelpTextWarning": "Requires restart to take effect", "StandardTrackFormat": "Standard Track Format", + "Started": "Started", "StartTypingOrSelectAPathBelow": "Start typing or select a path below", "StartupDirectory": "Startup directory", "Status": "Status", @@ -610,6 +752,7 @@ "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Search is not supported with this indexer", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Will be used when automatic searches are performed via the UI or by Lidarr", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Will be used when interactive search is used", + "System": "System", "TagAudioFilesWithMetadata": "Tag Audio Files with Metadata", "TagIsNotUsedAndCanBeDeleted": "Tag is not used and can be deleted", "Tags": "Tags", @@ -617,34 +760,44 @@ "Tasks": "Tasks", "TBA": "TBA", "Term": "Term", + "Test": "Test", "TestAll": "Test All", "TestAllClients": "Test All Clients", "TestAllIndexers": "Test All Indexers", "TestAllLists": "Test All Lists", "TheAlbumsFilesWillBeDeleted": "The album's files will be deleted.", "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "The artist folder {path} and all of its content will be deleted.", + "Theme": "Theme", + "ThemeHelpText": "Change Application UI Theme", "ThisCannotBeCancelled": "This cannot be cancelled once started without disabling all of your indexers.", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "This will apply to all indexers, please follow the rules set forth by them", "Time": "Time", "TimeFormat": "Time Format", + "TimeLeft": "Time Left", + "Title": "Title", "TorrentDelay": "Torrent Delay", "TorrentDelayHelpText": "Delay in minutes to wait before grabbing a torrent", "Torrents": "Torrents", "TotalFileSize": "Total File Size", + "TotalSpace": "Total Space", "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "{0} tracks total. {1} tracks with files.", "Track": "Track", "TrackArtist": "Track Artist", + "TrackCount": "Track Count", "TrackDownloaded": "Track Downloaded", "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} tracks downloaded", "TrackFileCountTrackCountTotalTotalTrackCountInterp": "{0} / {1} (Total: {2})", "TrackFilesCountMessage": "No track files", + "TrackImported": "Track Imported", "TrackMissingFromDisk": "Track missing from disk", "TrackNaming": "Track Naming", "TrackNumber": "Track Number", + "TrackProgress": "Track Progress", "Tracks": "Tracks", "TrackStatus": "Track status", "TrackTitle": "Track Title", "Type": "Type", + "UI": "UI", "UILanguage": "UI Language", "UILanguageHelpText": "Language that Lidarr will use for UI", "UILanguageHelpTextWarning": "Browser Reload Required", @@ -668,6 +821,7 @@ "UnableToLoadImportListExclusions": "Unable to load Import List Exclusions", "UnableToLoadIndexerOptions": "Unable to load indexer options", "UnableToLoadIndexers": "Unable to load Indexers", + "UnableToLoadInteractiveSerach": "Unable to load results for this album search. Try again later", "UnableToLoadLists": "Unable to load Lists", "UnableToLoadMediaManagementSettings": "Unable to load Media Management settings", "UnableToLoadMetadata": "Unable to load Metadata", @@ -686,8 +840,10 @@ "UnableToLoadUISettings": "Unable to load UI settings", "Ungroup": "Ungroup", "UnmappedFiles": "UnmappedFiles", + "UnmappedFilesOnly": "Unmapped Files Only", "Unmonitored": "Unmonitored", "UnmonitoredHelpText": "Include unmonitored albums in the iCal feed", + "UnmonitoredOnly": "Unmonitored Only", "UpdateAll": "Update all", "UpdateAutomaticallyHelpText": "Automatically download and install updates. You will still be able to install from System: Updates", "UpdateMechanismHelpText": "Use Lidarr's built-in updater or a script", @@ -695,6 +851,7 @@ "UpdateScriptPathHelpText": "Path to a custom script that takes an extracted update package and handle the remainder of the update process", "UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Updating is disabled inside a docker container. Update the container image instead.", "UpgradeAllowedHelpText": "If disabled qualities will not be upgraded", + "UpgradesAllowed": "Upgrades Allowed", "Uptime": "Uptime", "URLBase": "URL Base", "UrlBaseHelpText": "For reverse proxy support, default is empty", @@ -709,10 +866,14 @@ "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "Branch to use to update Lidarr", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branch used by external update mechanism", "Version": "Version", + "Wanted": "Wanted", + "Warn": "Warn", "WatchLibraryForChangesHelpText": "Rescan automatically when files change in a root folder", "WatchRootFoldersForFileChanges": "Watch Root Folders for file changes", "WeekColumnHeader": "Week Column Header", + "WouldYouLikeToRestoreBackup": "Would you like to restore the backup {0} ?", "WriteAudioTagsHelpTextWarning": "Selecting 'All files' will alter existing files when they are imported.", + "WriteMetadataTags": "Write Metadata Tags", "WriteMetadataToAudioFiles": "Write Metadata to Audio Files", "Year": "Year", "YesCancel": "Yes, Cancel"