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
onPress={onModalClose}
>
Cancel
{translate('Cancel')}
</Button>
<SpinnerButton
isSpinning={isSaving}
onPress={this.onSavePress}
>
Save
{translate('Save')}
</SpinnerButton>
</ModalFooter>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -16,13 +16,6 @@ const newDelayProfile = {
tags: []
};
const protocolOptions = [
{ key: 'preferUsenet', value: 'Prefer Usenet' },
{ key: 'preferTorrent', value: 'Prefer Torrent' },
{ key: 'onlyUsenet', value: 'Only Usenet' },
{ key: 'onlyTorrent', value: 'Only Torrent' }
];
function createDelayProfileSelector() {
return createSelector(
(state, { id }) => id,
@ -78,7 +71,6 @@ function createMapStateToProps() {
return {
protocol,
protocolOptions,
...delayProfile
};
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save