1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2026-04-24 22:36:19 -04:00

Add Translations to Settings Pages

This commit is contained in:
Stevie Robinson
2023-07-22 21:14:33 +02:00
committed by Mark McDowall
parent 8008610d47
commit f2c31e92ce
102 changed files with 1697 additions and 802 deletions
@@ -7,6 +7,7 @@ import ConfirmModal from 'Components/Modal/ConfirmModal';
import TagList from 'Components/TagList';
import { icons, kinds } from 'Helpers/Props';
import titleCase from 'Utilities/String/titleCase';
import translate from 'Utilities/String/translate';
import EditDelayProfileModalConnector from './EditDelayProfileModalConnector';
import styles from './DelayProfile.css';
@@ -16,15 +17,15 @@ function getDelay(enabled, delay) {
}
if (!delay) {
return 'No Delay';
return translate('NoDelay');
}
if (delay === 1) {
return '1 Minute';
return translate('OneMinute');
}
// TODO: use better units of time than just minutes
return `${delay} Minutes`;
return translate('DelayMinutes', { delay });
}
class DelayProfile extends Component {
@@ -84,12 +85,12 @@ class DelayProfile extends Component {
connectDragSource
} = this.props;
let preferred = `Prefer ${titleCase(preferredProtocol)}`;
let preferred = titleCase(translate('PreferProtocol', { preferredProtocol }));
if (!enableUsenet) {
preferred = 'Only Torrent';
preferred = translate('OnlyTorrent');
} else if (!enableTorrent) {
preferred = 'Only Usenet';
preferred = translate('OnlyUsenet');
}
return (
@@ -139,9 +140,9 @@ class DelayProfile extends Component {
<ConfirmModal
isOpen={this.state.isDeleteDelayProfileModalOpen}
kind={kinds.DANGER}
title="Delete Delay Profile"
message="Are you sure you want to delete this delay profile?"
confirmLabel="Delete"
title={translate('DeleteDelayProfile')}
message={translate('DeleteDelayProfileMessageText')}
confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteDelayProfile}
onCancel={this.onDeleteDelayProfileModalClose}
/>
@@ -7,6 +7,7 @@ import Measure from 'Components/Measure';
import PageSectionContent from 'Components/Page/PageSectionContent';
import Scroller from 'Components/Scroller/Scroller';
import { icons, scrollDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import DelayProfile from './DelayProfile';
import DelayProfileDragPreview from './DelayProfileDragPreview';
import DelayProfileDragSource from './DelayProfileDragSource';
@@ -67,9 +68,9 @@ class DelayProfiles extends Component {
return (
<Measure onMeasure={this.onMeasure}>
<FieldSet legend="Delay Profiles">
<FieldSet legend={translate('DelayProfiles')}>
<PageSectionContent
errorMessage="Unable to load Delay Profiles"
errorMessage={translate('DelayProfilesLoadError')}
{...otherProps}
>
<Scroller
@@ -81,10 +82,18 @@ class DelayProfiles extends Component {
>
<div>
<div className={styles.delayProfilesHeader}>
<div className={styles.column}>Preferred 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}>
@@ -14,13 +14,34 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds } from 'Helpers/Props';
import { boolSettingShape, numberSettingShape, tagSettingShape } from 'Helpers/Props/Shapes/settingShape';
import translate from 'Utilities/String/translate';
import styles from './EditDelayProfileModalContent.css';
const protocolOptions = [
{ key: 'preferUsenet', value: 'Prefer Usenet' },
{ key: 'preferTorrent', value: 'Prefer Torrent' },
{ key: 'onlyUsenet', value: 'Only Usenet' },
{ key: 'onlyTorrent', value: 'Only Torrent' }
{
key: 'preferUsenet',
get value() {
return translate('PreferUsenet');
}
},
{
key: 'preferTorrent',
get value() {
return translate('PreferTorrent');
}
},
{
key: 'onlyUsenet',
get value() {
return translate('OnlyUsenet');
}
},
{
key: 'onlyTorrent',
get value() {
return translate('OnlyTorrent');
}
}
];
function EditDelayProfileModalContent(props) {
@@ -54,7 +75,7 @@ function EditDelayProfileModalContent(props) {
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{id ? 'Edit Delay Profile' : 'Add Delay Profile'}
{id ? translate('EditDelayProfile') : translate('AddDelayProfile')}
</ModalHeader>
<ModalBody>
@@ -66,7 +87,9 @@ function EditDelayProfileModalContent(props) {
{
!isFetching && !!error ?
<div>Unable to add a new quality profile, please try again.</div> :
<div>
{translate('AddQualityProfileError')}
</div> :
null
}
@@ -74,14 +97,14 @@ function EditDelayProfileModalContent(props) {
!isFetching && !error ?
<Form {...otherProps}>
<FormGroup>
<FormLabel>Preferred Protocol</FormLabel>
<FormLabel>{translate('PreferredProtocol')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="protocol"
value={protocol}
values={protocolOptions}
helpText="Choose which protocol(s) to use and which one is preferred when choosing between otherwise equal releases"
helpText={translate('ProtocolHelpText')}
onChange={onProtocolChange}
/>
</FormGroup>
@@ -89,14 +112,14 @@ function EditDelayProfileModalContent(props) {
{
enableUsenet.value ?
<FormGroup>
<FormLabel>Usenet Delay</FormLabel>
<FormLabel>{translate('UsenetDelay')}</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="usenetDelay"
unit="minutes"
{...usenetDelay}
helpText="Delay in minutes to wait before grabbing a release from Usenet"
helpText={translate('UsenetDelayHelpText')}
onChange={onInputChange}
/>
</FormGroup> :
@@ -106,14 +129,14 @@ function EditDelayProfileModalContent(props) {
{
enableTorrent.value ?
<FormGroup>
<FormLabel>Torrent Delay</FormLabel>
<FormLabel>{translate('TorrentDelay')}</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="torrentDelay"
unit="minutes"
{...torrentDelay}
helpText="Delay in minutes to wait before grabbing a torrent"
helpText={translate('TorrentDelayHelpText')}
onChange={onInputChange}
/>
</FormGroup> :
@@ -121,25 +144,25 @@ function EditDelayProfileModalContent(props) {
}
<FormGroup>
<FormLabel>Bypass if Highest Quality</FormLabel>
<FormLabel>{translate('BypassDelayIfHighestQuality')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="bypassIfHighestQuality"
{...bypassIfHighestQuality}
helpText="Bypass delay when release has the highest enabled quality in the quality profile with the preferred protocol"
helpText={translate('BypassDelayIfHighestQualityHelpText')}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Bypass if Above Custom Format Score</FormLabel>
<FormLabel>{translate('BypassDelayIfAboveCustomFormatScore')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="bypassIfAboveCustomFormatScore"
{...bypassIfAboveCustomFormatScore}
helpText="Enable bypass when release has a score higher than the configured minimum custom format score"
helpText={translate('BypassDelayIfAboveCustomFormatScoreHelpText')}
onChange={onInputChange}
/>
</FormGroup>
@@ -147,13 +170,13 @@ function EditDelayProfileModalContent(props) {
{
bypassIfAboveCustomFormatScore.value ?
<FormGroup>
<FormLabel>Minimum Custom Format Score</FormLabel>
<FormLabel>{translate('BypassDelayIfAboveCustomFormatScoreMinimumScore')}</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="minimumCustomFormatScore"
{...minimumCustomFormatScore}
helpText="Minimum Custom Format Score required to bypass delay for the preferred protocol"
helpText={translate('BypassDelayIfAboveCustomFormatScoreMinimumScoreHelpText')}
onChange={onInputChange}
/>
</FormGroup> :
@@ -163,17 +186,17 @@ function EditDelayProfileModalContent(props) {
{
id === 1 ?
<Alert>
This is the default profile. It applies to all series that don't have an explicit profile.
{translate('DefaultDelayProfile')}
</Alert> :
<FormGroup>
<FormLabel>Tags</FormLabel>
<FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup
type={inputTypes.TAG}
name="tags"
{...tags}
helpText="Applies to series with at least one matching tag"
helpText={translate('DelayProfileTagsHelpText')}
onChange={onInputChange}
/>
</FormGroup>
@@ -190,7 +213,7 @@ function EditDelayProfileModalContent(props) {
kind={kinds.DANGER}
onPress={onDeleteDelayProfilePress}
>
Delete
{translate('Delete')}
</Button> :
null
}
@@ -198,7 +221,7 @@ function EditDelayProfileModalContent(props) {
<Button
onPress={onModalClose}
>
Cancel
{translate('Cancel')}
</Button>
<SpinnerErrorButton
@@ -206,7 +229,7 @@ function EditDelayProfileModalContent(props) {
error={saveError}
onPress={onSavePress}
>
Save
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>
+2 -1
View File
@@ -4,6 +4,7 @@ import HTML5toTouch from 'react-dnd-multi-backend/dist/esm/HTML5toTouch';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import DelayProfilesConnector from './Delay/DelayProfilesConnector';
import QualityProfilesConnector from './Quality/QualityProfilesConnector';
import ReleaseProfilesConnector from './Release/ReleaseProfilesConnector';
@@ -18,7 +19,7 @@ class Profiles extends Component {
render() {
return (
<PageContent title="Profiles">
<PageContent title={translate('Profiles')}>
<SettingsToolbarConnector showSave={false} />
<PageContentBody>
@@ -14,6 +14,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import dimensions from 'Styles/Variables/dimensions';
import translate from 'Utilities/String/translate';
import QualityProfileFormatItems from './QualityProfileFormatItems';
import QualityProfileItems from './QualityProfileItems';
import styles from './EditQualityProfileModalContent.css';
@@ -134,7 +135,7 @@ class EditQualityProfileModalContent extends Component {
onMeasure={this.onHeaderMeasure}
>
<ModalHeader>
{id ? 'Edit Quality Profile' : 'Add Quality Profile'}
{id ? translate('EditQualityProfile') : translate('AddQualityProfile')}
</ModalHeader>
</Measure>
@@ -151,7 +152,9 @@ class EditQualityProfileModalContent extends Component {
{
!isFetching && !!error &&
<div>Unable to add a new quality profile, please try again.</div>
<div>
{translate('AddQualityProfileError')}
</div>
}
{
@@ -163,7 +166,7 @@ class EditQualityProfileModalContent extends Component {
<div className={styles.formGroupWrapper}>
<FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}>
Name
{translate('Name')}
</FormLabel>
<FormInputGroup
@@ -176,14 +179,14 @@ class EditQualityProfileModalContent extends Component {
<FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}>
Upgrades Allowed
{translate('UpgradesAllowed')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="upgradeAllowed"
{...upgradeAllowed}
helpText="If disabled qualities will not be upgraded"
helpText={translate('UpgradesAllowedHelpText')}
onChange={onInputChange}
/>
</FormGroup>
@@ -192,7 +195,7 @@ class EditQualityProfileModalContent extends Component {
upgradeAllowed.value &&
<FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}>
Upgrade Until
{translate('UpgradeUntil')}
</FormLabel>
<FormInputGroup
@@ -200,7 +203,7 @@ class EditQualityProfileModalContent extends Component {
name="cutoff"
{...cutoff}
values={qualities}
helpText="Once this quality is reached Sonarr will no longer download episodes"
helpText={translate('UpgradeUntilHelpText')}
onChange={onCutoffChange}
/>
</FormGroup>
@@ -210,14 +213,14 @@ class EditQualityProfileModalContent extends Component {
formatItems.value.length > 0 &&
<FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}>
Minimum Custom Format Score
{translate('MinimumCustomFormatScore')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="minFormatScore"
{...minFormatScore}
helpText="Minimum custom format score allowed to download"
helpText={translate('MinimumCustomFormatScoreHelpText')}
onChange={onInputChange}
/>
</FormGroup>
@@ -227,14 +230,14 @@ class EditQualityProfileModalContent extends Component {
upgradeAllowed.value && formatItems.value.length > 0 &&
<FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}>
Upgrade Until Custom Format Score
{translate('UpgradeUntilCustomFormatScore')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="cutoffFormatScore"
{...cutoffFormatScore}
helpText="Once this custom format score is reached Sonarr will no longer grab episode releases"
helpText={translate('UpgradeUntilCustomFormatScoreHelpText')}
onChange={onInputChange}
/>
</FormGroup>
@@ -278,7 +281,7 @@ class EditQualityProfileModalContent extends Component {
className={styles.deleteButtonContainer}
title={
isInUse ?
'Can\'t delete a quality profile that is attached to a series' :
translate('QualityProfileInUse') :
undefined
}
>
@@ -287,7 +290,7 @@ class EditQualityProfileModalContent extends Component {
isDisabled={isInUse}
onPress={onDeleteQualityProfilePress}
>
Delete
{translate('Delete')}
</Button>
</div> :
null
@@ -296,7 +299,7 @@ class EditQualityProfileModalContent extends Component {
<Button
onPress={onModalClose}
>
Cancel
{translate('Cancel')}
</Button>
<SpinnerErrorButton
@@ -304,7 +307,7 @@ class EditQualityProfileModalContent extends Component {
error={saveError}
onPress={onSavePress}
>
Save
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</Measure>
@@ -6,6 +6,7 @@ import IconButton from 'Components/Link/IconButton';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import Tooltip from 'Components/Tooltip/Tooltip';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import EditQualityProfileModalConnector from './EditQualityProfileModalConnector';
import styles from './QualityProfile.css';
@@ -84,7 +85,7 @@ class QualityProfile extends Component {
<IconButton
className={styles.cloneButton}
title="Clone Profile"
title={translate('CloneProfile')}
name={icons.CLONE}
onPress={this.onCloneQualityProfilePress}
/>
@@ -104,7 +105,7 @@ class QualityProfile extends Component {
<Label
key={item.quality.id}
kind={isCutoff ? kinds.INFO : kinds.DEFAULT}
title={isCutoff ? 'Upgrade until this quality is met or exceeded' : null}
title={isCutoff ? translate('UpgradeUntilThisQualityIsMetOrExceeded') : null}
>
{item.quality.name}
</Label>
@@ -120,7 +121,7 @@ class QualityProfile extends Component {
anchor={
<Label
kind={isCutoff ? kinds.INFO : kinds.DEFAULT}
title={isCutoff ? 'Cutoff' : null}
title={isCutoff ? translate('Cutoff') : null}
>
{item.name}
</Label>
@@ -133,7 +134,7 @@ class QualityProfile extends Component {
<Label
key={groupItem.quality.id}
kind={isCutoff ? kinds.INFO : kinds.DEFAULT}
title={isCutoff ? 'Cutoff' : null}
title={isCutoff ? translate('Cutoff') : null}
>
{groupItem.quality.name}
</Label>
@@ -160,9 +161,9 @@ class QualityProfile extends Component {
<ConfirmModal
isOpen={this.state.isDeleteQualityProfileModalOpen}
kind={kinds.DANGER}
title="Delete Quality Profile"
message={`Are you sure you want to delete the quality profile '${name}'?`}
confirmLabel="Delete"
title={translate('DeleteQualityProfile')}
message={translate('DeleteQualityProfileMessageText', { name })}
confirmLabel={translate('Delete')}
isSpinning={isDeleting}
onConfirm={this.onConfirmDeleteQualityProfile}
onCancel={this.onDeleteQualityProfileModalClose}
@@ -4,8 +4,9 @@ import React, { Component } from 'react';
import FormGroup from 'Components/Form/FormGroup';
import FormInputHelpText from 'Components/Form/FormInputHelpText';
import FormLabel from 'Components/Form/FormLabel';
import Link from 'Components/Link/Link';
import { sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import InlineMarkdown from '../../../Components/Markdown/InlineMarkdown';
import QualityProfileFormatItem from './QualityProfileFormatItem';
import styles from './QualityProfileFormatItems.css';
@@ -66,22 +67,19 @@ class QualityProfileFormatItems extends Component {
if (profileFormatItems.length < 1) {
return (
<div className={styles.addCustomFormatMessage}>
{'Want more control over which downloads are preferred? Add a'}
<Link to='/settings/customformats'> Custom Format </Link>
</div>
<InlineMarkdown className={styles.addCustomFormatMessage} data={translate('WantMoreControlAddACustomFormat')} />
);
}
return (
<FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}>
Custom Formats
{translate('CustomFormats')}
</FormLabel>
<div>
<FormInputHelpText
text="Sonarr scores each release using the sum of scores for matching custom formats. If a new release would improve the score, at the same or better quality, then Sonarr will grab it."
text={translate('CustomFormatHelpText')}
/>
{
@@ -113,10 +111,10 @@ class QualityProfileFormatItems extends Component {
<div className={styles.formats}>
<div className={styles.headerContainer}>
<div className={styles.headerTitle}>
Custom Format
{translate('CustomFormat')}
</div>
<div className={styles.headerScore}>
Score
{translate('Score')}
</div>
</div>
{
@@ -5,6 +5,7 @@ import CheckInput from 'Components/Form/CheckInput';
import Icon from 'Components/Icon';
import IconButton from 'Components/Link/IconButton';
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './QualityProfileItem.css';
class QualityProfileItem extends Component {
@@ -63,7 +64,7 @@ class QualityProfileItem extends Component {
<IconButton
className={styles.createGroupButton}
name={icons.GROUP}
title="Group"
title={translate('Group')}
onPress={this.onCreateGroupPress}
/>
}
@@ -95,7 +96,7 @@ class QualityProfileItem extends Component {
<div className={styles.dragHandle}>
<Icon
className={styles.dragIcon}
title="Create group"
title={translate('CreateGroup')}
name={icons.REORDER}
/>
</div>
@@ -7,6 +7,7 @@ import Icon from 'Components/Icon';
import Label from 'Components/Label';
import IconButton from 'Components/Link/IconButton';
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import QualityProfileItemDragSource from './QualityProfileItemDragSource';
import styles from './QualityProfileItemGroup.css';
@@ -77,7 +78,7 @@ class QualityProfileItemGroup extends Component {
<IconButton
className={styles.deleteGroupButton}
name={icons.UNGROUP}
title="Ungroup"
title={translate('Ungroup')}
onPress={this.onDeleteGroupPress}
/>
@@ -133,7 +134,7 @@ class QualityProfileItemGroup extends Component {
<Icon
className={styles.dragIcon}
name={icons.REORDER}
title="Reorder"
title={translate('Reorder')}
/>
</div>
)
@@ -7,6 +7,7 @@ import Icon from 'Components/Icon';
import Button from 'Components/Link/Button';
import Measure from 'Components/Measure';
import { icons, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import QualityProfileItemDragPreview from './QualityProfileItemDragPreview';
import QualityProfileItemDragSource from './QualityProfileItemDragSource';
import styles from './QualityProfileItems.css';
@@ -69,12 +70,12 @@ class QualityProfileItems extends Component {
return (
<FormGroup size={sizes.EXTRA_SMALL}>
<FormLabel size={sizes.SMALL}>
Qualities
{translate('Qualities')}
</FormLabel>
<div>
<FormInputHelpText
text="Qualities higher in the list are more preferred. Qualities within the same group are equal. Only checked qualities are wanted"
text={translate('QualitiesHelpText')}
/>
{
@@ -115,7 +116,7 @@ class QualityProfileItems extends Component {
/>
{
editGroups ? 'Done Editing Groups' : 'Edit Groups'
editGroups ? translate('DoneEditingGroups') : translate('EditGroups')
}
</div>
</Button>
@@ -5,6 +5,7 @@ import FieldSet from 'Components/FieldSet';
import Icon from 'Components/Icon';
import PageSectionContent from 'Components/Page/PageSectionContent';
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import EditQualityProfileModalConnector from './EditQualityProfileModalConnector';
import QualityProfile from './QualityProfile';
import styles from './QualityProfiles.css';
@@ -51,9 +52,9 @@ class QualityProfiles extends Component {
} = this.props;
return (
<FieldSet legend="Quality Profiles">
<FieldSet legend={translate('QualityProfiles')}>
<PageSectionContent
errorMessage="Unable to load Quality Profiles"
errorMessage={translate('QualityProfilesLoadError')}
{...otherProps}c={true}
>
<div className={styles.qualityProfiles}>
@@ -11,6 +11,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 './EditReleaseProfileModalContent.css';
const tagInputDelimiters = ['Tab', 'Enter'];
@@ -40,7 +41,7 @@ function EditReleaseProfileModalContent(props) {
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{id ? 'Edit Release Profile' : 'Add Release Profile'}
{id ? translate('EditReleaseProfile') : translate('AddReleaseProfile')}
</ModalHeader>
<ModalBody>
@@ -53,35 +54,35 @@ function EditReleaseProfileModalContent(props) {
type={inputTypes.TEXT}
name="name"
{...name}
placeholder="Optional name"
placeholder={translate('OptionalName')}
canEdit={true}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Enable Profile</FormLabel>
<FormLabel>{translate('EnableProfile')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="enabled"
helpText="Check to enable release profile"
helpText={translate('EnableProfileHelpText')}
{...enabled}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Must Contain</FormLabel>
<FormLabel>{translate('MustContain')}</FormLabel>
<FormInputGroup
{...required}
inputClassName={styles.tagInternalInput}
type={inputTypes.TEXT_TAG}
name="required"
helpText="The release must contain at least one of these terms (case insensitive)"
helpText={translate('MustContainHelpText')}
kind={kinds.SUCCESS}
placeholder="Add new restriction"
placeholder={translate('AddNewRestriction')}
delimiters={tagInputDelimiters}
canEdit={true}
onChange={onInputChange}
@@ -89,16 +90,16 @@ function EditReleaseProfileModalContent(props) {
</FormGroup>
<FormGroup>
<FormLabel>Must Not Contain</FormLabel>
<FormLabel>{translate('MustNotContain')}</FormLabel>
<FormInputGroup
{...ignored}
inputClassName={styles.tagInternalInput}
type={inputTypes.TEXT_TAG}
name="ignored"
helpText="The release will be rejected if it contains one or more of terms (case insensitive)"
helpText={translate('MustNotContainHelpText')}
kind={kinds.DANGER}
placeholder="Add new restriction"
placeholder={translate('AddNewRestriction')}
delimiters={tagInputDelimiters}
canEdit={true}
onChange={onInputChange}
@@ -106,13 +107,13 @@ function EditReleaseProfileModalContent(props) {
</FormGroup>
<FormGroup>
<FormLabel>Indexer</FormLabel>
<FormLabel>{translate('Indexer')}</FormLabel>
<FormInputGroup
type={inputTypes.INDEXER_SELECT}
name="indexerId"
helpText="Specify what indexer the profile applies to"
helpTextWarning="Using a specific indexer with release profiles can lead to duplicate releases being grabbed"
helpText={translate('ReleaseProfileIndexerHelpText')}
helpTextWarning={translate('ReleaseProfileIndexerHelpTextWarning')}
{...indexerId}
includeAny={true}
onChange={onInputChange}
@@ -120,12 +121,12 @@ function EditReleaseProfileModalContent(props) {
</FormGroup>
<FormGroup>
<FormLabel>Tags</FormLabel>
<FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup
type={inputTypes.TAG}
name="tags"
helpText="Release profiles will apply to series with at least one matching tag. Leave blank to apply to all series"
helpText={translate('ReleaseProfileTagHelpText')}
{...tags}
onChange={onInputChange}
/>
@@ -140,14 +141,14 @@ function EditReleaseProfileModalContent(props) {
kind={kinds.DANGER}
onPress={onDeleteReleaseProfilePress}
>
Delete
{translate('Delete')}
</Button>
}
<Button
onPress={onModalClose}
>
Cancel
{translate('Cancel')}
</Button>
<SpinnerErrorButton
@@ -155,7 +156,7 @@ function EditReleaseProfileModalContent(props) {
error={saveError}
onPress={onSavePress}
>
Save
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>
@@ -7,6 +7,7 @@ import Label from 'Components/Label';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import TagList from 'Components/TagList';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import EditReleaseProfileModalConnector from './EditReleaseProfileModalConnector';
import styles from './ReleaseProfile.css';
@@ -147,7 +148,7 @@ class ReleaseProfile extends Component {
kind={kinds.DISABLED}
outline={true}
>
Disabled
{translate('Disabled')}
</Label>
}
@@ -172,9 +173,9 @@ class ReleaseProfile extends Component {
<ConfirmModal
isOpen={isDeleteReleaseProfileModalOpen}
kind={kinds.DANGER}
title="Delete ReleaseProfile"
message={'Are you sure you want to delete this releaseProfile?'}
confirmLabel="Delete"
title={translate('DeleteReleaseProfile')}
message={translate('DeleteReleaseProfileMessageText', { name })}
confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteReleaseProfile}
onCancel={this.onDeleteReleaseProfileModalClose}
/>
@@ -5,6 +5,7 @@ import FieldSet from 'Components/FieldSet';
import Icon from 'Components/Icon';
import PageSectionContent from 'Components/Page/PageSectionContent';
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import EditReleaseProfileModalConnector from './EditReleaseProfileModalConnector';
import ReleaseProfile from './ReleaseProfile';
import styles from './ReleaseProfiles.css';
@@ -46,9 +47,9 @@ class ReleaseProfiles extends Component {
} = this.props;
return (
<FieldSet legend="Release Profiles">
<FieldSet legend={translate('Release Profiles')}>
<PageSectionContent
errorMessage="Unable to load ReleaseProfiles"
errorMessage={translate('ReleaseProfilesLoadError')}
{...otherProps}
>
<div className={styles.releaseProfiles}>