Translation Updates

Fixes #3058
Fixes #2889
pull/3061/head
Qstick 2 years ago
parent 651a4358fc
commit 000ccf78ad

@ -108,14 +108,14 @@ class EditAlbumModalContent extends Component {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerButton <SpinnerButton
isSpinning={isSaving} isSpinning={isSaving}
onPress={this.onSavePress} onPress={this.onSavePress}
> >
Save {translate('Save')}
</SpinnerButton> </SpinnerButton>
</ModalFooter> </ModalFooter>

@ -32,13 +32,13 @@ const columns = [
}, },
{ {
name: 'sortName', name: 'sortName',
label: 'Name', label: translate('Name'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albumCount', name: 'albumCount',
label: 'Albums', label: translate('Albums'),
isSortable: false, isSortable: false,
isVisible: true isVisible: true
} }

@ -211,14 +211,14 @@ class EditArtistModalContent extends Component {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerButton <SpinnerButton
isSpinning={isSaving} isSpinning={isSaving}
onPress={this.onSavePress} onPress={this.onSavePress}
> >
Save {translate('Save')}
</SpinnerButton> </SpinnerButton>
</ModalFooter> </ModalFooter>

@ -8,6 +8,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { icons, kinds } from 'Helpers/Props'; import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './RetagArtistModalContent.css'; import styles from './RetagArtistModalContent.css';
function RetagArtistModalContent(props) { function RetagArtistModalContent(props) {
@ -50,14 +51,14 @@ function RetagArtistModalContent(props) {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onRetagArtistPress} onPress={onRetagArtistPress}
> >
Retag {translate('Retag')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -9,6 +9,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds } from 'Helpers/Props'; import { inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './DeleteArtistModalContent.css'; import styles from './DeleteArtistModalContent.css';
class DeleteArtistModalContent extends Component { class DeleteArtistModalContent extends Component {
@ -51,7 +52,7 @@ class DeleteArtistModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Delete Selected Artist {translate('DeleteArtist')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -99,14 +100,14 @@ class DeleteArtistModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={this.onDeleteArtistConfirmed} onPress={this.onDeleteArtistConfirmed}
> >
Delete {translate('Delete')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -8,6 +8,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { icons, kinds } from 'Helpers/Props'; import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './OrganizeArtistModalContent.css'; import styles from './OrganizeArtistModalContent.css';
function OrganizeArtistModalContent(props) { function OrganizeArtistModalContent(props) {
@ -20,7 +21,7 @@ function OrganizeArtistModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Organize Selected Artist {translate('OrganizeArtist')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -51,14 +52,14 @@ function OrganizeArtistModalContent(props) {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onOrganizeArtistPress} onPress={onOrganizeArtistPress}
> >
Organize {translate('Organize')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -61,9 +61,9 @@ class TagsModalContent extends Component {
} = this.state; } = this.state;
const applyTagsOptions = [ const applyTagsOptions = [
{ key: 'add', value: 'Add' }, { key: 'add', value: translate('Add') },
{ key: 'remove', value: 'Remove' }, { key: 'remove', value: translate('Remove') },
{ key: 'replace', value: 'Replace' } { key: 'replace', value: translate('Replace') }
]; ];
return ( return (
@ -169,14 +169,14 @@ class TagsModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.PRIMARY} kind={kinds.PRIMARY}
onPress={this.onApplyTagsPress} onPress={this.onApplyTagsPress}
> >
Apply {translate('Apply')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -18,32 +18,32 @@ const columns = [
}, },
{ {
name: 'album', name: 'album',
label: 'Album', label: translate('Album'),
isVisible: true isVisible: true
}, },
{ {
name: 'sourceTitle', name: 'sourceTitle',
label: 'Source Title', label: translate('SourceTitle'),
isVisible: true isVisible: true
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
isVisible: true isVisible: true
}, },
{ {
name: 'date', name: 'date',
label: 'Date', label: translate('Date'),
isVisible: true isVisible: true
}, },
{ {
name: 'details', name: 'details',
label: 'Details', label: translate('Details'),
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
label: 'Actions', label: translate('Actions'),
isVisible: true isVisible: true
} }
]; ];

@ -21,12 +21,12 @@ import styles from './FileBrowserModalContent.css';
const columns = [ const columns = [
{ {
name: 'type', name: 'type',
label: 'Type', label: translate('Type'),
isVisible: true isVisible: true
}, },
{ {
name: 'name', name: 'name',
label: 'Name', label: translate('Name'),
isVisible: true isVisible: true
} }
]; ];
@ -226,13 +226,13 @@ class FileBrowserModalContent extends Component {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
onPress={this.onOkPress} onPress={this.onOkPress}
> >
Ok {translate('Ok')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -8,6 +8,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes } from 'Helpers/Props'; import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import FilterBuilderRow from './FilterBuilderRow'; import FilterBuilderRow from './FilterBuilderRow';
import styles from './FilterBuilderModalContent.css'; import styles from './FilterBuilderModalContent.css';
@ -151,7 +152,7 @@ class FilterBuilderModalContent extends Component {
<ModalBody> <ModalBody>
<div className={styles.labelContainer}> <div className={styles.labelContainer}>
<div className={styles.label}> <div className={styles.label}>
Label {translate('Label')}
</div> </div>
<div className={styles.labelInputContainer}> <div className={styles.labelInputContainer}>
@ -165,7 +166,7 @@ class FilterBuilderModalContent extends Component {
</div> </div>
</div> </div>
<div className={styles.label}>Filters</div> <div className={styles.label}>{translate('Filters')}</div>
<div className={styles.rows}> <div className={styles.rows}>
{ {
@ -192,7 +193,7 @@ class FilterBuilderModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onCancelPress}> <Button onPress={onCancelPress}>
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -200,7 +201,7 @@ class FilterBuilderModalContent extends Component {
error={saveError} error={saveError}
onPress={this.onSaveFilterPress} onPress={this.onSaveFilterPress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -5,6 +5,7 @@ import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent'; import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import translate from 'Utilities/String/translate';
import CustomFilter from './CustomFilter'; import CustomFilter from './CustomFilter';
import styles from './CustomFiltersModalContent.css'; import styles from './CustomFiltersModalContent.css';
@ -24,7 +25,7 @@ function CustomFiltersModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Custom Filters {translate('CustomFilters')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { inputTypes } from 'Helpers/Props'; import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AlbumReleaseSelectInputConnector from './AlbumReleaseSelectInputConnector'; import AlbumReleaseSelectInputConnector from './AlbumReleaseSelectInputConnector';
import AutoCompleteInput from './AutoCompleteInput'; import AutoCompleteInput from './AutoCompleteInput';
import CaptchaInputConnector from './CaptchaInputConnector'; import CaptchaInputConnector from './CaptchaInputConnector';
@ -227,7 +228,7 @@ function FormInputGroup(props) {
<Link <Link
to={helpLink} to={helpLink}
> >
More Info {translate('MoreInfo')}
</Link> </Link>
} }

@ -8,6 +8,7 @@ import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody'; import TableBody from 'Components/Table/TableBody';
import TableRow from 'Components/Table/TableRow'; import TableRow from 'Components/Table/TableRow';
import tagShape from 'Helpers/Props/Shapes/tagShape'; import tagShape from 'Helpers/Props/Shapes/tagShape';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds'; import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll'; import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected'; import toggleSelected from 'Utilities/Table/toggleSelected';
@ -16,7 +17,7 @@ import styles from './PlaylistInput.css';
const columns = [ const columns = [
{ {
name: 'name', name: 'name',
label: 'Playlist', label: translate('Playlist'),
isSortable: false, isSortable: false,
isVisible: true isVisible: true
} }

@ -1,5 +1,6 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import translate from 'Utilities/String/translate';
import FilterMenuItem from './FilterMenuItem'; import FilterMenuItem from './FilterMenuItem';
import MenuContent from './MenuContent'; import MenuContent from './MenuContent';
import MenuItem from './MenuItem'; import MenuItem from './MenuItem';
@ -61,7 +62,7 @@ class FilterMenuContent extends Component {
{ {
showCustomFilters && showCustomFilters &&
<MenuItem onPress={onCustomFiltersPress}> <MenuItem onPress={onCustomFiltersPress}>
Custom Filters {translate('CustomFilters')}
</MenuItem> </MenuItem>
} }
</MenuContent> </MenuContent>

@ -10,6 +10,7 @@ import { icons } from 'Helpers/Props';
import locationShape from 'Helpers/Props/Shapes/locationShape'; import locationShape from 'Helpers/Props/Shapes/locationShape';
import dimensions from 'Styles/Variables/dimensions'; import dimensions from 'Styles/Variables/dimensions';
import HealthStatusConnector from 'System/Status/Health/HealthStatusConnector'; import HealthStatusConnector from 'System/Status/Health/HealthStatusConnector';
import translate from 'Utilities/String/translate';
import MessagesConnector from './Messages/MessagesConnector'; import MessagesConnector from './Messages/MessagesConnector';
import PageSidebarItem from './PageSidebarItem'; import PageSidebarItem from './PageSidebarItem';
import styles from './PageSidebar.css'; import styles from './PageSidebar.css';
@ -20,24 +21,24 @@ const SIDEBAR_WIDTH = parseInt(dimensions.sidebarWidth);
const links = [ const links = [
{ {
iconName: icons.ARTIST_CONTINUING, iconName: icons.ARTIST_CONTINUING,
title: 'Library', title: translate('Library'),
to: '/', to: '/',
alias: '/artist', alias: '/artist',
children: [ children: [
{ {
title: 'Add New', title: translate('AddNew'),
to: '/add/search' to: '/add/search'
}, },
{ {
title: 'Mass Editor', title: translate('MassEditor'),
to: '/artisteditor' to: '/artisteditor'
}, },
{ {
title: 'Album Studio', title: translate('AlbumStudio'),
to: '/albumstudio' to: '/albumstudio'
}, },
{ {
title: 'Unmapped Files', title: translate('UnmappedFiles'),
to: '/unmapped' to: '/unmapped'
} }
] ]
@ -45,26 +46,26 @@ const links = [
{ {
iconName: icons.CALENDAR, iconName: icons.CALENDAR,
title: 'Calendar', title: translate('Calendar'),
to: '/calendar' to: '/calendar'
}, },
{ {
iconName: icons.ACTIVITY, iconName: icons.ACTIVITY,
title: 'Activity', title: translate('Activity'),
to: '/activity/queue', to: '/activity/queue',
children: [ children: [
{ {
title: 'Queue', title: translate('Queue'),
to: '/activity/queue', to: '/activity/queue',
statusComponent: QueueStatusConnector statusComponent: QueueStatusConnector
}, },
{ {
title: 'History', title: translate('History'),
to: '/activity/history' to: '/activity/history'
}, },
{ {
title: 'Blocklist', title: translate('Blocklist'),
to: '/activity/blocklist' to: '/activity/blocklist'
} }
] ]
@ -72,15 +73,15 @@ const links = [
{ {
iconName: icons.WARNING, iconName: icons.WARNING,
title: 'Wanted', title: translate('Wanted'),
to: '/wanted/missing', to: '/wanted/missing',
children: [ children: [
{ {
title: 'Missing', title: translate('Missing'),
to: '/wanted/missing' to: '/wanted/missing'
}, },
{ {
title: 'Cutoff Unmet', title: translate('CutoffUnmet'),
to: '/wanted/cutoffunmet' to: '/wanted/cutoffunmet'
} }
] ]
@ -88,51 +89,51 @@ const links = [
{ {
iconName: icons.SETTINGS, iconName: icons.SETTINGS,
title: 'Settings', title: translate('Settings'),
to: '/settings', to: '/settings',
children: [ children: [
{ {
title: 'Media Management', title: translate('MediaManagement'),
to: '/settings/mediamanagement' to: '/settings/mediamanagement'
}, },
{ {
title: 'Profiles', title: translate('Profiles'),
to: '/settings/profiles' to: '/settings/profiles'
}, },
{ {
title: 'Quality', title: translate('Quality'),
to: '/settings/quality' to: '/settings/quality'
}, },
{ {
title: 'Indexers', title: translate('Indexers'),
to: '/settings/indexers' to: '/settings/indexers'
}, },
{ {
title: 'Download Clients', title: translate('DownloadClients'),
to: '/settings/downloadclients' to: '/settings/downloadclients'
}, },
{ {
title: 'Import Lists', title: translate('ImportLists'),
to: '/settings/importlists' to: '/settings/importlists'
}, },
{ {
title: 'Connect', title: translate('Connect'),
to: '/settings/connect' to: '/settings/connect'
}, },
{ {
title: 'Metadata', title: translate('Metadata'),
to: '/settings/metadata' to: '/settings/metadata'
}, },
{ {
title: 'Tags', title: translate('Tags'),
to: '/settings/tags' to: '/settings/tags'
}, },
{ {
title: 'General', title: translate('General'),
to: '/settings/general' to: '/settings/general'
}, },
{ {
title: 'UI', title: translate('UI'),
to: '/settings/ui' to: '/settings/ui'
} }
] ]
@ -140,32 +141,32 @@ const links = [
{ {
iconName: icons.SYSTEM, iconName: icons.SYSTEM,
title: 'System', title: translate('System'),
to: '/system/status', to: '/system/status',
children: [ children: [
{ {
title: 'Status', title: translate('Status'),
to: '/system/status', to: '/system/status',
statusComponent: HealthStatusConnector statusComponent: HealthStatusConnector
}, },
{ {
title: 'Tasks', title: translate('Tasks'),
to: '/system/tasks' to: '/system/tasks'
}, },
{ {
title: 'Backup', title: translate('Backup'),
to: '/system/backup' to: '/system/backup'
}, },
{ {
title: 'Updates', title: translate('Updates'),
to: '/system/updates' to: '/system/updates'
}, },
{ {
title: 'Events', title: translate('Events'),
to: '/system/events' to: '/system/events'
}, },
{ {
title: 'Log Files', title: translate('LogFiles'),
to: '/system/logs/files' to: '/system/logs/files'
} }
] ]

@ -18,22 +18,22 @@ import styles from './SelectAlbumModalContent.css';
const columns = [ const columns = [
{ {
name: 'title', name: 'title',
label: 'Album Title', label: translate('AlbumTitle'),
isVisible: true isVisible: true
}, },
{ {
name: 'albumType', name: 'albumType',
label: 'Album Type', label: translate('AlbumType'),
isVisible: true isVisible: true
}, },
{ {
name: 'releaseDate', name: 'releaseDate',
label: 'Release Date', label: translate('ReleaseDate'),
isVisible: true isVisible: true
}, },
{ {
name: 'status', name: 'status',
label: 'Album Status', label: translate('AlbumStatus'),
isVisible: true isVisible: true
} }
]; ];
@ -124,7 +124,7 @@ class SelectAlbumModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -10,18 +10,19 @@ import Scroller from 'Components/Scroller/Scroller';
import Table from 'Components/Table/Table'; import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody'; import TableBody from 'Components/Table/TableBody';
import { scrollDirections } from 'Helpers/Props'; import { scrollDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import SelectAlbumReleaseRow from './SelectAlbumReleaseRow'; import SelectAlbumReleaseRow from './SelectAlbumReleaseRow';
import styles from './SelectAlbumReleaseModalContent.css'; import styles from './SelectAlbumReleaseModalContent.css';
const columns = [ const columns = [
{ {
name: 'album', name: 'album',
label: 'Album', label: translate('Album'),
isVisible: true isVisible: true
}, },
{ {
name: 'release', name: 'release',
label: 'Album Release', label: translate('AlbumRelease'),
isVisible: true isVisible: true
} }
]; ];
@ -42,7 +43,7 @@ class SelectAlbumReleaseModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Album Release {translate('ManualImport')} - {translate('SelectAlbumRelease')}
</ModalHeader> </ModalHeader>
<ModalBody <ModalBody
@ -81,7 +82,7 @@ class SelectAlbumReleaseModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -47,7 +47,7 @@ class SelectArtistModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Artist {translate('ManualImport')} - {translate('SelectArtist')}
</ModalHeader> </ModalHeader>
<ModalBody <ModalBody
@ -83,7 +83,7 @@ class SelectArtistModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -9,6 +9,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter'; import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader'; import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function formatAlbumFiles(items, album) { function formatAlbumFiles(items, album) {
@ -73,7 +74,7 @@ class ConfirmImportModalContent extends Component {
{ {
!isFetching && isPopulated && !isFetching && isPopulated &&
<ModalHeader> <ModalHeader>
Are you sure? {translate('AreYouSure')}
</ModalHeader> </ModalHeader>
} }
@ -105,14 +106,14 @@ class ConfirmImportModalContent extends Component {
!isFetching && isPopulated && !isFetching && isPopulated &&
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onConfirmImportPress} onPress={onConfirmImportPress}
> >
Proceed {translate('Proceed')}
</Button> </Button>
</ModalFooter> </ModalFooter>

@ -10,17 +10,18 @@ import ModalHeader from 'Components/Modal/ModalHeader';
import Table from 'Components/Table/Table'; import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody'; import TableBody from 'Components/Table/TableBody';
import { icons, kinds, sizes } from 'Helpers/Props'; import { icons, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import RecentFolderRow from './RecentFolderRow'; import RecentFolderRow from './RecentFolderRow';
import styles from './InteractiveImportSelectFolderModalContent.css'; import styles from './InteractiveImportSelectFolderModalContent.css';
const recentFoldersColumns = [ const recentFoldersColumns = [
{ {
name: 'folder', name: 'folder',
label: 'Folder' label: translate('Folder')
}, },
{ {
name: 'lastUsed', name: 'lastUsed',
label: 'Last Used' label: translate('LastUsed')
}, },
{ {
name: 'actions', name: 'actions',
@ -75,7 +76,7 @@ class InteractiveImportSelectFolderModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Folder {translate('ManualImport')} - {translate('SelectFolder')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -124,7 +125,7 @@ class InteractiveImportSelectFolderModalContent extends Component {
name={icons.QUICK} name={icons.QUICK}
/> />
Move Automatically {translate('MoveAutomatically')}
</Button> </Button>
</div> </div>
@ -141,7 +142,7 @@ class InteractiveImportSelectFolderModalContent extends Component {
name={icons.INTERACTIVE} name={icons.INTERACTIVE}
/> />
Interactive Import {translate('InteractiveImport')}
</Button> </Button>
</div> </div>
</div> </div>
@ -149,7 +150,7 @@ class InteractiveImportSelectFolderModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -22,6 +22,7 @@ import SelectArtistModal from 'InteractiveImport/Artist/SelectArtistModal';
import ConfirmImportModal from 'InteractiveImport/Confirmation/ConfirmImportModal'; import ConfirmImportModal from 'InteractiveImport/Confirmation/ConfirmImportModal';
import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal'; import SelectQualityModal from 'InteractiveImport/Quality/SelectQualityModal';
import getErrorMessage from 'Utilities/Object/getErrorMessage'; import getErrorMessage from 'Utilities/Object/getErrorMessage';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds'; import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll'; import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected'; import toggleSelected from 'Utilities/Table/toggleSelected';
@ -31,35 +32,35 @@ import styles from './InteractiveImportModalContent.css';
const columns = [ const columns = [
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'artist', name: 'artist',
label: 'Artist', label: translate('Artist'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'album', name: 'album',
label: 'Album', label: translate('Album'),
isVisible: true isVisible: true
}, },
{ {
name: 'tracks', name: 'tracks',
label: 'Track(s)', label: translate('Tracks'),
isVisible: true isVisible: true
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: translate('Size'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
@ -80,8 +81,8 @@ const filterExistingFilesOptions = {
}; };
const importModeOptions = [ const importModeOptions = [
{ key: 'move', value: 'Move Files' }, { key: 'move', value: translate('MoveFiles') },
{ key: 'copy', value: 'Hardlink/Copy Files' } { key: 'copy', value: translate('HardlinkCopyFiles') }
]; ];
const SELECT = 'select'; const SELECT = 'select';
@ -288,23 +289,23 @@ class InteractiveImportModalContent extends Component {
const errorMessage = getErrorMessage(error, 'Unable to load manual import items'); const errorMessage = getErrorMessage(error, 'Unable to load manual import items');
const bulkSelectOptions = [ const bulkSelectOptions = [
{ key: SELECT, value: 'Select...', disabled: true }, { key: SELECT, value: translate('Select...'), disabled: true },
{ key: ALBUM, value: 'Select Album' }, { key: ALBUM, value: translate('SelectAlbum') },
{ key: ALBUM_RELEASE, value: 'Select Album Release' }, { key: ALBUM_RELEASE, value: translate('SelectAlbumRelease') },
{ key: QUALITY, value: 'Select Quality' } { key: QUALITY, value: translate('SelectQuality') }
]; ];
if (allowArtistChange) { if (allowArtistChange) {
bulkSelectOptions.splice(1, 0, { bulkSelectOptions.splice(1, 0, {
key: ARTIST, key: ARTIST,
value: 'Select Artist' value: translate('SelectArtist')
}); });
} }
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - {title || folder} {translate('ManualImport')} - {title || folder}
</ModalHeader> </ModalHeader>
<ModalBody scrollDirection={scrollDirections.BOTH}> <ModalBody scrollDirection={scrollDirections.BOTH}>
@ -320,7 +321,7 @@ class InteractiveImportModalContent extends Component {
<div className={styles.filterText}> <div className={styles.filterText}>
{ {
filterExistingFiles ? 'Unmapped Files Only' : 'All Files' filterExistingFiles ? translate('UnmappedFilesOnly') : translate('AllFiles')
} }
</div> </div>
</MenuButton> </MenuButton>
@ -331,7 +332,7 @@ class InteractiveImportModalContent extends Component {
isSelected={!filterExistingFiles} isSelected={!filterExistingFiles}
onPress={this.onFilterExistingFilesChange} onPress={this.onFilterExistingFilesChange}
> >
All Files {translate('AllFiles')}
</SelectedMenuItem> </SelectedMenuItem>
<SelectedMenuItem <SelectedMenuItem
@ -339,7 +340,7 @@ class InteractiveImportModalContent extends Component {
isSelected={filterExistingFiles} isSelected={filterExistingFiles}
onPress={this.onFilterExistingFilesChange} onPress={this.onFilterExistingFilesChange}
> >
Unmapped Files Only {translate('UnmappedFilesOnly')}
</SelectedMenuItem> </SelectedMenuItem>
</MenuContent> </MenuContent>
</Menu> </Menu>
@ -366,7 +367,7 @@ class InteractiveImportModalContent extends Component {
isSelected={!replaceExistingFiles} isSelected={!replaceExistingFiles}
onPress={this.onReplaceExistingFilesChange} onPress={this.onReplaceExistingFilesChange}
> >
Combine With Existing Files {translate('CombineWithExistingFiles')}
</SelectedMenuItem> </SelectedMenuItem>
<SelectedMenuItem <SelectedMenuItem
@ -374,7 +375,7 @@ class InteractiveImportModalContent extends Component {
isSelected={replaceExistingFiles} isSelected={replaceExistingFiles}
onPress={this.onReplaceExistingFilesChange} onPress={this.onReplaceExistingFilesChange}
> >
Replace Existing Files {translate('ReplaceExistingFiles')}
</SelectedMenuItem> </SelectedMenuItem>
</MenuContent> </MenuContent>
</Menu> </Menu>
@ -474,7 +475,7 @@ class InteractiveImportModalContent extends Component {
<div className={styles.rightButtons}> <div className={styles.rightButtons}>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
{ {
@ -487,7 +488,7 @@ class InteractiveImportModalContent extends Component {
isDisabled={!selectedIds.length || !!invalidRowsSelected.length || inconsistentAlbumReleases} isDisabled={!selectedIds.length || !!invalidRowsSelected.length || inconsistentAlbumReleases}
onPress={this.onImportSelectedPress} onPress={this.onImportSelectedPress}
> >
Import {translate('Import')}
</Button> </Button>
</div> </div>
</ModalFooter> </ModalFooter>

@ -81,7 +81,7 @@ class SelectQualityModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Quality {translate('ManualImport')} - {translate('SelectQuality')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -145,14 +145,14 @@ class SelectQualityModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.SUCCESS} kind={kinds.SUCCESS}
onPress={this.onQualitySelect} onPress={this.onQualitySelect}
> >
Select Quality {translate('SelectQuality')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -12,6 +12,7 @@ import TableBody from 'Components/Table/TableBody';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import ExpandingFileDetails from 'TrackFile/ExpandingFileDetails'; import ExpandingFileDetails from 'TrackFile/ExpandingFileDetails';
import getErrorMessage from 'Utilities/Object/getErrorMessage'; import getErrorMessage from 'Utilities/Object/getErrorMessage';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds'; import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll'; import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected'; import toggleSelected from 'Utilities/Table/toggleSelected';
@ -20,7 +21,7 @@ import SelectTrackRow from './SelectTrackRow';
const columns = [ const columns = [
{ {
name: 'mediumNumber', name: 'mediumNumber',
label: 'Medium', label: translate('Medium'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
@ -32,12 +33,12 @@ const columns = [
}, },
{ {
name: 'title', name: 'title',
label: 'Title', label: translate('Title'),
isVisible: true isVisible: true
}, },
{ {
name: 'trackStatus', name: 'trackStatus',
label: 'Status', label: translate('Status'),
isVisible: true isVisible: true
} }
]; ];
@ -137,7 +138,7 @@ class SelectTrackModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Manual Import - Select Track(s): {translate('ManualImport')} - {translate('SelectTracks')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -201,14 +202,14 @@ class SelectTrackModalContent extends Component {
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.SUCCESS} kind={kinds.SUCCESS}
onPress={this.onTracksSelect} onPress={this.onTracksSelect}
> >
Select Tracks {translate('SelectTracks')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -7,6 +7,7 @@ import PageMenuButton from 'Components/Menu/PageMenuButton';
import Table from 'Components/Table/Table'; import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody'; import TableBody from 'Components/Table/TableBody';
import { align, icons, sortDirections } from 'Helpers/Props'; import { align, icons, sortDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import InteractiveSearchFilterModalConnector from './InteractiveSearchFilterModalConnector'; import InteractiveSearchFilterModalConnector from './InteractiveSearchFilterModalConnector';
import InteractiveSearchRow from './InteractiveSearchRow'; import InteractiveSearchRow from './InteractiveSearchRow';
import styles from './InteractiveSearch.css'; import styles from './InteractiveSearch.css';
@ -14,43 +15,43 @@ import styles from './InteractiveSearch.css';
const columns = [ const columns = [
{ {
name: 'protocol', name: 'protocol',
label: 'Source', label: translate('Source'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'age', name: 'age',
label: 'Age', label: translate('Age'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'title', name: 'title',
label: 'Title', label: translate('Title'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'indexer', name: 'indexer',
label: 'Indexer', label: translate('Indexer'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: translate('Size'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'peers', name: 'peers',
label: 'Peers', label: translate('Peers'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'qualityWeight', name: 'qualityWeight',
label: 'Quality', label: translate('Quality'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
@ -58,7 +59,7 @@ const columns = [
name: 'preferredWordScore', name: 'preferredWordScore',
label: React.createElement(Icon, { label: React.createElement(Icon, {
name: icons.SCORE, name: icons.SCORE,
title: 'Preferred word score' title: translate('PreferredWordScore')
}), }),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
@ -67,7 +68,7 @@ const columns = [
name: 'rejections', name: 'rejections',
label: React.createElement(Icon, { label: React.createElement(Icon, {
name: icons.DANGER, name: icons.DANGER,
title: 'Rejections' title: translate('rejections')
}), }),
isSortable: true, isSortable: true,
fixedSortDirection: sortDirections.ASCENDING, fixedSortDirection: sortDirections.ASCENDING,
@ -125,7 +126,7 @@ function InteractiveSearch(props) {
{ {
!isFetching && error ? !isFetching && error ?
<div> <div>
Unable to load results for this album search. Try again later {translate('UnableToLoadInteractiveSearch')}
</div> : </div> :
null null
} }
@ -133,7 +134,7 @@ function InteractiveSearch(props) {
{ {
!isFetching && isPopulated && !totalReleasesCount ? !isFetching && isPopulated && !totalReleasesCount ?
<div> <div>
No results found {translate('NoResults')}
</div> : </div> :
null null
} }
@ -141,7 +142,7 @@ function InteractiveSearch(props) {
{ {
!!totalReleasesCount && isPopulated && !items.length ? !!totalReleasesCount && isPopulated && !items.length ?
<div> <div>
All results are hidden by the applied filter {translate('AllResultsFiltered')}
</div> : </div> :
null null
} }
@ -177,7 +178,7 @@ function InteractiveSearch(props) {
{ {
totalReleasesCount !== items.length && !!items.length ? totalReleasesCount !== items.length && !!items.length ?
<div className={styles.filteredMessage}> <div className={styles.filteredMessage}>
Some results are hidden by the applied filter {translate('SomeResultsFiltered')}
</div> : </div> :
null null
} }

@ -160,14 +160,14 @@ class OrganizePreviewModalContent extends Component {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.PRIMARY} kind={kinds.PRIMARY}
onPress={this.onOrganizePress} onPress={this.onOrganizePress}
> >
Organize {translate('Organize')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -89,7 +89,7 @@ class RetagPreviewModalContent extends Component {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Write Metadata Tags {translate('WriteMetadataTags')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -156,14 +156,14 @@ class RetagPreviewModalContent extends Component {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<Button <Button
kind={kinds.PRIMARY} kind={kinds.PRIMARY}
onPress={this.onRetagPress} onPress={this.onRetagPress}
> >
Retag {translate('Retag')}
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -45,7 +45,7 @@ function AdvancedSettingsButton(props) {
<div className={styles.labelContainer}> <div className={styles.labelContainer}>
<div className={styles.label}> <div className={styles.label}>
{advancedSettings ? 'Hide Advanced' : 'Show Advanced'} {advancedSettings ? translate('HideAdvanced') : translate('ShowAdvanced')}
</div> </div>
</div> </div>
</Link> </Link>

@ -5,6 +5,7 @@ import Link from 'Components/Link/Link';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import MenuContent from 'Components/Menu/MenuContent'; import MenuContent from 'Components/Menu/MenuContent';
import { sizes } from 'Helpers/Props'; import { sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AddDownloadClientPresetMenuItem from './AddDownloadClientPresetMenuItem'; import AddDownloadClientPresetMenuItem from './AddDownloadClientPresetMenuItem';
import styles from './AddDownloadClientItem.css'; import styles from './AddDownloadClientItem.css';
@ -57,7 +58,7 @@ class AddDownloadClientItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onDownloadClientSelect} onPress={this.onDownloadClientSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -65,7 +66,7 @@ class AddDownloadClientItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>
@ -90,7 +91,7 @@ class AddDownloadClientItem extends Component {
to={infoLink} to={infoLink}
size={sizes.SMALL} size={sizes.SMALL}
> >
More info {translate('MoreInfo')}
</Button> </Button>
</div> </div>
</div> </div>

@ -189,7 +189,7 @@ class EditDownloadClientModalContent extends Component {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteDownloadClientPress} onPress={onDeleteDownloadClientPress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
@ -198,13 +198,13 @@ class EditDownloadClientModalContent extends Component {
error={saveError} error={saveError}
onPress={onTestPress} onPress={onTestPress}
> >
Test {translate('Test')}
</SpinnerErrorButton> </SpinnerErrorButton>
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -212,7 +212,7 @@ class EditDownloadClientModalContent extends Component {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -41,7 +41,7 @@ function EditRemotePathMappingModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Remote Path Mapping' : 'Add Remote Path Mapping'} {id ? translate('EditRemotePathMapping') : translate('AddRemotePathMapping')}
</ModalHeader> </ModalHeader>
<ModalBody className={styles.body}> <ModalBody className={styles.body}>
@ -114,14 +114,14 @@ function EditRemotePathMappingModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteRemotePathMappingPress} onPress={onDeleteRemotePathMappingPress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -129,7 +129,7 @@ function EditRemotePathMappingModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -51,9 +51,15 @@ class RemotePathMappings extends Component {
{...otherProps} {...otherProps}
> >
<div className={styles.remotePathMappingsHeader}> <div className={styles.remotePathMappingsHeader}>
<div className={styles.host}>Host</div> <div className={styles.host}>
<div className={styles.path}>Remote Path</div> {translate('Host')}
<div className={styles.path}>Local Path</div> </div>
<div className={styles.path}>
{translate('RemotePath')}
</div>
<div className={styles.path}>
{translate('LocalPath')}
</div>
</div> </div>
<div> <div>

@ -39,7 +39,7 @@ function EditImportListExclusionModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Import List Exclusion' : 'Add Import List Exclusion'} {id ? translate('EditImportListExclusion') : translate('AddImportListExclusion')}
</ModalHeader> </ModalHeader>
<ModalBody className={styles.body}> <ModalBody className={styles.body}>
@ -99,14 +99,14 @@ function EditImportListExclusionModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteImportListExclusionPress} onPress={onDeleteImportListExclusionPress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -114,7 +114,7 @@ function EditImportListExclusionModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -5,6 +5,7 @@ import Link from 'Components/Link/Link';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import MenuContent from 'Components/Menu/MenuContent'; import MenuContent from 'Components/Menu/MenuContent';
import { sizes } from 'Helpers/Props'; import { sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AddImportListPresetMenuItem from './AddImportListPresetMenuItem'; import AddImportListPresetMenuItem from './AddImportListPresetMenuItem';
import styles from './AddImportListItem.css'; import styles from './AddImportListItem.css';
@ -57,7 +58,7 @@ class AddImportListItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onListSelect} onPress={this.onListSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -65,7 +66,7 @@ class AddImportListItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>
@ -90,7 +91,7 @@ class AddImportListItem extends Component {
to={infoLink} to={infoLink}
size={sizes.SMALL} size={sizes.SMALL}
> >
More info {translate('MoreInfo')}
</Button> </Button>
</div> </div>
</div> </div>

@ -28,17 +28,17 @@ function ImportListMonitoringOptionsPopoverContent() {
<DescriptionList> <DescriptionList>
<DescriptionListItem <DescriptionListItem
title={translate('None')} title={translate('None')}
data="Do not monitor artists or albums" data={translate('NoneMonitoringOptionHelpText')}
/> />
<DescriptionListItem <DescriptionListItem
title={translate('SpecificAlbum')} title={translate('SpecificAlbum')}
data="Monitor artists but only monitor albums explicitly included in the list" data={translate('SecificMonitoringOptionHelpText')}
/> />
<DescriptionListItem <DescriptionListItem
title={translate('AllArtistAlbums')} title={translate('AllArtistAlbums')}
data="Monitor artists and all albums for each artist included on the import list" data={translate('AllMonitoringOptionHelpText')}
/> />
</DescriptionList> </DescriptionList>
); );
@ -47,9 +47,9 @@ function ImportListMonitoringOptionsPopoverContent() {
function EditImportListModalContent(props) { function EditImportListModalContent(props) {
const monitorOptions = [ const monitorOptions = [
{ key: 'none', value: 'None' }, { key: 'none', value: translate('None') },
{ key: 'specificAlbum', value: 'Specific Album' }, { key: 'specificAlbum', value: translate('SpecificAlbum') },
{ key: 'entireArtist', value: 'All Artist Albums' } { key: 'entireArtist', value: translate('All Artist Albums') }
]; ];
const { const {
@ -89,7 +89,7 @@ function EditImportListModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit List' : 'Add List'} {id ? translate('EditList') : translate('AddList')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -318,7 +318,7 @@ function EditImportListModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteImportListPress} onPress={onDeleteImportListPress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
@ -327,13 +327,13 @@ function EditImportListModalContent(props) {
error={saveError} error={saveError}
onPress={onTestPress} onPress={onTestPress}
> >
Test {translate('Test')}
</SpinnerErrorButton> </SpinnerErrorButton>
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -341,7 +341,7 @@ function EditImportListModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -5,6 +5,7 @@ import Link from 'Components/Link/Link';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import MenuContent from 'Components/Menu/MenuContent'; import MenuContent from 'Components/Menu/MenuContent';
import { sizes } from 'Helpers/Props'; import { sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AddIndexerPresetMenuItem from './AddIndexerPresetMenuItem'; import AddIndexerPresetMenuItem from './AddIndexerPresetMenuItem';
import styles from './AddIndexerItem.css'; import styles from './AddIndexerItem.css';
@ -57,7 +58,7 @@ class AddIndexerItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onIndexerSelect} onPress={this.onIndexerSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -65,7 +66,7 @@ class AddIndexerItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>
@ -90,7 +91,7 @@ class AddIndexerItem extends Component {
to={infoLink} to={infoLink}
size={sizes.SMALL} size={sizes.SMALL}
> >
More info {translate('MoreInfo')}
</Button> </Button>
</div> </div>
</div> </div>

@ -53,7 +53,7 @@ function EditIndexerModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{`${id ? 'Edit' : 'Add'} Indexer - ${implementationName}`} {`${id ? translate('EditIndexer') : translate('AddIndexer')} - ${implementationName}`}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -204,7 +204,7 @@ function EditIndexerModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteIndexerPress} onPress={onDeleteIndexerPress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
@ -213,13 +213,13 @@ function EditIndexerModalContent(props) {
error={saveError} error={saveError}
onPress={onTestPress} onPress={onTestPress}
> >
Test {translate('Test')}
</SpinnerErrorButton> </SpinnerErrorButton>
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -227,7 +227,7 @@ function EditIndexerModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -15,26 +15,26 @@ import NamingConnector from './Naming/NamingConnector';
import RootFoldersConnector from './RootFolder/RootFoldersConnector'; import RootFoldersConnector from './RootFolder/RootFoldersConnector';
const rescanAfterRefreshOptions = [ const rescanAfterRefreshOptions = [
{ key: 'always', value: 'Always' }, { key: 'always', value: translate('Always') },
{ key: 'afterManual', value: 'After Manual Refresh' }, { key: 'afterManual', value: translate('AfterManualRefresh') },
{ key: 'never', value: 'Never' } { key: 'never', value: translate('Never') }
]; ];
const allowFingerprintingOptions = [ const allowFingerprintingOptions = [
{ key: 'allFiles', value: 'Always' }, { key: 'allFiles', value: translate('Always') },
{ key: 'newFiles', value: 'For new imports only' }, { key: 'newFiles', value: translate('ForNewImportsOnly') },
{ key: 'never', value: 'Never' } { key: 'never', value: translate('Never') }
]; ];
const downloadPropersAndRepacksOptions = [ const downloadPropersAndRepacksOptions = [
{ key: 'preferAndUpgrade', value: 'Prefer and Upgrade' }, { key: 'preferAndUpgrade', value: translate('PreferAndUpgrade') },
{ key: 'doNotUpgrade', value: 'Do not Upgrade Automatically' }, { key: 'doNotUpgrade', value: translate('DoNotUpgradeAutomatically') },
{ key: 'doNotPrefer', value: 'Do not Prefer' } { key: 'doNotPrefer', value: translate('DoNotPrefer') }
]; ];
const fileDateOptions = [ const fileDateOptions = [
{ key: 'none', value: 'None' }, { key: 'none', value: translate('None') },
{ key: 'albumReleaseDate', value: 'Album Release Date' } { key: 'albumReleaseDate', value: translate('AlbumReleaseDate') }
]; ];
class MediaManagement extends Component { class MediaManagement extends Component {

@ -51,7 +51,7 @@ function EditRootFolderModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Root Folder' : 'Add Root Folder'} {id ? translate('EditRootFolder') : translate('AddRootFolder')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -216,14 +216,14 @@ function EditRootFolderModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteRootFolderPress} onPress={onDeleteRootFolderPress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -231,7 +231,7 @@ function EditRootFolderModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -35,7 +35,7 @@ function EditMetadataModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
Edit {name.value} Metadata {translate('EditMetadata')} - {name.value}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -75,7 +75,7 @@ function EditMetadataModalContent(props) {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -83,7 +83,7 @@ function EditMetadataModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -5,6 +5,7 @@ import Link from 'Components/Link/Link';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import MenuContent from 'Components/Menu/MenuContent'; import MenuContent from 'Components/Menu/MenuContent';
import { sizes } from 'Helpers/Props'; import { sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AddNotificationPresetMenuItem from './AddNotificationPresetMenuItem'; import AddNotificationPresetMenuItem from './AddNotificationPresetMenuItem';
import styles from './AddNotificationItem.css'; import styles from './AddNotificationItem.css';
@ -57,7 +58,7 @@ class AddNotificationItem extends Component {
size={sizes.SMALL} size={sizes.SMALL}
onPress={this.onNotificationSelect} onPress={this.onNotificationSelect}
> >
Custom {translate('Custom')}
</Button> </Button>
<Menu className={styles.presetsMenu}> <Menu className={styles.presetsMenu}>
@ -65,7 +66,7 @@ class AddNotificationItem extends Component {
className={styles.presetsMenuButton} className={styles.presetsMenuButton}
size={sizes.SMALL} size={sizes.SMALL}
> >
Presets {translate('Presets')}
</Button> </Button>
<MenuContent> <MenuContent>
@ -90,7 +91,7 @@ class AddNotificationItem extends Component {
to={infoLink} to={infoLink}
size={sizes.SMALL} size={sizes.SMALL}
> >
More info {translate('MoreInfo')}
</Button> </Button>
</div> </div>
</div> </div>

@ -48,7 +48,7 @@ function EditNotificationModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{`${id ? 'Edit' : 'Add'} Connection - ${implementationName}`} {`${id ? translate('EditConnection') : translate('AddConnection')} - ${implementationName}`}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -136,7 +136,7 @@ function EditNotificationModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteNotificationPress} onPress={onDeleteNotificationPress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
@ -145,13 +145,13 @@ function EditNotificationModalContent(props) {
error={saveError} error={saveError}
onPress={onTestPress} onPress={onTestPress}
> >
Test {translate('Test')}
</SpinnerErrorButton> </SpinnerErrorButton>
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -159,7 +159,7 @@ function EditNotificationModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -88,9 +88,9 @@ class DelayProfile extends Component {
let preferred = titleCase(preferredProtocol); let preferred = titleCase(preferredProtocol);
if (!enableUsenet) { if (!enableUsenet) {
preferred = 'Only Torrent'; preferred = translate('OnlyTorrent');
} else if (!enableTorrent) { } else if (!enableTorrent) {
preferred = 'Only Usenet'; preferred = translate('OnlyUsenet');
} }
return ( return (

@ -82,10 +82,18 @@ class DelayProfiles extends Component {
> >
<div> <div>
<div className={styles.delayProfilesHeader}> <div className={styles.delayProfilesHeader}>
<div className={styles.column}>Protocol</div> <div className={styles.column}>
<div className={styles.column}>Usenet Delay</div> {translate('PreferredProtocol')}
<div className={styles.column}>Torrent Delay</div> </div>
<div className={styles.tags}>Tags</div> <div className={styles.column}>
{translate('UsenetDelay')}
</div>
<div className={styles.column}>
{translate('TorrentDelay')}
</div>
<div className={styles.tags}>
{translate('Tags')}
</div>
</div> </div>
<div className={styles.delayProfiles}> <div className={styles.delayProfiles}>

@ -17,6 +17,13 @@ import { boolSettingShape, numberSettingShape, tagSettingShape } from 'Helpers/P
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
import styles from './EditDelayProfileModalContent.css'; 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) { function EditDelayProfileModalContent(props) {
const { const {
id, id,
@ -26,7 +33,6 @@ function EditDelayProfileModalContent(props) {
saveError, saveError,
item, item,
protocol, protocol,
protocolOptions,
onInputChange, onInputChange,
onProtocolChange, onProtocolChange,
onSavePress, onSavePress,
@ -46,29 +52,29 @@ function EditDelayProfileModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Delay Profile' : 'Add Delay Profile'} {id ? translate('EditDelayProfile') : translate('AddDelayProfile')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
{ {
isFetching && isFetching ?
<LoadingIndicator /> <LoadingIndicator /> :
null
} }
{ {
!isFetching && !!error && !isFetching && !!error ?
<div> <div>
{translate('UnableToAddANewQualityProfilePleaseTryAgain')} {translate('UnableToAddANewQualityProfilePleaseTryAgain')}
</div> </div> :
null
} }
{ {
!isFetching && !error && !isFetching && !error ?
<Form {...otherProps}> <Form {...otherProps}>
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>{translate('PreferredProtocol')}</FormLabel>
{translate('Protocol')}
</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
@ -83,9 +89,7 @@ function EditDelayProfileModalContent(props) {
{ {
enableUsenet.value && enableUsenet.value &&
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>{translate('UsenetDelay')}</FormLabel>
{translate('UsenetDelay')}
</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
@ -101,9 +105,7 @@ function EditDelayProfileModalContent(props) {
{ {
enableTorrent.value && enableTorrent.value &&
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>{translate('TorrentDelay')}</FormLabel>
{translate('TorrentDelay')}
</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.NUMBER} type={inputTypes.NUMBER}
@ -119,13 +121,11 @@ function EditDelayProfileModalContent(props) {
{ {
id === 1 ? id === 1 ?
<Alert> <Alert>
This is the default profile. It applies to all artist that don't have an explicit profile. {translate('DefaultDelayProfileHelpText')}
</Alert> : </Alert> :
<FormGroup> <FormGroup>
<FormLabel> <FormLabel>{translate('Tags')}</FormLabel>
{translate('Tags')}
</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.TAG} type={inputTypes.TAG}
@ -136,25 +136,27 @@ function EditDelayProfileModalContent(props) {
/> />
</FormGroup> </FormGroup>
} }
</Form> </Form> :
null
} }
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
{ {
id && id > 1 && id && id > 1 ?
<Button <Button
className={styles.deleteButton} className={styles.deleteButton}
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteDelayProfilePress} onPress={onDeleteDelayProfilePress}
> >
Delete {translate('Delete')}
</Button> </Button> :
null
} }
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -162,7 +164,7 @@ function EditDelayProfileModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>
@ -186,7 +188,6 @@ EditDelayProfileModalContent.propTypes = {
saveError: PropTypes.object, saveError: PropTypes.object,
item: PropTypes.shape(delayProfileShape).isRequired, item: PropTypes.shape(delayProfileShape).isRequired,
protocol: PropTypes.string.isRequired, protocol: PropTypes.string.isRequired,
protocolOptions: PropTypes.arrayOf(PropTypes.object).isRequired,
onInputChange: PropTypes.func.isRequired, onInputChange: PropTypes.func.isRequired,
onProtocolChange: PropTypes.func.isRequired, onProtocolChange: PropTypes.func.isRequired,
onSavePress: PropTypes.func.isRequired, onSavePress: PropTypes.func.isRequired,

@ -16,13 +16,6 @@ const newDelayProfile = {
tags: [] 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() { function createDelayProfileSelector() {
return createSelector( return createSelector(
(state, { id }) => id, (state, { id }) => id,
@ -78,7 +71,6 @@ function createMapStateToProps() {
return { return {
protocol, protocol,
protocolOptions,
...delayProfile ...delayProfile
}; };
} }

@ -46,7 +46,7 @@ function EditMetadataProfileModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Metadata Profile' : 'Add Metadata Profile'} {id ? translate('EditMetadataProfile') : translate('AddMetadataProfile')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -117,7 +117,7 @@ function EditMetadataProfileModalContent(props) {
isDisabled={isInUse} isDisabled={isInUse}
onPress={onDeleteMetadataProfilePress} onPress={onDeleteMetadataProfilePress}
> >
Delete {translate('Delete')}
</Button> </Button>
</div> </div>
} }
@ -125,7 +125,7 @@ function EditMetadataProfileModalContent(props) {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -133,7 +133,7 @@ function EditMetadataProfileModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -119,7 +119,7 @@ class EditQualityProfileModalContent extends Component {
onMeasure={this.onHeaderMeasure} onMeasure={this.onHeaderMeasure}
> >
<ModalHeader> <ModalHeader>
{id ? 'Edit Quality Profile' : 'Add Quality Profile'} {id ? translate('EditQualityProfile') : translate('AddQualityProfile')}
</ModalHeader> </ModalHeader>
</Measure> </Measure>
@ -161,7 +161,7 @@ class EditQualityProfileModalContent extends Component {
<FormGroup size={sizes.EXTRA_SMALL}> <FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}> <FormLabel size={sizes.SMALL}>
Upgrades Allowed {translate('UpgradesAllowed')}
</FormLabel> </FormLabel>
<FormInputGroup <FormInputGroup
@ -226,7 +226,7 @@ class EditQualityProfileModalContent extends Component {
isDisabled={isInUse} isDisabled={isInUse}
onPress={onDeleteQualityProfilePress} onPress={onDeleteQualityProfilePress}
> >
Delete {translate('Delete')}
</Button> </Button>
</div> </div>
} }
@ -234,7 +234,7 @@ class EditQualityProfileModalContent extends Component {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -242,7 +242,7 @@ class EditQualityProfileModalContent extends Component {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</Measure> </Measure>

@ -43,7 +43,7 @@ function EditReleaseProfileModalContent(props) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
{id ? 'Edit Release Profile' : 'Add Release Profile'} {id ? translate('EditReleaseProfile') : translate('AddReleaseProfile')}
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>
@ -170,14 +170,14 @@ function EditReleaseProfileModalContent(props) {
kind={kinds.DANGER} kind={kinds.DANGER}
onPress={onDeleteReleaseProfilePress} onPress={onDeleteReleaseProfilePress}
> >
Delete {translate('Delete')}
</Button> </Button>
} }
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerErrorButton <SpinnerErrorButton
@ -185,7 +185,7 @@ function EditReleaseProfileModalContent(props) {
error={saveError} error={saveError}
onPress={onSavePress} onPress={onSavePress}
> >
Save {translate('Save')}
</SpinnerErrorButton> </SpinnerErrorButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -25,9 +25,16 @@ class QualityDefinitions extends Component {
{...otherProps} {...otherProps}
> >
<div className={styles.header}> <div className={styles.header}>
<div className={styles.quality}>Quality</div> <div className={styles.quality}>
<div className={styles.title}>Title</div> {translate('Quality')}
<div className={styles.sizeLimit}>Size Limit</div> </div>
<div className={styles.title}>
{translate('Title')}
</div>
<div className={styles.sizeLimit}>
{translate('SizeLimit')}
</div>
{ {
advancedSettings ? advancedSettings ?
<div className={styles.kilobitsPerSecond}> <div className={styles.kilobitsPerSecond}>
@ -53,7 +60,7 @@ class QualityDefinitions extends Component {
<div className={styles.sizeLimitHelpTextContainer}> <div className={styles.sizeLimitHelpTextContainer}>
<div className={styles.sizeLimitHelpText}> <div className={styles.sizeLimitHelpText}>
Limits are automatically adjusted for the album duration. {translate('QualityLimitsHelpText')}
</div> </div>
</div> </div>
</PageSectionContent> </PageSectionContent>

@ -187,23 +187,19 @@ class UISettings extends Component {
legend={translate('Style')} legend={translate('Style')}
> >
<FormGroup> <FormGroup>
<FormLabel>Theme</FormLabel> <FormLabel>{translate('Theme')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.SELECT} type={inputTypes.SELECT}
name="theme" name="theme"
helpText="Change Application UI Theme, Inspired by Theme.Park" helpText={translate('ThemeHelpText')}
values={themeOptions} values={themeOptions}
onChange={onInputChange} onChange={onInputChange}
{...settings.theme} {...settings.theme}
/> />
</FormGroup> </FormGroup>
<FormLabel>
{translate('EnableColorImpairedMode')}
</FormLabel>
<FormGroup> <FormGroup>
<FormLabel>Enable Color-Impaired Mode</FormLabel> <FormLabel>{translate('EnableColorImpairedMode')}</FormLabel>
<FormInputGroup <FormInputGroup
type={inputTypes.CHECK} type={inputTypes.CHECK}
name="enableColorImpairedMode" name="enableColorImpairedMode"

@ -5,6 +5,7 @@ import albumEntities from 'Album/albumEntities';
import { sortDirections } from 'Helpers/Props'; import { sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import translate from 'Utilities/String/translate';
import { updateItem } from './baseActions'; import { updateItem } from './baseActions';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -41,58 +42,58 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'monitored', name: 'monitored',
columnLabel: 'Monitored', columnLabel: translate('Monitored'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'title', name: 'title',
label: 'Title', label: translate('Title'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'releaseDate', name: 'releaseDate',
label: 'Release Date', label: translate('ReleaseDate'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'secondaryTypes', name: 'secondaryTypes',
label: 'Secondary Types', label: translate('SecondaryTypes'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'mediumCount', name: 'mediumCount',
label: 'Media Count', label: translate('MediaCount'),
isVisible: false isVisible: false
}, },
{ {
name: 'trackCount', name: 'trackCount',
label: 'Track Count', label: translate('TrackCount'),
isVisible: false isVisible: false
}, },
{ {
name: 'duration', name: 'duration',
label: 'Duration', label: translate('Duration'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'rating', name: 'rating',
label: 'Rating', label: translate('Rating'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: translate('Status'),
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

@ -2,6 +2,7 @@ import { createAction } from 'redux-actions';
import { filterBuilderTypes, filterBuilderValueTypes, sortDirections } from 'Helpers/Props'; import { filterBuilderTypes, filterBuilderValueTypes, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import translate from 'Utilities/String/translate';
import { fetchAlbums } from './albumActions'; import { fetchAlbums } from './albumActions';
import { filterPredicates, filters } from './artistActions'; import { filterPredicates, filters } from './artistActions';
import { set } from './baseActions'; import { set } from './baseActions';
@ -31,41 +32,41 @@ export const defaultState = {
filterBuilderProps: [ filterBuilderProps: [
{ {
name: 'monitored', name: 'monitored',
label: 'Monitored', label: translate('Monitored'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL valueType: filterBuilderValueTypes.BOOL
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: translate('Status'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.ARTIST_STATUS valueType: filterBuilderValueTypes.ARTIST_STATUS
}, },
{ {
name: 'artistType', name: 'artistType',
label: 'Artist Type', label: translate('ArtistType'),
type: filterBuilderTypes.EXACT type: filterBuilderTypes.EXACT
}, },
{ {
name: 'qualityProfileId', name: 'qualityProfileId',
label: 'Quality Profile', label: translate('QualityProfile'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.QUALITY_PROFILE valueType: filterBuilderValueTypes.QUALITY_PROFILE
}, },
{ {
name: 'metadataProfileId', name: 'metadataProfileId',
label: 'Metadata Profile', label: translate('MetadataProfile'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.METADATA_PROFILE valueType: filterBuilderValueTypes.METADATA_PROFILE
}, },
{ {
name: 'rootFolderPath', name: 'rootFolderPath',
label: 'Root Folder Path', label: translate('Root Folder Path'),
type: filterBuilderTypes.EXACT type: filterBuilderTypes.EXACT
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: translate('Tags'),
type: filterBuilderTypes.ARRAY, type: filterBuilderTypes.ARRAY,
valueType: filterBuilderValueTypes.TAG valueType: filterBuilderValueTypes.TAG
} }

@ -5,6 +5,7 @@ import { filterTypePredicates, filterTypes, sortDirections } from 'Helpers/Props
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import dateFilterPredicate from 'Utilities/Date/dateFilterPredicate'; import dateFilterPredicate from 'Utilities/Date/dateFilterPredicate';
import translate from 'Utilities/String/translate';
import { updateItem } from './baseActions'; import { updateItem } from './baseActions';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -20,12 +21,12 @@ export const section = 'artist';
export const filters = [ export const filters = [
{ {
key: 'all', key: 'all',
label: 'All', label: translate('All'),
filters: [] filters: []
}, },
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored Only', label: translate('MonitoredOnly'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -36,7 +37,7 @@ export const filters = [
}, },
{ {
key: 'unmonitored', key: 'unmonitored',
label: 'Unmonitored Only', label: translate('UnmonitoredOnly'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -47,7 +48,7 @@ export const filters = [
}, },
{ {
key: 'continuing', key: 'continuing',
label: 'Continuing Only', label: translate('ContinuingOnly'),
filters: [ filters: [
{ {
key: 'status', key: 'status',
@ -58,7 +59,7 @@ export const filters = [
}, },
{ {
key: 'ended', key: 'ended',
label: 'Ended Only', label: translate('EndedOnly'),
filters: [ filters: [
{ {
key: 'status', key: 'status',
@ -69,7 +70,7 @@ export const filters = [
}, },
{ {
key: 'missing', key: 'missing',
label: 'Missing Tracks', label: translate('MissingTracks'),
filters: [ filters: [
{ {
key: 'missing', key: 'missing',

@ -3,6 +3,7 @@ import { batchActions } from 'redux-batched-actions';
import { filterBuilderTypes, filterBuilderValueTypes, sortDirections } from 'Helpers/Props'; import { filterBuilderTypes, filterBuilderValueTypes, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import translate from 'Utilities/String/translate';
import { filterPredicates, filters, sortPredicates } from './artistActions'; import { filterPredicates, filters, sortPredicates } from './artistActions';
import { set, updateItem } from './baseActions'; import { set, updateItem } from './baseActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -34,44 +35,44 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'status', name: 'status',
columnLabel: 'Status', columnLabel: translate('Status'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'sortName', name: 'sortName',
label: 'Name', label: translate('Name'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'qualityProfileId', name: 'qualityProfileId',
label: 'Quality Profile', label: translate('QualityProfile'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'metadataProfileId', name: 'metadataProfileId',
label: 'Metadata Profile', label: translate('MetadataProfile'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'sizeOnDisk', name: 'sizeOnDisk',
label: 'Size on Disk', label: translate('SizeOnDisk'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: translate('Tags'),
isSortable: false, isSortable: false,
isVisible: true isVisible: true
} }
@ -80,47 +81,47 @@ export const defaultState = {
filterBuilderProps: [ filterBuilderProps: [
{ {
name: 'monitored', name: 'monitored',
label: 'Monitored', label: translate('Monitored'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL valueType: filterBuilderValueTypes.BOOL
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: translate('Status'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.ARTIST_STATUS valueType: filterBuilderValueTypes.ARTIST_STATUS
}, },
{ {
name: 'qualityProfileId', name: 'qualityProfileId',
label: 'Quality Profile', label: translate('QualityProfile'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.QUALITY_PROFILE valueType: filterBuilderValueTypes.QUALITY_PROFILE
}, },
{ {
name: 'metadataProfileId', name: 'metadataProfileId',
label: 'Metadata Profile', label: translate('MetadataProfile'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.METADATA_PROFILE valueType: filterBuilderValueTypes.METADATA_PROFILE
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
type: filterBuilderTypes.STRING type: filterBuilderTypes.STRING
}, },
{ {
name: 'rootFolderPath', name: 'rootFolderPath',
label: 'Root Folder Path', label: translate('RootFolderPath'),
type: filterBuilderTypes.EXACT type: filterBuilderTypes.EXACT
}, },
{ {
name: 'sizeOnDisk', name: 'sizeOnDisk',
label: 'Size on Disk', label: translate('SizeOnDisk'),
type: filterBuilderTypes.NUMBER, type: filterBuilderTypes.NUMBER,
valueType: filterBuilderValueTypes.BYTES valueType: filterBuilderValueTypes.BYTES
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: translate('Tags'),
type: filterBuilderTypes.ARRAY, type: filterBuilderTypes.ARRAY,
valueType: filterBuilderValueTypes.TAG valueType: filterBuilderValueTypes.TAG
} }

@ -1,6 +1,7 @@
import { createAction } from 'redux-actions'; import { createAction } from 'redux-actions';
import { filterBuilderTypes, filterBuilderValueTypes, filterTypePredicates, sortDirections } from 'Helpers/Props'; import { filterBuilderTypes, filterBuilderValueTypes, filterTypePredicates, sortDirections } from 'Helpers/Props';
import sortByName from 'Utilities/Array/sortByName'; import sortByName from 'Utilities/Array/sortByName';
import translate from 'Utilities/String/translate';
import { filterPredicates, filters, sortPredicates } from './artistActions'; import { filterPredicates, filters, sortPredicates } from './artistActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer'; import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer';
@ -61,105 +62,105 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'status', name: 'status',
columnLabel: 'Status', columnLabel: translate('Status'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'sortName', name: 'sortName',
label: 'Artist Name', label: translate('ArtistName'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'artistType', name: 'artistType',
label: 'Type', label: translate('Type'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'qualityProfileId', name: 'qualityProfileId',
label: 'Quality Profile', label: translate('QualityProfile'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'metadataProfileId', name: 'metadataProfileId',
label: 'Metadata Profile', label: translate('MetadataProfile'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'nextAlbum', name: 'nextAlbum',
label: 'Next Album', label: translate('NextAlbum'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'lastAlbum', name: 'lastAlbum',
label: 'Last Album', label: translate('LastAlbum'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'added', name: 'added',
label: 'Added', label: translate('Added'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'albumCount', name: 'albumCount',
label: 'Albums', label: translate('Albums'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'trackProgress', name: 'trackProgress',
label: 'Tracks', label: translate('Tracks'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'trackCount', name: 'trackCount',
label: 'Track Count', label: translate('TrackCount'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'sizeOnDisk', name: 'sizeOnDisk',
label: 'Size on Disk', label: translate('SizeOnDisk'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'genres', name: 'genres',
label: 'Genres', label: translate('Genres'),
isSortable: false, isSortable: false,
isVisible: false isVisible: false
}, },
{ {
name: 'ratings', name: 'ratings',
label: 'Rating', label: translate('Rating'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: translate('Tags'),
isSortable: false, isSortable: false,
isVisible: false isVisible: false
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }
@ -242,70 +243,70 @@ export const defaultState = {
filterBuilderProps: [ filterBuilderProps: [
{ {
name: 'monitored', name: 'monitored',
label: 'Monitored', label: translate('Monitored'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL valueType: filterBuilderValueTypes.BOOL
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: translate('Status'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.ARTIST_STATUS valueType: filterBuilderValueTypes.ARTIST_STATUS
}, },
{ {
name: 'qualityProfileId', name: 'qualityProfileId',
label: 'Quality Profile', label: translate('QualityProfile'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.QUALITY_PROFILE valueType: filterBuilderValueTypes.QUALITY_PROFILE
}, },
{ {
name: 'metadataProfileId', name: 'metadataProfileId',
label: 'Metadata Profile', label: translate('MetadataProfile'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.METADATA_PROFILE valueType: filterBuilderValueTypes.METADATA_PROFILE
}, },
{ {
name: 'nextAlbum', name: 'nextAlbum',
label: 'Next Album', label: translate('NextAlbum'),
type: filterBuilderTypes.DATE, type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE valueType: filterBuilderValueTypes.DATE
}, },
{ {
name: 'lastAlbum', name: 'lastAlbum',
label: 'Last Album', label: translate('LastAlbum'),
type: filterBuilderTypes.DATE, type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE valueType: filterBuilderValueTypes.DATE
}, },
{ {
name: 'added', name: 'added',
label: 'Added', label: translate('Added'),
type: filterBuilderTypes.DATE, type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE valueType: filterBuilderValueTypes.DATE
}, },
{ {
name: 'albumCount', name: 'albumCount',
label: 'Album Count', label: translate('AlbumCount'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'trackProgress', name: 'trackProgress',
label: 'Track Progress', label: translate('TrackProgress'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
type: filterBuilderTypes.STRING type: filterBuilderTypes.STRING
}, },
{ {
name: 'sizeOnDisk', name: 'sizeOnDisk',
label: 'Size on Disk', label: translate('SizeOnDisk'),
type: filterBuilderTypes.NUMBER, type: filterBuilderTypes.NUMBER,
valueType: filterBuilderValueTypes.BYTES valueType: filterBuilderValueTypes.BYTES
}, },
{ {
name: 'genres', name: 'genres',
label: 'Genres', label: translate('Genres'),
type: filterBuilderTypes.ARRAY, type: filterBuilderTypes.ARRAY,
optionsSelector: function(items) { optionsSelector: function(items) {
const tagList = items.reduce((acc, artist) => { const tagList = items.reduce((acc, artist) => {
@ -324,12 +325,12 @@ export const defaultState = {
}, },
{ {
name: 'ratings', name: 'ratings',
label: 'Rating', label: translate('Rating'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: translate('Tags'),
type: filterBuilderTypes.ARRAY, type: filterBuilderTypes.ARRAY,
valueType: filterBuilderValueTypes.TAG valueType: filterBuilderValueTypes.TAG
} }

@ -4,6 +4,7 @@ import { sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import { set, updateItem } from './baseActions'; import { set, updateItem } from './baseActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createRemoveItemHandler from './Creators/createRemoveItemHandler'; import createRemoveItemHandler from './Creators/createRemoveItemHandler';
@ -32,36 +33,36 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'artists.sortName', name: 'artists.sortName',
label: 'Artist Name', label: translate('ArtistName'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'sourceTitle', name: 'sourceTitle',
label: 'Source Title', label: translate('SourceTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
isVisible: true isVisible: true
}, },
{ {
name: 'date', name: 'date',
label: 'Date', label: translate('Date'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'indexer', name: 'indexer',
label: 'Indexer', label: translate('Indexer'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

@ -7,6 +7,7 @@ import * as commandNames from 'Commands/commandNames';
import { filterTypes } from 'Helpers/Props'; import { filterTypes } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import translate from 'Utilities/String/translate';
import { set, update } from './baseActions'; import { set, update } from './baseActions';
import { executeCommandHelper } from './commandActions'; import { executeCommandHelper } from './commandActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -50,7 +51,7 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: translate('All'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -61,7 +62,7 @@ export const defaultState = {
}, },
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored Only', label: translate('MonitoredOnly'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',

@ -3,6 +3,7 @@ import { filterTypes, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import { updateItem } from './baseActions'; import { updateItem } from './baseActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers'; import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers';
@ -29,61 +30,61 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'eventType', name: 'eventType',
columnLabel: 'Event Type', columnLabel: translate('EventType'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'artists.sortName', name: 'artists.sortName',
label: 'Artist', label: translate('Artist'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albums.title', name: 'albums.title',
label: 'Album Title', label: translate('AlbumTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'trackTitle', name: 'trackTitle',
label: 'Track Title', label: translate('TrackTitle'),
isVisible: true isVisible: true
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
isVisible: true isVisible: true
}, },
{ {
name: 'date', name: 'date',
label: 'Date', label: translate('Date'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'downloadClient', name: 'downloadClient',
label: 'Download Client', label: translate('DownloadClient'),
isVisible: false isVisible: false
}, },
{ {
name: 'indexer', name: 'indexer',
label: 'Indexer', label: translate('Indexer'),
isVisible: false isVisible: false
}, },
{ {
name: 'releaseGroup', name: 'releaseGroup',
label: 'Release Group', label: translate('ReleaseGroup'),
isVisible: false isVisible: false
}, },
{ {
name: 'sourceTitle', name: 'sourceTitle',
label: 'Source Title', label: translate('SourceTitle'),
isVisible: false isVisible: false
}, },
{ {
name: 'details', name: 'details',
columnLabel: 'Details', columnLabel: translate('Details'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }
@ -94,12 +95,12 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: translate('All'),
filters: [] filters: []
}, },
{ {
key: 'grabbed', key: 'grabbed',
label: 'Grabbed', label: translate('Grabbed'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -110,7 +111,7 @@ export const defaultState = {
}, },
{ {
key: 'trackFileImported', key: 'trackFileImported',
label: 'Track Imported', label: translate('TrackImported'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -121,7 +122,7 @@ export const defaultState = {
}, },
{ {
key: 'failed', key: 'failed',
label: 'Download Failed', label: translate('DownloadFailed'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -132,7 +133,7 @@ export const defaultState = {
}, },
{ {
key: 'importFailed', key: 'importFailed',
label: 'Import Failed', label: translate('ImportFailed'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -143,7 +144,7 @@ export const defaultState = {
}, },
{ {
key: 'downloadImported', key: 'downloadImported',
label: 'Download Imported', label: translate('DownloadImported'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -154,7 +155,7 @@ export const defaultState = {
}, },
{ {
key: 'deleted', key: 'deleted',
label: 'Deleted', label: translate('Deleted'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -165,7 +166,7 @@ export const defaultState = {
}, },
{ {
key: 'renamed', key: 'renamed',
label: 'Renamed', label: translate('Renamed'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -176,7 +177,7 @@ export const defaultState = {
}, },
{ {
key: 'retagged', key: 'retagged',
label: 'Retagged', label: translate('Retagged'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -187,7 +188,7 @@ export const defaultState = {
}, },
{ {
key: 'ignored', key: 'ignored',
label: 'Ignored', label: translate('Ignored'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',

@ -5,6 +5,7 @@ import { sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import { set, updateItem } from './baseActions'; import { set, updateItem } from './baseActions';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -57,86 +58,86 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'status', name: 'status',
columnLabel: 'Status', columnLabel: translate('Status'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'artists.sortName', name: 'artists.sortName',
label: 'Artist', label: translate('Artist'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albums.title', name: 'albums.title',
label: 'Album Title', label: translate('AlbumTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albums.releaseDate', name: 'albums.releaseDate',
label: 'Album Release Date', label: translate('AlbumReleaseDate'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'protocol', name: 'protocol',
label: 'Protocol', label: translate('Protocol'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'indexer', name: 'indexer',
label: 'Indexer', label: translate('Indexer'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'downloadClient', name: 'downloadClient',
label: 'Download Client', label: translate('DownloadClient'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'title', name: 'title',
label: 'Release Title', label: translate('ReleaseTitle'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: translate('Size'),
isSortable: true, isSortable: true,
isVisibile: false isVisibile: false
}, },
{ {
name: 'outputPath', name: 'outputPath',
label: 'Output Path', label: translate('OutputPath'),
isSortable: false, isSortable: false,
isVisible: false isVisible: false
}, },
{ {
name: 'estimatedCompletionTime', name: 'estimatedCompletionTime',
label: 'Time Left', label: translate('TimeLeft'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'progress', name: 'progress',
label: 'Progress', label: translate('Progress'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

@ -2,6 +2,7 @@ import { createAction } from 'redux-actions';
import { filterBuilderTypes, filterBuilderValueTypes, filterTypes, sortDirections } from 'Helpers/Props'; import { filterBuilderTypes, filterBuilderValueTypes, filterTypes, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import translate from 'Utilities/String/translate';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer'; import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer';
@ -51,12 +52,12 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: translate('All'),
filters: [] filters: []
}, },
{ {
key: 'discography-pack', key: 'discography-pack',
label: 'Discography', label: translate('Discography'),
filters: [ filters: [
{ {
key: 'discography', key: 'discography',
@ -67,7 +68,7 @@ export const defaultState = {
}, },
{ {
key: 'not-discography-pack', key: 'not-discography-pack',
label: 'Not Discography', label: translate('NotDiscography'),
filters: [ filters: [
{ {
key: 'discography', key: 'discography',
@ -154,51 +155,51 @@ export const defaultState = {
filterBuilderProps: [ filterBuilderProps: [
{ {
name: 'title', name: 'title',
label: 'Title', label: translate('Title'),
type: filterBuilderTypes.STRING type: filterBuilderTypes.STRING
}, },
{ {
name: 'age', name: 'age',
label: 'Age', label: translate('Age'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'protocol', name: 'protocol',
label: 'Protocol', label: translate('Protocol'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.PROTOCOL valueType: filterBuilderValueTypes.PROTOCOL
}, },
{ {
name: 'indexerId', name: 'indexerId',
label: 'Indexer', label: translate('Indexer'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.INDEXER valueType: filterBuilderValueTypes.INDEXER
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: translate('Size'),
type: filterBuilderTypes.NUMBER, type: filterBuilderTypes.NUMBER,
valueType: filterBuilderValueTypes.BYTES valueType: filterBuilderValueTypes.BYTES
}, },
{ {
name: 'seeders', name: 'seeders',
label: 'Seeders', label: translate('Seeders'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'leechers', name: 'leechers',
label: 'Peers', label: translate('Peers'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.QUALITY valueType: filterBuilderValueTypes.QUALITY
}, },
{ {
name: 'rejectionCount', name: 'rejectionCount',
label: 'Rejection Count', label: translate('RejectionCount'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
} }
], ],

@ -121,12 +121,12 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: translate('All'),
filters: [] filters: []
}, },
{ {
key: 'info', key: 'info',
label: 'Info', label: translate('Info'),
filters: [ filters: [
{ {
key: 'level', key: 'level',
@ -137,7 +137,7 @@ export const defaultState = {
}, },
{ {
key: 'warn', key: 'warn',
label: 'Warn', label: translate('Warn'),
filters: [ filters: [
{ {
key: 'level', key: 'level',
@ -148,7 +148,7 @@ export const defaultState = {
}, },
{ {
key: 'error', key: 'error',
label: 'Error', label: translate('Error'),
filters: [ filters: [
{ {
key: 'level', key: 'level',

@ -1,6 +1,7 @@
import { createAction } from 'redux-actions'; import { createAction } from 'redux-actions';
import { sortDirections } from 'Helpers/Props'; import { sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import translate from 'Utilities/String/translate';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer'; import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer';
@ -27,42 +28,42 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'medium', name: 'medium',
label: 'Medium', label: translate('Medium'),
isVisible: false isVisible: false
}, },
{ {
name: 'absoluteTrackNumber', name: 'absoluteTrackNumber',
label: 'Track', label: translate('Track'),
isVisible: true isVisible: true
}, },
{ {
name: 'title', name: 'title',
label: 'Title', label: translate('Title'),
isVisible: true isVisible: true
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
isVisible: false isVisible: false
}, },
{ {
name: 'duration', name: 'duration',
label: 'Duration', label: translate('Duration'),
isVisible: true isVisible: true
}, },
{ {
name: 'audioInfo', name: 'audioInfo',
label: 'Audio Info', label: translate('AudioInfo'),
isVisible: true isVisible: true
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: translate('Status'),
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

@ -5,6 +5,7 @@ import albumEntities from 'Album/albumEntities';
import { sortDirections } from 'Helpers/Props'; import { sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import translate from 'Utilities/String/translate';
import { removeItem, set, updateItem } from './baseActions'; import { removeItem, set, updateItem } from './baseActions';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -43,32 +44,32 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: translate('Size'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'dateAdded', name: 'dateAdded',
label: 'Date Added', label: translate('DateAdded'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

@ -2,6 +2,7 @@ import { createAction } from 'redux-actions';
import { filterTypes, sortDirections } from 'Helpers/Props'; import { filterTypes, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import createBatchToggleAlbumMonitoredHandler from './Creators/createBatchToggleAlbumMonitoredHandler'; import createBatchToggleAlbumMonitoredHandler from './Creators/createBatchToggleAlbumMonitoredHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers'; import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers';
@ -29,25 +30,25 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'artists.sortName', name: 'artists.sortName',
label: 'Artist Name', label: translate('ArtistName'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albums.title', name: 'albums.title',
label: 'Album Title', label: translate('AlbumTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albumType', name: 'albumType',
label: 'Album Type', label: translate('AlbumType'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'releaseDate', name: 'releaseDate',
label: 'Release Date', label: translate('ReleaseDate'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
@ -58,7 +59,7 @@ export const defaultState = {
// }, // },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }
@ -69,7 +70,7 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored', label: translate('Monitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -80,7 +81,7 @@ export const defaultState = {
}, },
{ {
key: 'unmonitored', key: 'unmonitored',
label: 'Unmonitored', label: translate('Unmonitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -103,25 +104,25 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'artists.sortName', name: 'artists.sortName',
label: 'Artist Name', label: translate('ArtistName'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albums.title', name: 'albums.title',
label: 'Album Title', label: translate('AlbumTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'albumType', name: 'albumType',
label: 'Album Type', label: translate('AlbumType'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'releaseDate', name: 'releaseDate',
label: 'Release Date', label: translate('ReleaseDate'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
@ -132,7 +133,7 @@ export const defaultState = {
// }, // },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }
@ -143,7 +144,7 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored', label: translate('Monitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -154,7 +155,7 @@ export const defaultState = {
}, },
{ {
key: 'unmonitored', key: 'unmonitored',
label: 'Unmonitored', label: translate('Unmonitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',

@ -76,14 +76,14 @@ class BackupRow extends Component {
} = this.state; } = this.state;
let iconClassName = icons.SCHEDULED; let iconClassName = icons.SCHEDULED;
let iconTooltip = translate('IconTooltip'); let iconTooltip = translate('Scheduled');
if (type === 'manual') { if (type === 'manual') {
iconClassName = icons.INTERACTIVE; iconClassName = icons.INTERACTIVE;
iconTooltip = 'Manual'; iconTooltip = translate('Manual');
} else if (type === 'update') { } else if (type === 'update') {
iconClassName = icons.UPDATE; iconClassName = icons.UPDATE;
iconTooltip = 'Before update'; iconTooltip = translate('BeforeUpdate');
} }
return ( return (

@ -20,17 +20,17 @@ const columns = [
}, },
{ {
name: 'name', name: 'name',
label: 'Name', label: translate('Name'),
isVisible: true isVisible: true
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: translate('Size'),
isVisible: true isVisible: true
}, },
{ {
name: 'time', name: 'time',
label: 'Time', label: translate('Time'),
isVisible: true isVisible: true
}, },
{ {

@ -14,7 +14,7 @@ import styles from './RestoreBackupModalContent.css';
function getErrorMessage(error) { function getErrorMessage(error) {
if (!error || !error.responseJSON || !error.responseJSON.message) { if (!error || !error.responseJSON || !error.responseJSON.message) {
return 'Error restoring backup'; return translate('ErrorRestoringBackup');
} }
return error.responseJSON.message; return error.responseJSON.message;
@ -146,7 +146,7 @@ class RestoreBackupModalContent extends Component {
<ModalBody> <ModalBody>
{ {
!!id && `Would you like to restore the backup '${name}'?` !!id && translate('WouldYouLikeToRestoreBackup', [name])
} }
{ {
@ -203,11 +203,11 @@ class RestoreBackupModalContent extends Component {
<ModalFooter> <ModalFooter>
<div className={styles.additionalInfo}> <div className={styles.additionalInfo}>
Note: Lidarr will automatically restart and reload the UI during the restore process. {translate('RestoreBackupAdditionalInfo')}
</div> </div>
<Button onPress={onModalClose}> <Button onPress={onModalClose}>
Cancel {translate('Cancel')}
</Button> </Button>
<SpinnerButton <SpinnerButton
@ -216,7 +216,7 @@ class RestoreBackupModalContent extends Component {
isSpinning={isRestoring} isSpinning={isRestoring}
onPress={this.onRestorePress} onPress={this.onRestorePress}
> >
Restore {translate('Restore')}
</SpinnerButton> </SpinnerButton>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>

@ -19,12 +19,12 @@ import LogFilesTableRow from './LogFilesTableRow';
const columns = [ const columns = [
{ {
name: 'filename', name: 'filename',
label: 'Filename', label: translate('Filename'),
isVisible: true isVisible: true
}, },
{ {
name: 'lastWriteTime', name: 'lastWriteTime',
label: 'Last Write Time', label: translate('LastWriteTime'),
isVisible: true isVisible: true
}, },
{ {

@ -15,17 +15,17 @@ import styles from './DiskSpace.css';
const columns = [ const columns = [
{ {
name: 'path', name: 'path',
label: 'Location', label: translate('Location'),
isVisible: true isVisible: true
}, },
{ {
name: 'freeSpace', name: 'freeSpace',
label: 'Free Space', label: translate('FreeSpace'),
isVisible: true isVisible: true
}, },
{ {
name: 'totalSpace', name: 'totalSpace',
label: 'Total Space', label: translate('TotalSpace'),
isVisible: true isVisible: true
}, },
{ {

@ -1,6 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import FieldSet from 'Components/FieldSet'; import FieldSet from 'Components/FieldSet';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import translate from 'Utilities/String/translate';
import styles from '../styles.css'; import styles from '../styles.css';
class Donations extends Component { class Donations extends Component {
@ -10,7 +11,7 @@ class Donations extends Component {
render() { render() {
return ( return (
<FieldSet legend='Donations'> <FieldSet legend={translate('Donations')}>
<div className={styles.logoContainer} title="Radarr"> <div className={styles.logoContainer} title="Radarr">
<Link to="https://radarr.video/donate"> <Link to="https://radarr.video/donate">
<img <img

@ -95,12 +95,12 @@ const columns = [
}, },
{ {
name: 'message', name: 'message',
label: 'Message', label: translate('Message'),
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
label: 'Actions', label: translate('Actions'),
isVisible: true isVisible: true
} }
]; ];

@ -15,27 +15,27 @@ const columns = [
}, },
{ {
name: 'commandName', name: 'commandName',
label: 'Name', label: translate('Name'),
isVisible: true isVisible: true
}, },
{ {
name: 'queued', name: 'queued',
label: 'Queued', label: translate('Queued'),
isVisible: true isVisible: true
}, },
{ {
name: 'started', name: 'started',
label: 'Started', label: translate('Started'),
isVisible: true isVisible: true
}, },
{ {
name: 'ended', name: 'ended',
label: 'Ended', label: translate('Ended'),
isVisible: true isVisible: true
}, },
{ {
name: 'duration', name: 'duration',
label: 'Duration', label: translate('Duration'),
isVisible: true isVisible: true
}, },
{ {

@ -10,27 +10,27 @@ import ScheduledTaskRowConnector from './ScheduledTaskRowConnector';
const columns = [ const columns = [
{ {
name: 'name', name: 'name',
label: 'Name', label: translate('Name'),
isVisible: true isVisible: true
}, },
{ {
name: 'interval', name: 'interval',
label: 'Interval', label: translate('Interval'),
isVisible: true isVisible: true
}, },
{ {
name: 'lastExecution', name: 'lastExecution',
label: 'Last Execution', label: translate('Last Execution'),
isVisible: true isVisible: true
}, },
{ {
name: 'lastDuration', name: 'lastDuration',
label: 'Last Duration', label: translate('Last Duration'),
isVisible: true isVisible: true
}, },
{ {
name: 'nextExecution', name: 'nextExecution',
label: 'Next Execution', label: translate('Next Execution'),
isVisible: true isVisible: true
}, },
{ {

@ -25,17 +25,17 @@ import styles from './TrackFileEditorModalContent.css';
const columns = [ const columns = [
{ {
name: 'trackNumber', name: 'trackNumber',
label: 'Track', label: translate('Track'),
isVisible: true isVisible: true
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: translate('Path'),
isVisible: true isVisible: true
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: translate('Quality'),
isVisible: true isVisible: true
} }
]; ];
@ -230,7 +230,7 @@ class TrackFileEditorModalContent extends Component {
<Button <Button
onPress={onModalClose} onPress={onModalClose}
> >
Close {translate('Close')}
</Button> </Button>
</ModalFooter> </ModalFooter>

@ -5,34 +5,61 @@
"About": "About", "About": "About",
"Absolute": "Absolute", "Absolute": "Absolute",
"Actions": "Actions", "Actions": "Actions",
"Activity": "Activity",
"Add": "Add",
"AddConnection": "Add Connection",
"AddDelayProfile": "Add Delay Profile",
"Added": "Added",
"AddedArtistSettings": "Added Artist Settings", "AddedArtistSettings": "Added Artist Settings",
"AddImportListExclusion": "Add Import List Exclusion",
"AddImportListExclusionHelpText": "Prevent artist from being added to Lidarr by Import lists", "AddImportListExclusionHelpText": "Prevent artist from being added to Lidarr by Import lists",
"AddIndexer": "Add Indexer",
"AddingTag": "Adding tag", "AddingTag": "Adding tag",
"AddList": "Add List",
"AddListExclusion": "Add List Exclusion", "AddListExclusion": "Add List Exclusion",
"AddMetadataProfile": "Add Metadata Profile",
"AddMissing": "Add missing", "AddMissing": "Add missing",
"AddNew": "Add New",
"AddNewItem": "Add New Item", "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", "AdvancedSettingsHiddenClickToShow": "Hidden, click to show",
"AdvancedSettingsShownClickToHide": "Shown, click to hide", "AdvancedSettingsShownClickToHide": "Shown, click to hide",
"AfterManualRefresh": "After Manual Refresh",
"Age": "Age",
"AgeWhenGrabbed": "Age (when grabbed)", "AgeWhenGrabbed": "Age (when grabbed)",
"Album": "Album", "Album": "Album",
"AlbumHasNotAired": "Album has not aired", "AlbumHasNotAired": "Album has not aired",
"AlbumIsDownloading": "Album is downloading", "AlbumIsDownloading": "Album is downloading",
"AlbumIsDownloadingInterp": "Album is downloading - {0}% {1}", "AlbumIsDownloadingInterp": "Album is downloading - {0}% {1}",
"AlbumIsNotMonitored": "Album is not monitored", "AlbumIsNotMonitored": "Album is not monitored",
"AlbumRelease": "Album Release",
"AlbumReleaseDate": "Album Release Date",
"Albums": "Albums",
"AlbumStatus": "Album Status",
"AlbumStudio": "Album Studio", "AlbumStudio": "Album Studio",
"AlbumTitle": "Album Title",
"AlbumType": "Album Type",
"All": "All",
"AllAlbums": "All Albums", "AllAlbums": "All Albums",
"AllAlbumsData": "Monitor all albums except specials", "AllAlbumsData": "Monitor all albums except specials",
"AllArtistAlbums": "All Artist Albums", "AllArtistAlbums": "All Artist Albums",
"AllExpandedCollapseAll": "Collapse All", "AllExpandedCollapseAll": "Collapse All",
"AllExpandedExpandAll": "Expand 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", "AllowArtistChangeClickToChangeArtist": "Click to change artist",
"AllowFingerprinting": "Allow Fingerprinting", "AllowFingerprinting": "Allow Fingerprinting",
"AllowFingerprintingHelpText": "Use fingerprinting to improve accuracy of track matching", "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.", "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", "AlreadyInYourLibrary": "Already in your library",
"AlternateTitles": "Alternate Titles", "AlternateTitles": "Alternate Titles",
"AlternateTitleslength1Title": "Title", "AlternateTitleslength1Title": "Title",
"AlternateTitleslength1Titles": "Titles", "AlternateTitleslength1Titles": "Titles",
"Always": "Always",
"Analytics": "Analytics", "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.", "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", "AnalyticsEnabledHelpTextWarning": "Requires restart to take effect",
@ -43,28 +70,35 @@
"AppDataDirectory": "AppData directory", "AppDataDirectory": "AppData directory",
"ApplicationURL": "Application URL", "ApplicationURL": "Application URL",
"ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base", "ApplicationUrlHelpText": "This application's external URL including http(s)://, port and URL base",
"Apply": "Apply",
"ApplyTags": "Apply Tags", "ApplyTags": "Apply Tags",
"ApplyTagsHelpTexts1": "How to apply tags to the selected artist", "ApplyTagsHelpTexts1": "How to apply tags to the selected artist",
"ApplyTagsHelpTexts2": "Add: Add the tags the existing list of tags", "ApplyTagsHelpTexts2": "Add: Add the tags the existing list of tags",
"ApplyTagsHelpTexts3": "Remove: Remove the entered tags", "ApplyTagsHelpTexts3": "Remove: Remove the entered tags",
"ApplyTagsHelpTexts4": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)", "ApplyTagsHelpTexts4": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)",
"AreYouSure": "Are you sure?",
"Artist": "Artist", "Artist": "Artist",
"ArtistAlbumClickToChangeTrack": "Click to change track", "ArtistAlbumClickToChangeTrack": "Click to change track",
"ArtistClickToChangeAlbum": "Click to change album", "ArtistClickToChangeAlbum": "Click to change album",
"ArtistEditor": "Artist Editor", "ArtistEditor": "Artist Editor",
"ArtistFolderFormat": "Artist Folder Format", "ArtistFolderFormat": "Artist Folder Format",
"ArtistName": "Artist Name",
"ArtistNameHelpText": "The name of the artist/album to exclude (can be anything meaningful)", "ArtistNameHelpText": "The name of the artist/album to exclude (can be anything meaningful)",
"Artists": "Artists", "Artists": "Artists",
"ArtistType": "Artist Type",
"AudioInfo": "Audio Info",
"Authentication": "Authentication", "Authentication": "Authentication",
"AuthenticationMethodHelpText": "Require Username and Password to access Lidarr", "AuthenticationMethodHelpText": "Require Username and Password to access Lidarr",
"Automatic": "Automatic", "Automatic": "Automatic",
"AutomaticallySwitchRelease": "Automatically Switch Release", "AutomaticallySwitchRelease": "Automatically Switch Release",
"AutoRedownloadFailedHelpText": "Automatically search for and attempt to download a different release", "AutoRedownloadFailedHelpText": "Automatically search for and attempt to download a different release",
"Backup": "Backup",
"BackupFolderHelpText": "Relative paths will be under Lidarr's AppData directory", "BackupFolderHelpText": "Relative paths will be under Lidarr's AppData directory",
"BackupIntervalHelpText": "Interval to backup the Lidarr DB and settings", "BackupIntervalHelpText": "Interval to backup the Lidarr DB and settings",
"BackupNow": "Backup Now", "BackupNow": "Backup Now",
"BackupRetentionHelpText": "Automatic backups older than the retention period will be cleaned up automatically", "BackupRetentionHelpText": "Automatic backups older than the retention period will be cleaned up automatically",
"Backups": "Backups", "Backups": "Backups",
"BeforeUpdate": "Before Update",
"BindAddress": "Bind Address", "BindAddress": "Bind Address",
"BindAddressHelpText": "Valid IPv4 address or '*' for all interfaces", "BindAddressHelpText": "Valid IPv4 address or '*' for all interfaces",
"BindAddressHelpTextWarning": "Requires restart to take effect", "BindAddressHelpTextWarning": "Requires restart to take effect",
@ -93,27 +127,36 @@
"ClientPriority": "Client Priority", "ClientPriority": "Client Priority",
"CloneIndexer": "Clone Indexer", "CloneIndexer": "Clone Indexer",
"CloneProfile": "Clone Profile", "CloneProfile": "Clone Profile",
"Close": "Close",
"CollapseMultipleAlbums": "Collapse Multiple Albums", "CollapseMultipleAlbums": "Collapse Multiple Albums",
"CollapseMultipleAlbumsHelpText": "Collapse multiple albums releasing on the same day", "CollapseMultipleAlbumsHelpText": "Collapse multiple albums releasing on the same day",
"Columns": "Columns", "Columns": "Columns",
"CombineWithExistingFiles": "Combine With Existing Files",
"CompletedDownloadHandling": "Completed Download Handling", "CompletedDownloadHandling": "Completed Download Handling",
"Component": "Component", "Component": "Component",
"Connect": "Connect",
"Connections": "Connections", "Connections": "Connections",
"ConnectSettings": "Connect Settings", "ConnectSettings": "Connect Settings",
"Continuing": "Continuing", "Continuing": "Continuing",
"ContinuingAllTracksDownloaded": "Continuing (All tracks downloaded)", "ContinuingAllTracksDownloaded": "Continuing (All tracks downloaded)",
"ContinuingMoreAlbumsAreExpected": "More albums are expected", "ContinuingMoreAlbumsAreExpected": "More albums are expected",
"ContinuingNoAdditionalAlbumsAreExpected": "No additional 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", "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.", "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", "Country": "Country",
"CreateEmptyArtistFolders": "Create empty artist folders", "CreateEmptyArtistFolders": "Create empty artist folders",
"CreateEmptyArtistFoldersHelpText": "Create missing artist folders during disk scan", "CreateEmptyArtistFoldersHelpText": "Create missing artist folders during disk scan",
"CreateGroup": "Create group", "CreateGroup": "Create group",
"Custom": "Custom",
"CustomFilters": "Custom Filters",
"CutoffHelpText": "Once this quality is reached Lidarr will no longer download albums", "CutoffHelpText": "Once this quality is reached Lidarr will no longer download albums",
"CutoffUnmet": "Cutoff Unmet", "CutoffUnmet": "Cutoff Unmet",
"Date": "Date",
"DateAdded": "Date Added",
"Dates": "Dates", "Dates": "Dates",
"DBMigration": "DB Migration", "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", "DefaultLidarrTags": "Default Lidarr Tags",
"DefaultMetadataProfileIdHelpText": "Default Metadata Profile for artists detected in this folder", "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", "DefaultMonitorOptionHelpText": "Which albums should be monitored on initial add for artists detected in this folder",
@ -123,8 +166,10 @@
"DelayProfile": "Delay Profile", "DelayProfile": "Delay Profile",
"DelayProfiles": "Delay Profiles", "DelayProfiles": "Delay Profiles",
"Delete": "Delete", "Delete": "Delete",
"DeleteArtist": "Delete Selected Artist",
"DeleteBackup": "Delete Backup", "DeleteBackup": "Delete Backup",
"DeleteBackupMessageText": "Are you sure you want to delete the backup '{0}'?", "DeleteBackupMessageText": "Are you sure you want to delete the backup '{0}'?",
"Deleted": "Deleted",
"DeleteDelayProfile": "Delete Delay Profile", "DeleteDelayProfile": "Delete Delay Profile",
"DeleteDelayProfileMessageText": "Are you sure you want to delete this delay profile?", "DeleteDelayProfileMessageText": "Are you sure you want to delete this delay profile?",
"DeleteDownloadClient": "Delete Download Client", "DeleteDownloadClient": "Delete Download Client",
@ -157,16 +202,23 @@
"DestinationPath": "Destination Path", "DestinationPath": "Destination Path",
"DetailedProgressBar": "Detailed Progress Bar", "DetailedProgressBar": "Detailed Progress Bar",
"DetailedProgressBarHelpText": "Show text on progess bar", "DetailedProgressBarHelpText": "Show text on progess bar",
"Details": "Details",
"Disambiguation": "Disambiguation", "Disambiguation": "Disambiguation",
"DiscCount": "Disc Count", "DiscCount": "Disc Count",
"DiscNumber": "Disc Number", "DiscNumber": "Disc Number",
"Discography": "Discography",
"DiskSpace": "Disk Space", "DiskSpace": "Disk Space",
"Docker": "Docker", "Docker": "Docker",
"Donations": "Donations",
"DoNotPrefer": "Do Not Prefer",
"DoNotUpgradeAutomatically": "Do not Upgrade Automatically",
"DownloadClient": "Download Client", "DownloadClient": "Download Client",
"DownloadClients": "Download Clients", "DownloadClients": "Download Clients",
"DownloadClientSettings": "Download Client Settings", "DownloadClientSettings": "Download Client Settings",
"DownloadFailed": "Download Failed",
"DownloadFailedCheckDownloadClientForMoreDetails": "Download failed: check download client for more details", "DownloadFailedCheckDownloadClientForMoreDetails": "Download failed: check download client for more details",
"DownloadFailedInterp": "Download failed: {0}", "DownloadFailedInterp": "Download failed: {0}",
"DownloadImported": "Download Imported",
"Downloading": "Downloading", "Downloading": "Downloading",
"DownloadPropersAndRepacksHelpTexts1": "Whether or not to automatically upgrade to Propers/Repacks", "DownloadPropersAndRepacksHelpTexts1": "Whether or not to automatically upgrade to Propers/Repacks",
"DownloadPropersAndRepacksHelpTexts2": "Use 'Do not Prefer' to sort by preferred word score over propers/repacks", "DownloadPropersAndRepacksHelpTexts2": "Use 'Do not Prefer' to sort by preferred word score over propers/repacks",
@ -174,6 +226,17 @@
"Duration": "Duration", "Duration": "Duration",
"Edit": "Edit", "Edit": "Edit",
"EditArtist": "Edit Artist", "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", "Enable": "Enable",
"EnableAutomaticAdd": "Enable Automatic Add", "EnableAutomaticAdd": "Enable Automatic Add",
"EnableAutomaticAddHelpText": "Add artist/albums to Lidarr when syncs are performed via the UI or by Lidarr", "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", "EnableSslHelpText": " Requires restart running as administrator to take effect",
"Ended": "Ended", "Ended": "Ended",
"EndedAllTracksDownloaded": "Ended (All tracks downloaded)", "EndedAllTracksDownloaded": "Ended (All tracks downloaded)",
"EndedOnly": "Ended Only",
"EntityName": "Entity Name", "EntityName": "Entity Name",
"Episode": "Episode", "Episode": "Episode",
"EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Episode does not have an absolute episode number", "EpisodeDoesNotHaveAnAbsoluteEpisodeNumber": "Episode does not have an absolute episode number",
"Error": "Error",
"ErrorLoadingContents": "Error loading contents", "ErrorLoadingContents": "Error loading contents",
"ErrorLoadingPreviews": "Error loading previews", "ErrorLoadingPreviews": "Error loading previews",
"ErrorRestoringBackup": "Error restoring backup",
"Events": "Events",
"EventType": "Event Type",
"Exception": "Exception", "Exception": "Exception",
"ExistingAlbums": "Existing Albums", "ExistingAlbums": "Existing Albums",
"ExistingAlbumsData": "Monitor albums that have files or have not released yet", "ExistingAlbumsData": "Monitor albums that have files or have not released yet",
@ -213,6 +281,7 @@
"FileNames": "File Names", "FileNames": "File Names",
"Files": "Files", "Files": "Files",
"FilterPlaceHolder": "Filter artist", "FilterPlaceHolder": "Filter artist",
"Filters": "Filters",
"FirstAlbum": "First Album", "FirstAlbum": "First Album",
"FirstAlbumData": "Monitor the first albums. All other albums will be ignored", "FirstAlbumData": "Monitor the first albums. All other albums will be ignored",
"FirstDayOfWeek": "First Day of Week", "FirstDayOfWeek": "First Day of Week",
@ -223,23 +292,30 @@
"ForMoreInformationOnTheIndividualDownloadClientsClickOnTheInfoButtons": "For more information on the individual download clients, click the more info buttons.", "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.", "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.", "ForMoreInformationOnTheIndividualListsClickOnTheInfoButtons": "For more information on the individual lists, click on the info buttons.",
"ForNewImportsOnly": "For new imports only",
"FreeSpace": "Free Space",
"FutureAlbums": "Future Albums", "FutureAlbums": "Future Albums",
"FutureAlbumsData": "Monitor albums that have not released yet", "FutureAlbumsData": "Monitor albums that have not released yet",
"FutureDays": "Future Days", "FutureDays": "Future Days",
"FutureDaysHelpText": "Days for iCal feed to look into the future", "FutureDaysHelpText": "Days for iCal feed to look into the future",
"General": "General",
"GeneralSettings": "General Settings", "GeneralSettings": "General Settings",
"Genres": "Genres",
"Global": "Global", "Global": "Global",
"GoToArtistListing": "Go to artist listing", "GoToArtistListing": "Go to artist listing",
"GoToInterp": "Go to {0}", "GoToInterp": "Go to {0}",
"Grab": "Grab", "Grab": "Grab",
"Grabbed": "Grabbed",
"GrabID": "Grab ID", "GrabID": "Grab ID",
"GrabRelease": "Grab Release", "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}'?", "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", "GrabSelected": "Grab Selected",
"Group": "Group", "Group": "Group",
"HardlinkCopyFiles": "Hardlink/Copy Files",
"HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "No monitored albums for this artist", "HasMonitoredAlbumsNoMonitoredAlbumsForThisArtist": "No monitored albums for this artist",
"HasPendingChangesNoChanges": "No Changes", "HasPendingChangesNoChanges": "No Changes",
"HasPendingChangesSaveChanges": "Save Changes", "HasPendingChangesSaveChanges": "Save Changes",
"HideAdvanced": "Hide Advanced",
"HideAlbums": "Hide albums", "HideAlbums": "Hide albums",
"HideTracks": "Hide tracks", "HideTracks": "Hide tracks",
"History": "History", "History": "History",
@ -252,13 +328,16 @@
"IconForCutoffUnmet": "Icon for Cutoff Unmet", "IconForCutoffUnmet": "Icon for Cutoff Unmet",
"IconTooltip": "Scheduled", "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.", "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", "IgnoredAddresses": "Ignored Addresses",
"IgnoredHelpText": "The release will be rejected if it contains one or more of terms (case insensitive)", "IgnoredHelpText": "The release will be rejected if it contains one or more of terms (case insensitive)",
"IgnoredPlaceHolder": "Add new restriction", "IgnoredPlaceHolder": "Add new restriction",
"IllRestartLater": "I'll restart later", "IllRestartLater": "I'll restart later",
"Import": "Import",
"ImportedTo": "Imported To", "ImportedTo": "Imported To",
"ImportExtraFiles": "Import Extra Files", "ImportExtraFiles": "Import Extra Files",
"ImportExtraFilesHelpText": "Import matching extra files (subtitles, nfo, etc) after importing an track file", "ImportExtraFilesHelpText": "Import matching extra files (subtitles, nfo, etc) after importing an track file",
"ImportFailed": "Import Failed",
"ImportFailedInterp": "Import failed: {0}", "ImportFailedInterp": "Import failed: {0}",
"ImportFailures": "Import failures", "ImportFailures": "Import failures",
"Importing": "Importing", "Importing": "Importing",
@ -280,8 +359,10 @@
"Indexers": "Indexers", "Indexers": "Indexers",
"IndexerSettings": "Indexer Settings", "IndexerSettings": "Indexer Settings",
"IndexerTagHelpText": "Only use this indexer for artist with at least one matching tag. Leave blank to use with all artists.", "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", "InstanceName": "Instance Name",
"InstanceNameHelpText": "Instance name in tab and for Syslog app name", "InstanceNameHelpText": "Instance name in tab and for Syslog app name",
"InteractiveImport": "Interactive Import",
"InteractiveSearch": "Interactive Search", "InteractiveSearch": "Interactive Search",
"Interval": "Interval", "Interval": "Interval",
"IsCutoffCutoff": "Cutoff", "IsCutoffCutoff": "Cutoff",
@ -299,11 +380,16 @@
"IsTagUsedCannotBeDeletedWhileInUse": "Cannot be deleted while in use", "IsTagUsedCannotBeDeletedWhileInUse": "Cannot be deleted while in use",
"Label": "Label", "Label": "Label",
"Language": "Language", "Language": "Language",
"LastAlbum": "Last Album",
"LastDuration": "Last Duration",
"LastExecution": "Last Execution",
"LastUsed": "Last Used",
"LastWriteTime": "Last Write Time",
"LatestAlbum": "Latest Album", "LatestAlbum": "Latest Album",
"LatestAlbumData": "Monitor the latest albums and future albums", "LatestAlbumData": "Monitor the latest albums and future albums",
"LaunchBrowserHelpText": " Open a web browser and navigate to Lidarr homepage on app start.", "LaunchBrowserHelpText": " Open a web browser and navigate to Lidarr homepage on app start.",
"Level": "Level", "Level": "Level",
"Lidarr": "Lidarr", "Library": "Library",
"LidarrSupportsAnyDownloadClientThatUsesTheNewznabStandardAsWellAsOtherDownloadClientsListedBelow": "Lidarr supports many popular torrent and usenet download clients.", "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.", "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.", "LidarrSupportsMultipleListsForImportingAlbumsAndArtistsIntoTheDatabase": "Lidarr supports multiple lists for importing Albums and Artists into the database.",
@ -313,6 +399,7 @@
"Local": "Local", "Local": "Local",
"LocalPath": "Local Path", "LocalPath": "Local Path",
"LocalPathHelpText": "Path that Lidarr should use to access the remote path locally", "LocalPathHelpText": "Path that Lidarr should use to access the remote path locally",
"Location": "Location",
"LogFiles": "Log Files", "LogFiles": "Log Files",
"Logging": "Logging", "Logging": "Logging",
"LogLevel": "Log Level", "LogLevel": "Log Level",
@ -321,21 +408,26 @@
"LongDateFormat": "Long Date Format", "LongDateFormat": "Long Date Format",
"MaintenanceRelease": "Maintenance release", "MaintenanceRelease": "Maintenance release",
"ManageTracks": "Manage Tracks", "ManageTracks": "Manage Tracks",
"Manual": "Manual",
"ManualDownload": "Manual Download", "ManualDownload": "Manual Download",
"ManualImport": "Manual Import", "ManualImport": "Manual Import",
"MarkAsFailed": "Mark as Failed", "MarkAsFailed": "Mark as Failed",
"MarkAsFailedMessageText": "Are you sure you want to mark '{0}' 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?", "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?", "MassAlbumsSearchWarning": "Are you sure you want to search for all '{0}' missing albums?",
"MassEditor": "Mass Editor",
"MaximumLimits": "Maximum Limits", "MaximumLimits": "Maximum Limits",
"MaximumSize": "Maximum Size", "MaximumSize": "Maximum Size",
"MaximumSizeHelpText": "Maximum size for a release to be grabbed in MB. Set to zero to set to unlimited.", "MaximumSizeHelpText": "Maximum size for a release to be grabbed in MB. Set to zero to set to unlimited.",
"Mechanism": "Mechanism", "Mechanism": "Mechanism",
"MediaCount": "Media Count",
"MediaInfo": "Media Info", "MediaInfo": "Media Info",
"MediaManagement": "MediaManagement",
"MediaManagementSettings": "Media Management Settings", "MediaManagementSettings": "Media Management Settings",
"Medium": "Medium", "Medium": "Medium",
"MediumFormat": "Medium Format", "MediumFormat": "Medium Format",
"Message": "Message", "Message": "Message",
"Metadata": "Metadata",
"MetadataConsumers": "Metadata Consumers", "MetadataConsumers": "Metadata Consumers",
"MetadataProfile": "Metadata Profile", "MetadataProfile": "Metadata Profile",
"MetadataProfileIdHelpText": "Metadata Profile list items should be added with", "MetadataProfileIdHelpText": "Metadata Profile list items should be added with",
@ -353,6 +445,7 @@
"Missing": "Missing", "Missing": "Missing",
"MissingAlbums": "Missing Albums", "MissingAlbums": "Missing Albums",
"MissingAlbumsData": "Monitor albums that do not have files or have not released yet", "MissingAlbumsData": "Monitor albums that do not have files or have not released yet",
"MissingTracks": "Missing Tracks",
"MissingTracksArtistMonitored": "Missing Tracks (Artist monitored)", "MissingTracksArtistMonitored": "Missing Tracks (Artist monitored)",
"MissingTracksArtistNotMonitored": "Missing Tracks (Artist not monitored)", "MissingTracksArtistNotMonitored": "Missing Tracks (Artist not monitored)",
"Mode": "Mode", "Mode": "Mode",
@ -360,12 +453,15 @@
"MonitorArtist": "Monitor Artist", "MonitorArtist": "Monitor Artist",
"Monitored": "Monitored", "Monitored": "Monitored",
"MonitoredHelpText": "Download monitored albums from this artist", "MonitoredHelpText": "Download monitored albums from this artist",
"MonitoredOnly": "Monitored Only",
"MonitoringOptions": "Monitoring Options", "MonitoringOptions": "Monitoring Options",
"MonitoringOptionsHelpText": "Which albums should be monitored after the artist is added (one-time adjustment)", "MonitoringOptionsHelpText": "Which albums should be monitored after the artist is added (one-time adjustment)",
"MonitorNewItems": "Monitor New Albums", "MonitorNewItems": "Monitor New Albums",
"MonitorNewItemsHelpText": "Which new albums should be monitored", "MonitorNewItemsHelpText": "Which new albums should be monitored",
"MonoVersion": "Mono Version", "MonoVersion": "Mono Version",
"MoreInfo": "More Info", "MoreInfo": "More Info",
"MoveAutomatically": "Move Automatically",
"MoveFiles": "Move Files",
"MultiDiscTrackFormat": "Multi Disc Track Format", "MultiDiscTrackFormat": "Multi Disc Track Format",
"MusicBrainzAlbumID": "MusicBrainz Album ID", "MusicBrainzAlbumID": "MusicBrainz Album ID",
"MusicBrainzArtistID": "MusicBrainz Artist ID", "MusicBrainzArtistID": "MusicBrainz Artist ID",
@ -378,8 +474,11 @@
"Name": "Name", "Name": "Name",
"NamingSettings": "Naming Settings", "NamingSettings": "Naming Settings",
"NETCore": ".NET", "NETCore": ".NET",
"Never": "Never",
"New": "New", "New": "New",
"NewAlbums": "New Albums", "NewAlbums": "New Albums",
"NextAlbum": "Next Album",
"NextExecution": "Next Execution",
"NoBackupsAreAvailable": "No backups are available", "NoBackupsAreAvailable": "No backups are available",
"NoHistory": "No history.", "NoHistory": "No history.",
"NoLeaveIt": "No, Leave It", "NoLeaveIt": "No, Leave It",
@ -388,9 +487,13 @@
"NoMinimumForAnyRuntime": "No minimum for any runtime", "NoMinimumForAnyRuntime": "No minimum for any runtime",
"None": "None", "None": "None",
"NoneData": "No albums will be monitored", "NoneData": "No albums will be monitored",
"NoneMonitoringOptionHelpText": "Do not monitor artists or albums",
"NoResults": "No Results Found",
"NoTagsHaveBeenAddedYet": "No tags have been added yet", "NoTagsHaveBeenAddedYet": "No tags have been added yet",
"NotDiscography": "Not Discography",
"NotificationTriggers": "Notification Triggers", "NotificationTriggers": "Notification Triggers",
"NoUpdatesAreAvailable": "No updates are available", "NoUpdatesAreAvailable": "No updates are available",
"Ok": "Ok",
"OnApplicationUpdate": "On Application Update", "OnApplicationUpdate": "On Application Update",
"OnApplicationUpdateHelpText": "On Application Update", "OnApplicationUpdateHelpText": "On Application Update",
"OnDownloadFailure": "On Download Failure", "OnDownloadFailure": "On Download Failure",
@ -401,6 +504,8 @@
"OnHealthIssueHelpText": "On Health Issue", "OnHealthIssueHelpText": "On Health Issue",
"OnImportFailure": "On Import Failure", "OnImportFailure": "On Import Failure",
"OnImportFailureHelpText": "On Import Failure", "OnImportFailureHelpText": "On Import Failure",
"OnlyTorrent": "Only Torrent",
"OnlyUsenet": "Only Usenet",
"OnReleaseImport": "On Release Import", "OnReleaseImport": "On Release Import",
"OnReleaseImportHelpText": "On Release Import", "OnReleaseImportHelpText": "On Release Import",
"OnRename": "On Rename", "OnRename": "On Rename",
@ -411,8 +516,11 @@
"OnUpgradeHelpText": "On Upgrade", "OnUpgradeHelpText": "On Upgrade",
"OpenBrowserOnStart": "Open browser on start", "OpenBrowserOnStart": "Open browser on start",
"Options": "Options", "Options": "Options",
"Organize": "Organize",
"OrganizeArtist": "Organize Selected Artist",
"Original": "Original", "Original": "Original",
"Other": "Other", "Other": "Other",
"OutputPath": "Output Path",
"PackageVersion": "Package Version", "PackageVersion": "Package Version",
"PageSize": "Page Size", "PageSize": "Page Size",
"PageSizeHelpText": "Number of items to show on each page", "PageSizeHelpText": "Number of items to show on each page",
@ -422,20 +530,28 @@
"Path": "Path", "Path": "Path",
"PathHelpText": "Root Folder containing your music library", "PathHelpText": "Root Folder containing your music library",
"PathHelpTextWarning": "This must be different to the directory where your download client puts files", "PathHelpTextWarning": "This must be different to the directory where your download client puts files",
"Peers": "Peers",
"Permissions": "Permissions", "Permissions": "Permissions",
"Playlist": "Playlist",
"Port": "Port", "Port": "Port",
"PortNumber": "Port Number", "PortNumber": "Port Number",
"PosterSize": "Poster Size", "PosterSize": "Poster Size",
"PreferAndUpgrade": "Prefer and Upgrade",
"Preferred": "Preferred", "Preferred": "Preferred",
"PreferredHelpTexts1": "The release will be preferred based on the each term's score (case insensitive)", "PreferredHelpTexts1": "The release will be preferred based on the each term's score (case insensitive)",
"PreferredHelpTexts2": "A positive score will be more preferred", "PreferredHelpTexts2": "A positive score will be more preferred",
"PreferredHelpTexts3": "A negative score will be less preferred", "PreferredHelpTexts3": "A negative score will be less preferred",
"PreferredProtocol": "Preferred Protocol",
"PreferredWordScore": "Preferred word score",
"Presets": "Presets",
"PreviewRename": "Preview Rename", "PreviewRename": "Preview Rename",
"PreviewRetag": "Preview Retag", "PreviewRetag": "Preview Retag",
"PrimaryAlbumTypes": "Primary Album Types", "PrimaryAlbumTypes": "Primary Album Types",
"PrimaryTypes": "Primary 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.", "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", "Profiles": "Profiles",
"Progress": "Progress",
"Proper": "Proper", "Proper": "Proper",
"PropersAndRepacks": "Propers and Repacks", "PropersAndRepacks": "Propers and Repacks",
"Protocol": "Protocol", "Protocol": "Protocol",
@ -449,13 +565,14 @@
"PublishedDate": "Published Date", "PublishedDate": "Published Date",
"Quality": "Quality", "Quality": "Quality",
"QualityDefinitions": "Quality Definitions", "QualityDefinitions": "Quality Definitions",
"QualityLimitsHelpText": "Limits are automatically adjusted for the album duration.",
"QualityProfile": "Quality Profile", "QualityProfile": "Quality Profile",
"QualityProfileIdHelpText": "Quality Profile list items should be added with", "QualityProfileIdHelpText": "Quality Profile list items should be added with",
"QualityProfiles": "Quality Profiles", "QualityProfiles": "Quality Profiles",
"QualitySettings": "Quality Settings", "QualitySettings": "Quality Settings",
"Queue": "Queue", "Queue": "Queue",
"Radarr": "Radarr", "Queued": "Queued",
"Readarr": "Readarr", "Rating": "Rating",
"ReadTheWikiForMoreInformation": "Read the Wiki for more information", "ReadTheWikiForMoreInformation": "Read the Wiki for more information",
"Real": "Real", "Real": "Real",
"Reason": "Reason", "Reason": "Reason",
@ -469,6 +586,7 @@
"RefreshArtist": "Refresh Artist", "RefreshArtist": "Refresh Artist",
"RefreshInformationAndScanDisk": "Refresh information and scan disk", "RefreshInformationAndScanDisk": "Refresh information and scan disk",
"RefreshScan": "Refresh & Scan", "RefreshScan": "Refresh & Scan",
"RejectionCount": "Rejection Count",
"Release": " Release", "Release": " Release",
"ReleaseDate": "Release Date", "ReleaseDate": "Release Date",
"ReleaseGroup": "Release Group", "ReleaseGroup": "Release Group",
@ -476,6 +594,7 @@
"ReleaseRejected": "Release Rejected", "ReleaseRejected": "Release Rejected",
"ReleasesHelpText": "Change release for this album", "ReleasesHelpText": "Change release for this album",
"ReleaseStatuses": "Release Statuses", "ReleaseStatuses": "Release Statuses",
"ReleaseTitle": "Release Title",
"ReleaseWillBeProcessedInterp": "Release will be processed {0}", "ReleaseWillBeProcessedInterp": "Release will be processed {0}",
"Reload": "Reload", "Reload": "Reload",
"RemotePath": "Remote Path", "RemotePath": "Remote Path",
@ -497,9 +616,12 @@
"RemoveSelectedMessageText": "Are you sure you want to remove the selected items from the blocklist?", "RemoveSelectedMessageText": "Are you sure you want to remove the selected items from the blocklist?",
"RemoveTagExistingTag": "Existing tag", "RemoveTagExistingTag": "Existing tag",
"RemoveTagRemovingTag": "Removing tag", "RemoveTagRemovingTag": "Removing tag",
"Renamed": "Renamed",
"RenameTracks": "Rename Tracks", "RenameTracks": "Rename Tracks",
"RenameTracksHelpText": "Lidarr will use the existing file name if renaming is disabled", "RenameTracksHelpText": "Lidarr will use the existing file name if renaming is disabled",
"Reorder": "Reorder", "Reorder": "Reorder",
"Replace": "Replace",
"ReplaceExistingFiles": "Replace Existing Files",
"ReplaceIllegalCharacters": "Replace Illegal Characters", "ReplaceIllegalCharacters": "Replace Illegal Characters",
"ReplaceIllegalCharactersHelpText": "Replace illegal characters. If unchecked, Lidarr will remove them instead", "ReplaceIllegalCharactersHelpText": "Replace illegal characters. If unchecked, Lidarr will remove them instead",
"RequiredHelpText": "The release must contain at least one of these terms (case insensitive)", "RequiredHelpText": "The release must contain at least one of these terms (case insensitive)",
@ -514,18 +636,24 @@
"Restart": "Restart", "Restart": "Restart",
"RestartLidarr": "Restart Lidarr", "RestartLidarr": "Restart Lidarr",
"RestartNow": "Restart Now", "RestartNow": "Restart Now",
"RestartRequiredHelpTextWarning": "Requires restart to take effect",
"Restore": "Restore", "Restore": "Restore",
"RestoreBackup": "Restore Backup", "RestoreBackup": "Restore Backup",
"RestoreBackupAdditionalInfo": "Note: Lidarr will automatically restart and reload the UI during the restore process.",
"Result": "Result", "Result": "Result",
"Retag": "Retag",
"Retagged": "Retagged",
"Retention": "Retention", "Retention": "Retention",
"RetentionHelpText": "Usenet only: Set to zero to set for unlimited retention", "RetentionHelpText": "Usenet only: Set to zero to set for unlimited retention",
"RetryingDownloadInterp": "Retrying download {0} at {1}", "RetryingDownloadInterp": "Retrying download {0} at {1}",
"RootFolder": "Root Folder", "RootFolder": "Root Folder",
"RootFolderPath": "Root Folder Path",
"RootFolderPathHelpText": "Root Folder list items will be added to", "RootFolderPathHelpText": "Root Folder list items will be added to",
"RootFolders": "Root Folders", "RootFolders": "Root Folders",
"RSSSync": "RSS Sync", "RSSSync": "RSS Sync",
"RSSSyncInterval": "RSS Sync Interval", "RSSSyncInterval": "RSS Sync Interval",
"RssSyncIntervalHelpText": "Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)", "RssSyncIntervalHelpText": "Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)",
"Save": "Save",
"SceneInformation": "Scene Information", "SceneInformation": "Scene Information",
"SceneNumberHasntBeenVerifiedYet": "Scene number hasn't been verified yet", "SceneNumberHasntBeenVerifiedYet": "Scene number hasn't been verified yet",
"Scheduled": "Scheduled", "Scheduled": "Scheduled",
@ -544,10 +672,19 @@
"SearchMonitored": "Search Monitored", "SearchMonitored": "Search Monitored",
"SearchSelected": "Search Selected", "SearchSelected": "Search Selected",
"Season": "Season", "Season": "Season",
"SecificMonitoringOptionHelpText": "Monitor artists but only monitor albums explicitly included in the list",
"SecondaryAlbumTypes": "Secondary Album Types", "SecondaryAlbumTypes": "Secondary Album Types",
"SecondaryTypes": "Secondary Types", "SecondaryTypes": "Secondary Types",
"Security": "Security", "Security": "Security",
"Seeders": "Seeders",
"Select...": "Select...",
"SelectAlbum": "Select Album",
"SelectAlbumRelease": "Select Album Release",
"SelectArtist": "Select Artist",
"SelectedCountArtistsSelectedInterp": "{0} Artist(s) Selected", "SelectedCountArtistsSelectedInterp": "{0} Artist(s) Selected",
"SelectFolder": "Select Folder",
"SelectQuality": "Select Quality",
"SelectTracks": "Select Tracks",
"SendAnonymousUsageData": "Send Anonymous Usage Data", "SendAnonymousUsageData": "Send Anonymous Usage Data",
"SetPermissions": "Set Permissions", "SetPermissions": "Set Permissions",
"SetPermissionsLinuxHelpText": "Should chmod be run when files are imported/renamed?", "SetPermissionsLinuxHelpText": "Should chmod be run when files are imported/renamed?",
@ -559,6 +696,7 @@
"ShouldMonitorHelpText": "Monitor artists and albums added from this list", "ShouldMonitorHelpText": "Monitor artists and albums added from this list",
"ShouldSearch": "Search for New Items", "ShouldSearch": "Search for New Items",
"ShouldSearchHelpText": "Search indexers for newly added items. Use with caution for large lists.", "ShouldSearchHelpText": "Search indexers for newly added items. Use with caution for large lists.",
"ShowAdvanced": "Show Advanced",
"ShowAlbumCount": "Show Album Count", "ShowAlbumCount": "Show Album Count",
"ShowBanners": "Show Banners", "ShowBanners": "Show Banners",
"ShowBannersHelpText": "Show banners instead of names", "ShowBannersHelpText": "Show banners instead of names",
@ -580,15 +718,18 @@
"ShowTitleHelpText": "Show artist name under poster", "ShowTitleHelpText": "Show artist name under poster",
"ShowUnknownArtistItems": "Show Unknown Artist Items", "ShowUnknownArtistItems": "Show Unknown Artist Items",
"Size": " Size", "Size": " Size",
"SizeLimit": "Size Limit",
"SizeOnDisk": "Size on Disk",
"SkipFreeSpaceCheck": "Skip Free Space Check", "SkipFreeSpaceCheck": "Skip Free Space Check",
"SkipFreeSpaceCheckWhenImportingHelpText": "Use when Lidarr is unable to detect free space from your artist root folder", "SkipFreeSpaceCheckWhenImportingHelpText": "Use when Lidarr is unable to detect free space from your artist root folder",
"SkipRedownload": "Skip Redownload", "SkipRedownload": "Skip Redownload",
"SkipredownloadHelpText": "Prevents Lidarr from trying download alternative releases for the removed items", "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.", "SorryThatAlbumCannotBeFound": "Sorry, that album cannot be found.",
"SorryThatArtistCannotBeFound": "Sorry, that artist cannot be found.", "SorryThatArtistCannotBeFound": "Sorry, that artist cannot be found.",
"Source": "Source", "Source": "Source",
"SourcePath": "Source Path", "SourcePath": "Source Path",
"SourceTitle": "Source Title",
"SpecificAlbum": "Specific Album", "SpecificAlbum": "Specific Album",
"SSLCertPassword": "SSL Cert Password", "SSLCertPassword": "SSL Cert Password",
"SslCertPasswordHelpText": "Password for pfx file", "SslCertPasswordHelpText": "Password for pfx file",
@ -599,6 +740,7 @@
"SSLPort": "SSL Port", "SSLPort": "SSL Port",
"SslPortHelpTextWarning": "Requires restart to take effect", "SslPortHelpTextWarning": "Requires restart to take effect",
"StandardTrackFormat": "Standard Track Format", "StandardTrackFormat": "Standard Track Format",
"Started": "Started",
"StartTypingOrSelectAPathBelow": "Start typing or select a path below", "StartTypingOrSelectAPathBelow": "Start typing or select a path below",
"StartupDirectory": "Startup directory", "StartupDirectory": "Startup directory",
"Status": "Status", "Status": "Status",
@ -610,6 +752,7 @@
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Search is not supported with this indexer", "SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Search is not supported with this indexer",
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Will be used when automatic searches are performed via the UI or by Lidarr", "SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByLidarr": "Will be used when automatic searches are performed via the UI or by Lidarr",
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Will be used when interactive search is used", "SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Will be used when interactive search is used",
"System": "System",
"TagAudioFilesWithMetadata": "Tag Audio Files with Metadata", "TagAudioFilesWithMetadata": "Tag Audio Files with Metadata",
"TagIsNotUsedAndCanBeDeleted": "Tag is not used and can be deleted", "TagIsNotUsedAndCanBeDeleted": "Tag is not used and can be deleted",
"Tags": "Tags", "Tags": "Tags",
@ -617,34 +760,44 @@
"Tasks": "Tasks", "Tasks": "Tasks",
"TBA": "TBA", "TBA": "TBA",
"Term": "Term", "Term": "Term",
"Test": "Test",
"TestAll": "Test All", "TestAll": "Test All",
"TestAllClients": "Test All Clients", "TestAllClients": "Test All Clients",
"TestAllIndexers": "Test All Indexers", "TestAllIndexers": "Test All Indexers",
"TestAllLists": "Test All Lists", "TestAllLists": "Test All Lists",
"TheAlbumsFilesWillBeDeleted": "The album's files will be deleted.", "TheAlbumsFilesWillBeDeleted": "The album's files will be deleted.",
"TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "The artist folder <strong>{path}</strong> and all of its content will be deleted.", "TheArtistFolderStrongpathstrongAndAllOfItsContentWillBeDeleted": "The artist folder <strong>{path}</strong> 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.", "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", "ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "This will apply to all indexers, please follow the rules set forth by them",
"Time": "Time", "Time": "Time",
"TimeFormat": "Time Format", "TimeFormat": "Time Format",
"TimeLeft": "Time Left",
"Title": "Title",
"TorrentDelay": "Torrent Delay", "TorrentDelay": "Torrent Delay",
"TorrentDelayHelpText": "Delay in minutes to wait before grabbing a torrent", "TorrentDelayHelpText": "Delay in minutes to wait before grabbing a torrent",
"Torrents": "Torrents", "Torrents": "Torrents",
"TotalFileSize": "Total File Size", "TotalFileSize": "Total File Size",
"TotalSpace": "Total Space",
"TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "{0} tracks total. {1} tracks with files.", "TotalTrackCountTracksTotalTrackFileCountTracksWithFilesInterp": "{0} tracks total. {1} tracks with files.",
"Track": "Track", "Track": "Track",
"TrackArtist": "Track Artist", "TrackArtist": "Track Artist",
"TrackCount": "Track Count",
"TrackDownloaded": "Track Downloaded", "TrackDownloaded": "Track Downloaded",
"TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} tracks downloaded", "TrackFileCounttotalTrackCountTracksDownloadedInterp": "{0}/{1} tracks downloaded",
"TrackFileCountTrackCountTotalTotalTrackCountInterp": "{0} / {1} (Total: {2})", "TrackFileCountTrackCountTotalTotalTrackCountInterp": "{0} / {1} (Total: {2})",
"TrackFilesCountMessage": "No track files", "TrackFilesCountMessage": "No track files",
"TrackImported": "Track Imported",
"TrackMissingFromDisk": "Track missing from disk", "TrackMissingFromDisk": "Track missing from disk",
"TrackNaming": "Track Naming", "TrackNaming": "Track Naming",
"TrackNumber": "Track Number", "TrackNumber": "Track Number",
"TrackProgress": "Track Progress",
"Tracks": "Tracks", "Tracks": "Tracks",
"TrackStatus": "Track status", "TrackStatus": "Track status",
"TrackTitle": "Track Title", "TrackTitle": "Track Title",
"Type": "Type", "Type": "Type",
"UI": "UI",
"UILanguage": "UI Language", "UILanguage": "UI Language",
"UILanguageHelpText": "Language that Lidarr will use for UI", "UILanguageHelpText": "Language that Lidarr will use for UI",
"UILanguageHelpTextWarning": "Browser Reload Required", "UILanguageHelpTextWarning": "Browser Reload Required",
@ -668,6 +821,7 @@
"UnableToLoadImportListExclusions": "Unable to load Import List Exclusions", "UnableToLoadImportListExclusions": "Unable to load Import List Exclusions",
"UnableToLoadIndexerOptions": "Unable to load indexer options", "UnableToLoadIndexerOptions": "Unable to load indexer options",
"UnableToLoadIndexers": "Unable to load Indexers", "UnableToLoadIndexers": "Unable to load Indexers",
"UnableToLoadInteractiveSerach": "Unable to load results for this album search. Try again later",
"UnableToLoadLists": "Unable to load Lists", "UnableToLoadLists": "Unable to load Lists",
"UnableToLoadMediaManagementSettings": "Unable to load Media Management settings", "UnableToLoadMediaManagementSettings": "Unable to load Media Management settings",
"UnableToLoadMetadata": "Unable to load Metadata", "UnableToLoadMetadata": "Unable to load Metadata",
@ -686,8 +840,10 @@
"UnableToLoadUISettings": "Unable to load UI settings", "UnableToLoadUISettings": "Unable to load UI settings",
"Ungroup": "Ungroup", "Ungroup": "Ungroup",
"UnmappedFiles": "UnmappedFiles", "UnmappedFiles": "UnmappedFiles",
"UnmappedFilesOnly": "Unmapped Files Only",
"Unmonitored": "Unmonitored", "Unmonitored": "Unmonitored",
"UnmonitoredHelpText": "Include unmonitored albums in the iCal feed", "UnmonitoredHelpText": "Include unmonitored albums in the iCal feed",
"UnmonitoredOnly": "Unmonitored Only",
"UpdateAll": "Update all", "UpdateAll": "Update all",
"UpdateAutomaticallyHelpText": "Automatically download and install updates. You will still be able to install from System: Updates", "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", "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", "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.", "UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead": "Updating is disabled inside a docker container. Update the container image instead.",
"UpgradeAllowedHelpText": "If disabled qualities will not be upgraded", "UpgradeAllowedHelpText": "If disabled qualities will not be upgraded",
"UpgradesAllowed": "Upgrades Allowed",
"Uptime": "Uptime", "Uptime": "Uptime",
"URLBase": "URL Base", "URLBase": "URL Base",
"UrlBaseHelpText": "For reverse proxy support, default is empty", "UrlBaseHelpText": "For reverse proxy support, default is empty",
@ -709,10 +866,14 @@
"UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "Branch to use to update Lidarr", "UsingExternalUpdateMechanismBranchToUseToUpdateLidarr": "Branch to use to update Lidarr",
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branch used by external update mechanism", "UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Branch used by external update mechanism",
"Version": "Version", "Version": "Version",
"Wanted": "Wanted",
"Warn": "Warn",
"WatchLibraryForChangesHelpText": "Rescan automatically when files change in a root folder", "WatchLibraryForChangesHelpText": "Rescan automatically when files change in a root folder",
"WatchRootFoldersForFileChanges": "Watch Root Folders for file changes", "WatchRootFoldersForFileChanges": "Watch Root Folders for file changes",
"WeekColumnHeader": "Week Column Header", "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.", "WriteAudioTagsHelpTextWarning": "Selecting 'All files' will alter existing files when they are imported.",
"WriteMetadataTags": "Write Metadata Tags",
"WriteMetadataToAudioFiles": "Write Metadata to Audio Files", "WriteMetadataToAudioFiles": "Write Metadata to Audio Files",
"Year": "Year", "Year": "Year",
"YesCancel": "Yes, Cancel" "YesCancel": "Yes, Cancel"

Loading…
Cancel
Save