mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-18 21:35:51 -04:00
Add Translations to Settings Pages
(cherry picked from commit f2c31e92ceec7c6a8daffa78f30f15ab8684bef9)
This commit is contained in:
@@ -101,7 +101,7 @@ const links = [
|
||||
to: '/settings/downloadclients'
|
||||
},
|
||||
{
|
||||
title: () => translate('Lists'),
|
||||
title: () => translate('ImportLists'),
|
||||
to: '/settings/importlists'
|
||||
},
|
||||
{
|
||||
@@ -121,7 +121,7 @@ const links = [
|
||||
to: '/settings/general'
|
||||
},
|
||||
{
|
||||
title: () => translate('UI'),
|
||||
title: () => translate('Ui'),
|
||||
to: '/settings/ui'
|
||||
}
|
||||
]
|
||||
|
||||
@@ -235,7 +235,7 @@ const MovieIndex = withScrollPosition((props: MovieIndexProps) => {
|
||||
/>
|
||||
|
||||
<PageToolbarButton
|
||||
label={translate('RSSSync')}
|
||||
label={translate('RssSync')}
|
||||
iconName={icons.RSS}
|
||||
isSpinning={isRssSyncExecuting}
|
||||
isDisabled={hasNoMovie}
|
||||
|
||||
@@ -6,11 +6,12 @@ import PageContentBody from 'Components/Page/PageContentBody';
|
||||
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
|
||||
import ParseToolbarButton from 'Parse/ParseToolbarButton';
|
||||
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import CustomFormatsConnector from './CustomFormats/CustomFormatsConnector';
|
||||
|
||||
function CustomFormatSettingsPage() {
|
||||
return (
|
||||
<PageContent title="Custom Format Settings">
|
||||
<PageContent title={translate('CustomFormatsSettings')}>
|
||||
<SettingsToolbarConnector
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
|
||||
@@ -61,7 +61,7 @@ class CustomFormats extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('CustomFormats')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadCustomFormats')}
|
||||
errorMessage={translate('CustomFormatsLoadError')}
|
||||
{...otherProps}c={true}
|
||||
>
|
||||
<div className={styles.customFormats}>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Card from 'Components/Card';
|
||||
import FieldSet from 'Components/FieldSet';
|
||||
import Form from 'Components/Form/Form';
|
||||
@@ -112,9 +113,9 @@ class EditCustomFormatModalContent extends Component {
|
||||
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<div>
|
||||
{translate('UnableToAddANewCustomFormatPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddCustomFormatError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -43,7 +43,7 @@ class ExportCustomFormatModalContent extends Component {
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadCustomFormats')}
|
||||
{translate('CustomFormatsLoadError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ class ImportCustomFormatModalContent extends Component {
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadCustomFormats')}
|
||||
{translate('CustomFormatsLoadError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
|
||||
+7
-2
@@ -89,7 +89,9 @@ class ImportCustomFormatModalContentConnector extends Component {
|
||||
const selectedImplementation = _.find(this.props.specificationSchema, { implementation: spec.implementation });
|
||||
|
||||
if (!selectedImplementation) {
|
||||
throw new Error(translate('CustomFormatUnknownCondition', [spec.implementation]));
|
||||
throw new Error(translate('CustomFormatUnknownCondition', {
|
||||
implementation: spec.implementation
|
||||
}));
|
||||
}
|
||||
|
||||
this.props.selectCustomFormatSpecificationSchema({ implementation: spec.implementation });
|
||||
@@ -109,7 +111,10 @@ class ImportCustomFormatModalContentConnector extends Component {
|
||||
for (const [key, value] of Object.entries(fields)) {
|
||||
const field = _.find(schema.fields, { name: key });
|
||||
if (!field) {
|
||||
throw new Error(translate('CustomFormatUnknownConditionOption', [key, schema.implementationName]));
|
||||
throw new Error(translate('CustomFormatUnknownConditionOption', {
|
||||
key,
|
||||
implementation: schema.implementationName
|
||||
}));
|
||||
}
|
||||
|
||||
this.props.setCustomFormatSpecificationFieldValue({ name: key, value });
|
||||
|
||||
+3
-3
@@ -43,7 +43,7 @@ class AddSpecificationModalContent extends Component {
|
||||
{
|
||||
!isSchemaFetching && !!schemaError &&
|
||||
<div>
|
||||
{translate('UnableToAddANewConditionPleaseTryAgain')}
|
||||
{translate('AddConditionError')}
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -53,10 +53,10 @@ class AddSpecificationModalContent extends Component {
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{translate('RadarrSupportsCustomConditionsAgainstTheReleasePropertiesBelow')}
|
||||
{translate('SupportedCustomConditions')}
|
||||
</div>
|
||||
<div>
|
||||
{translate('VisitGithubCustomFormatsAphrodite')}
|
||||
{translate('VisitTheWikiForMoreDetails')}
|
||||
<Link to="https://wiki.servarr.com/radarr/settings#custom-formats-2">{translate('Wiki')}</Link>
|
||||
</div>
|
||||
</Alert>
|
||||
|
||||
+8
-7
@@ -7,8 +7,8 @@ import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||
import FormLabel from 'Components/Form/FormLabel';
|
||||
import ProviderFieldFormGroup from 'Components/Form/ProviderFieldFormGroup';
|
||||
import Button from 'Components/Link/Button';
|
||||
import Link from 'Components/Link/Link';
|
||||
import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton';
|
||||
import InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
||||
import ModalBody from 'Components/Modal/ModalBody';
|
||||
import ModalContent from 'Components/Modal/ModalContent';
|
||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||
@@ -52,12 +52,13 @@ function EditSpecificationModalContent(props) {
|
||||
fields && fields.some((x) => x.label === translate('CustomFormatsSpecificationRegularExpression')) &&
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
<div dangerouslySetInnerHTML={{ __html: translate('ThisConditionMatchesUsingRegularExpressions', ['<code>\\^$.|?*+()[{</code>', '<code>\\</code>']) }} />
|
||||
{translate('MoreDetails')} <Link to="https://www.regular-expressions.info/tutorial.html">{translate('LinkHere')}</Link>
|
||||
<InlineMarkdown data={translate('ConditionUsingRegularExpressions')} />
|
||||
</div>
|
||||
<div>
|
||||
{translate('RegularExpressionsCanBeTested')}
|
||||
<Link to="http://regexstorm.net/tester">{translate('LinkHere')}</Link>
|
||||
<InlineMarkdown data={translate('RegularExpressionsTutorialLink')} />
|
||||
</div>
|
||||
<div>
|
||||
<InlineMarkdown data={translate('RegularExpressionsCanBeTested')} />
|
||||
</div>
|
||||
</Alert>
|
||||
}
|
||||
@@ -99,7 +100,7 @@ function EditSpecificationModalContent(props) {
|
||||
type={inputTypes.CHECK}
|
||||
name="negate"
|
||||
{...negate}
|
||||
helpText={translate('NegateHelpText', [implementationName])}
|
||||
helpText={translate('NegateHelpText', { implementationName })}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
@@ -113,7 +114,7 @@ function EditSpecificationModalContent(props) {
|
||||
type={inputTypes.CHECK}
|
||||
name="required"
|
||||
{...required}
|
||||
helpText={translate('RequiredHelpText', [implementationName, implementationName])}
|
||||
helpText={translate('RequiredHelpText', { implementationName })}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
+5
-5
@@ -43,9 +43,9 @@ class AddDownloadClientModalContent extends Component {
|
||||
|
||||
{
|
||||
!isSchemaFetching && !!schemaError &&
|
||||
<div>
|
||||
{translate('UnableToAddANewDownloadClientPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddDownloadClientError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
@@ -54,10 +54,10 @@ class AddDownloadClientModalContent extends Component {
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{translate('RadarrSupportsAnyDownloadClient')}
|
||||
{translate('SupportedDownloadClients')}
|
||||
</div>
|
||||
<div>
|
||||
{translate('ForMoreInformationOnTheIndividualDownloadClients')}
|
||||
{translate('SupportedDownloadClientsMoreInfo')}
|
||||
</div>
|
||||
</Alert>
|
||||
|
||||
|
||||
+4
-5
@@ -69,9 +69,9 @@ class EditDownloadClientModalContent extends Component {
|
||||
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<div>
|
||||
{translate('UnableToAddANewDownloadClientPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddDownloadClientError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
@@ -147,7 +147,7 @@ class EditDownloadClientModalContent extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.TAG}
|
||||
name="tags"
|
||||
helpText={translate('DownloadClientTagHelpText')}
|
||||
helpText={translate('DownloadClientMovieTagHelpText')}
|
||||
{...tags}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -184,7 +184,6 @@ class EditDownloadClientModalContent extends Component {
|
||||
</FormGroup>
|
||||
}
|
||||
</FieldSet>
|
||||
|
||||
</Form>
|
||||
}
|
||||
</ModalBody>
|
||||
|
||||
@@ -30,7 +30,7 @@ function DownloadClientOptions(props) {
|
||||
{
|
||||
!isFetching && error &&
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadDownloadClientOptions')}
|
||||
{translate('DownloadClientOptionsLoadError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ function DownloadClientOptions(props) {
|
||||
hasSettings && !isFetching && !error && advancedSettings &&
|
||||
<div>
|
||||
<FieldSet legend={translate('CompletedDownloadHandling')}>
|
||||
|
||||
<Form>
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
|
||||
+9
-8
@@ -1,5 +1,6 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Form from 'Components/Form/Form';
|
||||
import FormGroup from 'Components/Form/FormGroup';
|
||||
import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||
@@ -52,9 +53,9 @@ function EditRemotePathMappingModalContent(props) {
|
||||
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<div>
|
||||
{translate('UnableToAddANewRemotePathMappingPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddRemotePathMappingError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
@@ -66,7 +67,7 @@ function EditRemotePathMappingModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="host"
|
||||
helpText={translate('SettingsRemotePathMappingHostHelpText')}
|
||||
helpText={translate('RemotePathMappingHostHelpText')}
|
||||
{...host}
|
||||
values={downloadClientHosts}
|
||||
onChange={onInputChange}
|
||||
@@ -74,24 +75,24 @@ function EditRemotePathMappingModalContent(props) {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsRemotePathMappingRemotePath')}</FormLabel>
|
||||
<FormLabel>{translate('RemotePath')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
name="remotePath"
|
||||
helpText={translate('SettingsRemotePathMappingRemotePathHelpText')}
|
||||
helpText={translate('RemotePathMappingRemotePathHelpText')}
|
||||
{...remotePath}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsRemotePathMappingLocalPath')}</FormLabel>
|
||||
<FormLabel>{translate('LocalPath')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.PATH}
|
||||
name="localPath"
|
||||
helpText={translate('SettingsRemotePathMappingLocalPathHelpText')}
|
||||
helpText={translate('RemotePathMappingLocalPathHelpText')}
|
||||
{...localPath}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
|
||||
@@ -49,12 +49,12 @@ class RemotePathMappings extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('RemotePathMappings')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadRemotePathMappings')}
|
||||
errorMessage={translate('RemotePathMappingsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
<InlineMarkdown data={translate('RemotePathMappingsInfo', { app: 'Radarr', wikiLink: 'https://wiki.servarr.com/radarr/settings#remote-path-mappings' })} />
|
||||
<InlineMarkdown data={translate('RemotePathMappingsInfo', { wikiLink: 'https://wiki.servarr.com/radarr/settings#remote-path-mappings' })} />
|
||||
</Alert>
|
||||
|
||||
<div className={styles.remotePathMappingsHeader}>
|
||||
|
||||
@@ -22,6 +22,7 @@ const requiresRestartKeys = [
|
||||
'bindAddress',
|
||||
'port',
|
||||
'urlBase',
|
||||
'instanceName',
|
||||
'enableSsl',
|
||||
'sslPort',
|
||||
'sslCertPath',
|
||||
@@ -125,7 +126,7 @@ class GeneralSettings extends Component {
|
||||
{
|
||||
!isFetching && error &&
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadGeneralSettings')}
|
||||
{translate('GeneralSettingsLoadError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
@@ -186,10 +187,8 @@ class GeneralSettings extends Component {
|
||||
isOpen={this.state.isRestartRequiredModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title={translate('RestartRadarr')}
|
||||
message={
|
||||
`Radarr requires a restart to apply changes, do you want to restart now? ${isWindowsService ? 'Depending which user is running the Radarr service you may need to restart Radarr as admin once before the service will start automatically.' : ''}`
|
||||
}
|
||||
cancelLabel={translate('IllRestartLater')}
|
||||
message={`${translate('RestartRequiredToApplyChanges')} ${isWindowsService ? translate('RestartRequiredWindowsService') : ''}`}
|
||||
cancelLabel={translate('RestartLater')}
|
||||
confirmLabel={translate('RestartNow')}
|
||||
onConfirm={this.onConfirmRestart}
|
||||
onCancel={this.onCloseRestartRequiredModalOpen}
|
||||
|
||||
@@ -63,7 +63,7 @@ function HostSettings(props) {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('URLBase')}</FormLabel>
|
||||
<FormLabel>{translate('UrlBase')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
@@ -111,7 +111,7 @@ function HostSettings(props) {
|
||||
isAdvanced={true}
|
||||
size={sizes.MEDIUM}
|
||||
>
|
||||
<FormLabel>{translate('EnableSSL')}</FormLabel>
|
||||
<FormLabel>{translate('EnableSsl')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
@@ -128,7 +128,7 @@ function HostSettings(props) {
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>{translate('SSLPort')}</FormLabel>
|
||||
<FormLabel>{translate('SslPort')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.NUMBER}
|
||||
@@ -149,12 +149,12 @@ function HostSettings(props) {
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>{translate('SSLCertPath')}</FormLabel>
|
||||
<FormLabel>{translate('SslCertPath')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
name="sslCertPath"
|
||||
helpText={translate('SSLCertPathHelpText')}
|
||||
helpText={translate('SslCertPathHelpText')}
|
||||
helpTextWarning={translate('RestartRequiredHelpTextWarning')}
|
||||
onChange={onInputChange}
|
||||
{...sslCertPath}
|
||||
@@ -169,12 +169,12 @@ function HostSettings(props) {
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>{translate('SSLCertPassword')}</FormLabel>
|
||||
<FormLabel>{translate('SslCertPassword')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.PASSWORD}
|
||||
name="sslCertPassword"
|
||||
helpText={translate('SSLCertPasswordHelpText')}
|
||||
helpText={translate('SslCertPasswordHelpText')}
|
||||
helpTextWarning={translate('RestartRequiredHelpTextWarning')}
|
||||
onChange={onInputChange}
|
||||
{...sslCertPassword}
|
||||
@@ -184,18 +184,19 @@ function HostSettings(props) {
|
||||
}
|
||||
|
||||
{
|
||||
isWindows && mode !== 'service' &&
|
||||
isWindows && mode !== 'service' ?
|
||||
<FormGroup size={sizes.MEDIUM}>
|
||||
<FormLabel>{translate('OpenBrowserOnStart')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="launchBrowser"
|
||||
helpText={translate('LaunchBrowserHelpText')}
|
||||
helpText={translate('OpenBrowserOnStartHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...launchBrowser}
|
||||
/>
|
||||
</FormGroup>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
</FieldSet>
|
||||
|
||||
@@ -25,9 +25,18 @@ function ProxySettings(props) {
|
||||
} = settings;
|
||||
|
||||
const proxyTypeOptions = [
|
||||
{ key: 'http', value: translate('HttpHttps') },
|
||||
{ key: 'socks4', value: translate('Socks4') },
|
||||
{ key: 'socks5', value: translate('Socks5') }
|
||||
{
|
||||
key: 'http',
|
||||
value: translate('HttpHttps')
|
||||
},
|
||||
{
|
||||
key: 'socks4',
|
||||
value: translate('Socks4')
|
||||
},
|
||||
{
|
||||
key: 'socks5',
|
||||
value: translate('Socks5')
|
||||
}
|
||||
];
|
||||
|
||||
return (
|
||||
|
||||
@@ -70,7 +70,8 @@ function UpdateSettings(props) {
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
!isWindows &&
|
||||
isWindows ?
|
||||
null :
|
||||
<div>
|
||||
<FormGroup
|
||||
advancedSettings={advancedSettings}
|
||||
|
||||
+5
-4
@@ -1,5 +1,6 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Form from 'Components/Form/Form';
|
||||
import FormGroup from 'Components/Form/FormGroup';
|
||||
import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||
@@ -39,7 +40,7 @@ function EditImportListExclusionModalContent(props) {
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>
|
||||
{id ? translate('EditListExclusion') : translate('AddListExclusion')}
|
||||
{id ? translate('EditImportListExclusion') : translate('AddImportListExclusion')}
|
||||
</ModalHeader>
|
||||
|
||||
<ModalBody className={styles.body}>
|
||||
@@ -50,9 +51,9 @@ function EditImportListExclusionModalContent(props) {
|
||||
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<div>
|
||||
{translate('UnableToAddANewListExclusionPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddImportListExclusionError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -45,14 +45,14 @@ class ImportListExclusions extends Component {
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
<FieldSet legend={translate('ListExclusions')}>
|
||||
<FieldSet legend={translate('ImportListExclusions')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadListExclusions')}
|
||||
errorMessage={translate('ImportListExclusionsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.importListExclusionsHeader}>
|
||||
<div className={styles.tmdbId}>
|
||||
TMDb Id
|
||||
{translate('TMDBId')}
|
||||
</div>
|
||||
<div className={styles.title}>
|
||||
{translate('Title')}
|
||||
|
||||
@@ -70,7 +70,7 @@ class ImportListSettings extends Component {
|
||||
} = this.state;
|
||||
|
||||
return (
|
||||
<PageContent title={translate('ListSettings')}>
|
||||
<PageContent title={translate('ImportListSettings')}>
|
||||
<SettingsToolbarConnector
|
||||
isSaving={isSaving}
|
||||
hasPendingChanges={hasPendingChanges}
|
||||
|
||||
@@ -37,42 +37,46 @@ class AddImportListModalContent extends Component {
|
||||
|
||||
<ModalBody>
|
||||
{
|
||||
isSchemaFetching &&
|
||||
<LoadingIndicator />
|
||||
isSchemaFetching ?
|
||||
<LoadingIndicator /> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
!isSchemaFetching && !!schemaError &&
|
||||
<div>
|
||||
{translate('UnableToAddANewListPleaseTryAgain')}
|
||||
</div>
|
||||
!isSchemaFetching && !!schemaError ?
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddListError')}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
isSchemaPopulated && !schemaError &&
|
||||
isSchemaPopulated && !schemaError ?
|
||||
<div>
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{translate('RadarrSupportsAnyRSSMovieListsAsWellAsTheOneStatedBelow')}
|
||||
{translate('SupportedListsMovie')}
|
||||
</div>
|
||||
<div>
|
||||
{translate('ForMoreInformationOnTheIndividualImportListsClinkOnTheInfoButtons')}
|
||||
{translate('SupportedListsMoreInfo')}
|
||||
</div>
|
||||
</Alert>
|
||||
|
||||
{
|
||||
Object.keys(listGroups).map((key) => {
|
||||
return (
|
||||
<FieldSet legend={`${titleCase(key)} List`} key={key}>
|
||||
<FieldSet key={key} legend={translate('TypeOfList', {
|
||||
typeOfList: titleCase(key)
|
||||
})}
|
||||
>
|
||||
<div className={styles.importLists}>
|
||||
{
|
||||
listGroups[key].map((importList) => {
|
||||
listGroups[key].map((list) => {
|
||||
return (
|
||||
<AddImportListItem
|
||||
key={importList.implementation}
|
||||
implementation={importList.implementation}
|
||||
{...importList}
|
||||
key={list.implementation}
|
||||
implementation={list.implementation}
|
||||
{...list}
|
||||
onImportListSelect={onImportListSelect}
|
||||
/>
|
||||
);
|
||||
@@ -83,7 +87,8 @@ class AddImportListModalContent extends Component {
|
||||
);
|
||||
})
|
||||
}
|
||||
</div>
|
||||
</div> :
|
||||
null
|
||||
}
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
|
||||
@@ -67,10 +67,11 @@ function EditImportListModalContent(props) {
|
||||
}
|
||||
|
||||
{
|
||||
!isFetching && (!!error || !!rootFolderError) &&
|
||||
<div>
|
||||
{translate('UnableToAddANewListPleaseTryAgain')}
|
||||
</div>
|
||||
!isFetching && (!!error || !!rootFolderError) ?
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddListError')}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
@@ -92,7 +93,9 @@ function EditImportListModalContent(props) {
|
||||
kind={kinds.INFO}
|
||||
className={styles.message}
|
||||
>
|
||||
{translate('ListWillRefreshEveryInterp', [formatShortTimeSpan(minRefreshInterval.value)])}
|
||||
{translate('ListWillRefreshEveryInterval', {
|
||||
refreshInterval: formatShortTimeSpan(minRefreshInterval.value)
|
||||
})}
|
||||
</Alert>
|
||||
|
||||
<FormGroup>
|
||||
@@ -112,7 +115,7 @@ function EditImportListModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="enabled"
|
||||
helpText={translate('EnabledHelpText')}
|
||||
helpText={translate('ListEnabledHelpText')}
|
||||
{...enabled}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -124,7 +127,7 @@ function EditImportListModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="enableAuto"
|
||||
helpText={translate('EnableAutoHelpText')}
|
||||
helpText={translate('EnableAutomaticAddMovieHelpText')}
|
||||
{...enableAuto}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -136,7 +139,7 @@ function EditImportListModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.MOVIE_MONITORED_SELECT}
|
||||
name="monitor"
|
||||
helpText={translate('ShouldMonitorHelpText')}
|
||||
helpText={translate('ListMonitorMovieHelpText')}
|
||||
{...monitor}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -148,7 +151,7 @@ function EditImportListModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="searchOnAdd"
|
||||
helpText={translate('SearchOnAddHelpText')}
|
||||
helpText={translate('ListSearchOnAddMovieHelpText')}
|
||||
{...searchOnAdd}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -170,6 +173,7 @@ function EditImportListModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.QUALITY_PROFILE_SELECT}
|
||||
name="qualityProfileId"
|
||||
helpText={translate('ListQualityProfileHelpText')}
|
||||
{...qualityProfileId}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -181,6 +185,7 @@ function EditImportListModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.ROOT_FOLDER_SELECT}
|
||||
name="rootFolderPath"
|
||||
helpText={translate('ListRootFolderHelpText')}
|
||||
{...rootFolderPath}
|
||||
includeMissingValue={true}
|
||||
onChange={onInputChange}
|
||||
|
||||
@@ -89,7 +89,7 @@ class ImportList extends Component {
|
||||
{
|
||||
enableAuto &&
|
||||
<Label kind={kinds.SUCCESS}>
|
||||
{translate('Auto')}
|
||||
{translate('AutomaticAdd')}
|
||||
</Label>
|
||||
}
|
||||
</div>
|
||||
|
||||
@@ -59,9 +59,9 @@ class ImportLists extends Component {
|
||||
} = this.state;
|
||||
|
||||
return (
|
||||
<FieldSet legend={translate('Lists')}>
|
||||
<FieldSet legend={translate('ImportLists')} >
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadLists')}
|
||||
errorMessage={translate('ImportListsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.importLists}>
|
||||
|
||||
@@ -43,9 +43,9 @@ class AddIndexerModalContent extends Component {
|
||||
|
||||
{
|
||||
!isSchemaFetching && !!schemaError &&
|
||||
<div>
|
||||
{translate('UnableToAddANewIndexerPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddIndexerError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
@@ -54,10 +54,10 @@ class AddIndexerModalContent extends Component {
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{translate('RadarrSupportsAnyIndexer')}
|
||||
{translate('SupportedIndexers')}
|
||||
</div>
|
||||
<div>
|
||||
{translate('ForMoreInformationOnTheIndividualIndexers')}
|
||||
{translate('SupportedIndexersMoreInfo')}
|
||||
</div>
|
||||
</Alert>
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ function EditIndexerModalContent(props) {
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<div>
|
||||
{translate('UnableToAddANewIndexerPleaseTryAgain')}
|
||||
{translate('AddIndexerError')}
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -86,13 +86,13 @@ function EditIndexerModalContent(props) {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('EnableRSS')}</FormLabel>
|
||||
<FormLabel>{translate('EnableRss')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="enableRss"
|
||||
helpText={supportsRss.value ? translate('RSSHelpText') : undefined}
|
||||
helpTextWarning={supportsRss.value ? undefined : translate('RSSIsNotSupportedWithThisIndexer')}
|
||||
helpText={supportsRss.value ? translate('EnableRssHelpText') : undefined}
|
||||
helpTextWarning={supportsRss.value ? undefined : translate('RssIsNotSupportedWithThisIndexer')}
|
||||
isDisabled={!supportsRss.value}
|
||||
{...enableRss}
|
||||
onChange={onInputChange}
|
||||
@@ -106,7 +106,7 @@ function EditIndexerModalContent(props) {
|
||||
type={inputTypes.CHECK}
|
||||
name="enableAutomaticSearch"
|
||||
helpText={supportsSearch.value ? translate('EnableAutomaticSearchHelpText') : undefined}
|
||||
helpTextWarning={supportsSearch.value ? undefined : translate('EnableAutomaticSearchHelpTextWarning')}
|
||||
helpTextWarning={supportsSearch.value ? undefined : translate('SearchIsNotSupportedWithThisIndexer')}
|
||||
isDisabled={!supportsSearch.value}
|
||||
{...enableAutomaticSearch}
|
||||
onChange={onInputChange}
|
||||
@@ -120,7 +120,7 @@ function EditIndexerModalContent(props) {
|
||||
type={inputTypes.CHECK}
|
||||
name="enableInteractiveSearch"
|
||||
helpText={supportsSearch.value ? translate('EnableInteractiveSearchHelpText') : undefined}
|
||||
helpTextWarning={supportsSearch.value ? undefined : translate('EnableInteractiveSearchHelpTextWarning')}
|
||||
helpTextWarning={supportsSearch.value ? undefined : translate('SearchIsNotSupportedWithThisIndexer')}
|
||||
isDisabled={!supportsSearch.value}
|
||||
{...enableInteractiveSearch}
|
||||
onChange={onInputChange}
|
||||
@@ -182,7 +182,7 @@ function EditIndexerModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.TAG}
|
||||
name="tags"
|
||||
helpText={translate('IndexerTagHelpText')}
|
||||
helpText={translate('IndexerTagMovieHelpText')}
|
||||
{...tags}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
|
||||
@@ -101,7 +101,7 @@ class Indexer extends Component {
|
||||
{
|
||||
supportsRss && enableRss &&
|
||||
<Label kind={kinds.SUCCESS}>
|
||||
{translate('RSS')}
|
||||
{translate('Rss')}
|
||||
</Label>
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ class Indexers extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('Indexers')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadIndexers')}
|
||||
errorMessage={translate('IndexersLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.indexers}>
|
||||
|
||||
+1
-1
@@ -127,7 +127,7 @@ function ManageIndexersEditModalContent(
|
||||
|
||||
<ModalBody>
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('EnableRSS')}</FormLabel>
|
||||
<FormLabel>{translate('EnableRss')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
|
||||
@@ -50,7 +50,7 @@ const COLUMNS = [
|
||||
},
|
||||
{
|
||||
name: 'enableRss',
|
||||
label: () => translate('EnableRSS'),
|
||||
label: () => translate('EnableRss'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
|
||||
@@ -31,7 +31,7 @@ function IndexerOptions(props) {
|
||||
{
|
||||
!isFetching && error &&
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadIndexerOptions')}
|
||||
{translate('IndexerOptionsLoadError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ function IndexerOptions(props) {
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>{translate('RSSSyncInterval')}</FormLabel>
|
||||
<FormLabel>{translate('RssSyncInterval')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.NUMBER}
|
||||
@@ -118,8 +118,8 @@ function IndexerOptions(props) {
|
||||
min={0}
|
||||
max={120}
|
||||
unit="minutes"
|
||||
helpText={translate('RssSyncHelpText')}
|
||||
helpTextWarning={translate('RSSSyncIntervalHelpTextWarning')}
|
||||
helpText={translate('RssSyncIntervalHelpText')}
|
||||
helpTextWarning={translate('RssSyncIntervalHelpTextWarning')}
|
||||
helpLink="https://wiki.servarr.com/radarr/faq#how-does-radarr-work"
|
||||
onChange={onInputChange}
|
||||
{...settings.rssSyncInterval}
|
||||
|
||||
@@ -119,7 +119,7 @@ class MediaManagement extends Component {
|
||||
!isFetching && error ?
|
||||
<FieldSet legend={translate('NamingSettings')}>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadMediaManagementSettings')}
|
||||
{translate('MediaManagementSettingsLoadError')}
|
||||
</Alert>
|
||||
</FieldSet> : null
|
||||
}
|
||||
@@ -204,7 +204,7 @@ class MediaManagement extends Component {
|
||||
type={inputTypes.NUMBER}
|
||||
unit='MB'
|
||||
name="minimumFreeSpaceWhenImporting"
|
||||
helpText={translate('MinimumFreeSpaceWhenImportingHelpText')}
|
||||
helpText={translate('MinimumFreeSpaceHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.minimumFreeSpaceWhenImporting}
|
||||
/>
|
||||
@@ -220,7 +220,7 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="copyUsingHardlinks"
|
||||
helpText={translate('CopyUsingHardlinksHelpText')}
|
||||
helpText={translate('CopyUsingHardlinksMovieHelpText')}
|
||||
helpTextWarning={translate('CopyUsingHardlinksHelpTextWarning')}
|
||||
onChange={onInputChange}
|
||||
{...settings.copyUsingHardlinks}
|
||||
@@ -237,7 +237,7 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="useScriptImport"
|
||||
helpText={translate('UseScriptImportHelpText')}
|
||||
helpText={translate('ImportUsingScriptHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.useScriptImport}
|
||||
/>
|
||||
@@ -255,7 +255,7 @@ class MediaManagement extends Component {
|
||||
type={inputTypes.PATH}
|
||||
includeFiles={true}
|
||||
name="scriptImportPath"
|
||||
helpText={translate('ScriptImportPathHelpText')}
|
||||
helpText={translate('ImportScriptPathHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.scriptImportPath}
|
||||
/>
|
||||
@@ -268,7 +268,7 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="importExtraFiles"
|
||||
helpText={translate('ImportExtraFilesHelpText')}
|
||||
helpText={translate('ImportExtraFilesMovieHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.importExtraFiles}
|
||||
/>
|
||||
@@ -286,8 +286,8 @@ class MediaManagement extends Component {
|
||||
type={inputTypes.TEXT}
|
||||
name="extraFileExtensions"
|
||||
helpTexts={[
|
||||
translate('ExtraFileExtensionsHelpTexts1'),
|
||||
translate('ExtraFileExtensionsHelpTexts2')
|
||||
translate('ExtraFileExtensionsHelpText'),
|
||||
translate('ExtraFileExtensionsHelpTextsExamples')
|
||||
]}
|
||||
onChange={onInputChange}
|
||||
{...settings.extraFileExtensions}
|
||||
@@ -323,8 +323,8 @@ class MediaManagement extends Component {
|
||||
type={inputTypes.SELECT}
|
||||
name="downloadPropersAndRepacks"
|
||||
helpTexts={[
|
||||
translate('DownloadPropersAndRepacksHelpText1'),
|
||||
translate('DownloadPropersAndRepacksHelpText2')
|
||||
translate('DownloadPropersAndRepacksHelpText'),
|
||||
translate('DownloadPropersAndRepacksHelpTextCustomFormat')
|
||||
]}
|
||||
helpTextWarning={
|
||||
settings.downloadPropersAndRepacks.value === 'doNotPrefer' ?
|
||||
@@ -347,7 +347,7 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="enableMediaInfo"
|
||||
helpText={translate('EnableMediaInfoHelpText')}
|
||||
helpText={translate('AnalyseVideoFilesHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.enableMediaInfo}
|
||||
/>
|
||||
@@ -362,7 +362,7 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="rescanAfterRefresh"
|
||||
helpText={translate('RescanAfterRefreshHelpText')}
|
||||
helpText={translate('RescanAfterRefreshMovieHelpText')}
|
||||
helpTextWarning={translate('RescanAfterRefreshHelpTextWarning')}
|
||||
values={rescanAfterRefreshOptions}
|
||||
onChange={onInputChange}
|
||||
@@ -379,7 +379,7 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="fileDate"
|
||||
helpText={translate('FileDateHelpText')}
|
||||
helpText={translate('ChangeFileDateHelpText')}
|
||||
values={fileDateOptions}
|
||||
onChange={onInputChange}
|
||||
{...settings.fileDate}
|
||||
@@ -395,7 +395,7 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.PATH}
|
||||
name="recycleBin"
|
||||
helpText={translate('RecycleBinHelpText')}
|
||||
helpText={translate('RecyclingBinHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.recycleBin}
|
||||
/>
|
||||
@@ -410,8 +410,8 @@ class MediaManagement extends Component {
|
||||
<FormInputGroup
|
||||
type={inputTypes.NUMBER}
|
||||
name="recycleBinCleanupDays"
|
||||
helpText={translate('RecycleBinCleanupDaysHelpText')}
|
||||
helpTextWarning={translate('RecycleBinCleanupDaysHelpTextWarning')}
|
||||
helpText={translate('RecyclingBinCleanupHelpText')}
|
||||
helpTextWarning={translate('RecyclingBinCleanupHelpTextWarning')}
|
||||
min={0}
|
||||
onChange={onInputChange}
|
||||
{...settings.recycleBinCleanupDays}
|
||||
@@ -461,13 +461,13 @@ class MediaManagement extends Component {
|
||||
advancedSettings={advancedSettings}
|
||||
isAdvanced={true}
|
||||
>
|
||||
<FormLabel>{translate('ChmodGroup')}</FormLabel>
|
||||
<FormLabel>{translate('ChownGroup')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.TEXT}
|
||||
name="chownGroup"
|
||||
helpText={translate('ChmodGroupHelpText')}
|
||||
helpTextWarning={translate('ChmodGroupHelpTextWarning')}
|
||||
helpText={translate('ChownGroupHelpText')}
|
||||
helpTextWarning={translate('ChownGroupHelpTextWarning')}
|
||||
values={fileDateOptions}
|
||||
onChange={onInputChange}
|
||||
{...settings.chownGroup}
|
||||
|
||||
@@ -110,7 +110,7 @@ class Naming extends Component {
|
||||
|
||||
if (examplesPopulated) {
|
||||
if (examples.movieExample) {
|
||||
standardMovieFormatHelpTexts.push(`Movie: ${examples.movieExample}`);
|
||||
standardMovieFormatHelpTexts.push(`${translate('Movie')}: ${examples.movieExample}`);
|
||||
} else {
|
||||
standardMovieFormatErrors.push({ get message() {
|
||||
return translate('MovieInvalidFormat');
|
||||
@@ -118,7 +118,7 @@ class Naming extends Component {
|
||||
}
|
||||
|
||||
if (examples.movieFolderExample) {
|
||||
movieFolderFormatHelpTexts.push(`Example: ${examples.movieFolderExample}`);
|
||||
movieFolderFormatHelpTexts.push(`${translate('Example')}: ${examples.movieFolderExample}`);
|
||||
} else {
|
||||
movieFolderFormatErrors.push({ get message() {
|
||||
return translate('InvalidFormat');
|
||||
@@ -136,7 +136,7 @@ class Naming extends Component {
|
||||
{
|
||||
!isFetching && error &&
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadNamingSettings')}
|
||||
{translate('NamingSettingsLoadError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ class Naming extends Component {
|
||||
buttons={<FormInputButton onPress={this.onMovieFolderNamingModalOpenClick}>?</FormInputButton>}
|
||||
onChange={onInputChange}
|
||||
{...settings.movieFolderFormat}
|
||||
helpTexts={['Used when adding a new movie or moving movies via the editor', ...movieFolderFormatHelpTexts]}
|
||||
helpTexts={[translate('MovieFolderFormatHelpText'), ...movieFolderFormatHelpTexts]}
|
||||
errors={[...movieFolderFormatErrors, ...settings.movieFolderFormat.errors]}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
@@ -5,6 +5,7 @@ import SelectInput from 'Components/Form/SelectInput';
|
||||
import TextInput from 'Components/Form/TextInput';
|
||||
import Icon from 'Components/Icon';
|
||||
import Button from 'Components/Link/Button';
|
||||
import InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
||||
import Modal from 'Components/Modal/Modal';
|
||||
import ModalBody from 'Components/Modal/ModalBody';
|
||||
import ModalContent from 'Components/Modal/ModalContent';
|
||||
@@ -16,10 +17,30 @@ import NamingOption from './NamingOption';
|
||||
import styles from './NamingModal.css';
|
||||
|
||||
const separatorOptions = [
|
||||
{ key: ' ', value: 'Space ( )' },
|
||||
{ key: '.', value: 'Period (.)' },
|
||||
{ key: '_', value: 'Underscore (_)' },
|
||||
{ key: '-', value: 'Dash (-)' }
|
||||
{
|
||||
key: ' ',
|
||||
get value() {
|
||||
return `${translate('Space')} ( )`;
|
||||
}
|
||||
},
|
||||
{
|
||||
key: '.',
|
||||
get value() {
|
||||
return `${translate('Period')} (.)`;
|
||||
}
|
||||
},
|
||||
{
|
||||
key: '_',
|
||||
get value() {
|
||||
return `${translate('Underscore')} (_)`;
|
||||
}
|
||||
},
|
||||
{
|
||||
key: '-',
|
||||
get value() {
|
||||
return `${translate('Dash')} (-)`;
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
const caseOptions = [
|
||||
@@ -32,13 +53,13 @@ const caseOptions = [
|
||||
{
|
||||
key: 'lower',
|
||||
get value() {
|
||||
return translate('LowerCase');
|
||||
return translate('Lowercase');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'upper',
|
||||
get value() {
|
||||
return translate('UpperCase');
|
||||
return translate('Uppercase');
|
||||
}
|
||||
}
|
||||
];
|
||||
@@ -336,10 +357,7 @@ class NamingModal extends Component {
|
||||
|
||||
<div className={styles.footNote}>
|
||||
<Icon className={styles.icon} name={icons.FOOTNOTE} />
|
||||
<div>
|
||||
MediaInfo Full/AudioLanguages/SubtitleLanguages support a <code>:EN+DE</code> suffix allowing you to filter the languages included in the filename. Use <code>-DE</code> to exclude specific languages.
|
||||
Appending <code>+</code> (eg <code>:EN+</code>) will output <code>[EN]</code>/<code>[EN+--]</code>/<code>[--]</code> depending on excluded languages. For example <code>{'{'}MediaInfo Full:EN+DE{'}'}</code>.
|
||||
</div>
|
||||
<InlineMarkdown data={translate('MediaInfoFootNote')} />
|
||||
</div>
|
||||
</FieldSet>
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ function EditMetadataModalContent(props) {
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>
|
||||
Edit {name.value} Metadata
|
||||
{translate('EditMetadata', { metadataType: name.value })}
|
||||
</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
@@ -47,7 +47,7 @@ function EditMetadataModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="enable"
|
||||
helpText={translate('EnableHelpText')}
|
||||
helpText={translate('EnableMetadataHelpText')}
|
||||
{...enable}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
|
||||
@@ -15,7 +15,7 @@ function Metadatas(props) {
|
||||
return (
|
||||
<FieldSet legend={translate('Metadata')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadMetadata')}
|
||||
errorMessage={translate('MetadataLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.metadatas}>
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Button from 'Components/Link/Button';
|
||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||
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 { kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import AddNotificationItem from './AddNotificationItem';
|
||||
import styles from './AddNotificationModalContent.css';
|
||||
@@ -39,9 +41,9 @@ class AddNotificationModalContent extends Component {
|
||||
|
||||
{
|
||||
!isSchemaFetching && !!schemaError &&
|
||||
<div>
|
||||
{translate('UnableToAddANewNotificationPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddNotificationError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -59,9 +59,9 @@ function EditNotificationModalContent(props) {
|
||||
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<div>
|
||||
{translate('UnableToAddANewNotificationPleaseTryAgain')}
|
||||
</div>
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddNotificationError')}
|
||||
</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
@@ -99,7 +99,7 @@ function EditNotificationModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.TAG}
|
||||
name="tags"
|
||||
helpText={translate('TagsHelpText')}
|
||||
helpText={translate('NotificationsTagsMovieHelpText')}
|
||||
{...tags}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
|
||||
@@ -55,7 +55,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onGrab"
|
||||
helpText={translate('OnGrabHelpText')}
|
||||
helpText={translate('OnGrab')}
|
||||
isDisabled={!supportsOnGrab.value}
|
||||
{...onGrab}
|
||||
onChange={onInputChange}
|
||||
@@ -66,7 +66,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onDownload"
|
||||
helpText={translate('OnDownloadHelpText')}
|
||||
helpText={translate('OnImport')}
|
||||
isDisabled={!supportsOnDownload.value}
|
||||
{...onDownload}
|
||||
onChange={onInputChange}
|
||||
@@ -79,7 +79,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onUpgrade"
|
||||
helpText={translate('OnUpgradeHelpText')}
|
||||
helpText={translate('OnUpgrade')}
|
||||
isDisabled={!supportsOnUpgrade.value}
|
||||
{...onUpgrade}
|
||||
onChange={onInputChange}
|
||||
@@ -91,7 +91,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onRename"
|
||||
helpText={translate('OnRenameHelpText')}
|
||||
helpText={translate('OnRename')}
|
||||
isDisabled={!supportsOnRename.value}
|
||||
{...onRename}
|
||||
onChange={onInputChange}
|
||||
@@ -102,7 +102,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onMovieAdded"
|
||||
helpText={translate('OnMovieAddedHelpText')}
|
||||
helpText={translate('OnMovieAdded')}
|
||||
isDisabled={!supportsOnMovieAdded.value}
|
||||
{...onMovieAdded}
|
||||
onChange={onInputChange}
|
||||
@@ -113,7 +113,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onMovieDelete"
|
||||
helpText={translate('OnMovieDeleteHelpText')}
|
||||
helpText={translate('OnMovieDelete')}
|
||||
isDisabled={!supportsOnMovieDelete.value}
|
||||
{...onMovieDelete}
|
||||
onChange={onInputChange}
|
||||
@@ -124,7 +124,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onMovieFileDelete"
|
||||
helpText={translate('OnMovieFileDeleteHelpText')}
|
||||
helpText={translate('OnMovieFileDelete')}
|
||||
isDisabled={!supportsOnMovieFileDelete.value}
|
||||
{...onMovieFileDelete}
|
||||
onChange={onInputChange}
|
||||
@@ -137,7 +137,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onMovieFileDeleteForUpgrade"
|
||||
helpText={translate('OnMovieFileDeleteForUpgradeHelpText')}
|
||||
helpText={translate('OnMovieFileDeleteForUpgrade')}
|
||||
isDisabled={!supportsOnMovieFileDeleteForUpgrade.value}
|
||||
{...onMovieFileDeleteForUpgrade}
|
||||
onChange={onInputChange}
|
||||
@@ -149,7 +149,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onHealthIssue"
|
||||
helpText={translate('OnHealthIssueHelpText')}
|
||||
helpText={translate('OnHealthIssue')}
|
||||
isDisabled={!supportsOnHealthIssue.value}
|
||||
{...onHealthIssue}
|
||||
onChange={onInputChange}
|
||||
@@ -160,7 +160,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onHealthRestored"
|
||||
helpText={translate('OnHealthRestoredHelpText')}
|
||||
helpText={translate('OnHealthRestored')}
|
||||
isDisabled={!supportsOnHealthRestored.value}
|
||||
{...onHealthRestored}
|
||||
onChange={onInputChange}
|
||||
@@ -173,7 +173,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="includeHealthWarnings"
|
||||
helpText={translate('IncludeHealthWarningsHelpText')}
|
||||
helpText={translate('IncludeHealthWarnings')}
|
||||
isDisabled={!supportsOnHealthIssue.value}
|
||||
{...includeHealthWarnings}
|
||||
onChange={onInputChange}
|
||||
@@ -185,7 +185,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onApplicationUpdate"
|
||||
helpText={translate('OnApplicationUpdateHelpText')}
|
||||
helpText={translate('OnApplicationUpdate')}
|
||||
isDisabled={!supportsOnApplicationUpdate.value}
|
||||
{...onApplicationUpdate}
|
||||
onChange={onInputChange}
|
||||
@@ -196,7 +196,7 @@ function NotificationEventItems(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="onManualInteractionRequired"
|
||||
helpText={translate('OnManualInteractionRequiredHelpText')}
|
||||
helpText={translate('OnManualInteractionRequired')}
|
||||
isDisabled={!supportsOnManualInteractionRequired.value}
|
||||
{...onManualInteractionRequired}
|
||||
onChange={onInputChange}
|
||||
|
||||
@@ -62,7 +62,7 @@ class Notifications extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('Connections')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadNotifications')}
|
||||
errorMessage={translate('NotificationsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.notifications}>
|
||||
|
||||
@@ -17,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 {
|
||||
@@ -85,7 +85,7 @@ class DelayProfile extends Component {
|
||||
connectDragSource
|
||||
} = this.props;
|
||||
|
||||
let preferred = `Prefer ${titleCase(preferredProtocol)}`;
|
||||
let preferred = titleCase(translate('PreferProtocol', { preferredProtocol }));
|
||||
|
||||
if (!enableUsenet) {
|
||||
preferred = translate('OnlyTorrent');
|
||||
|
||||
@@ -70,7 +70,7 @@ class DelayProfiles extends Component {
|
||||
<Measure onMeasure={this.onMeasure}>
|
||||
<FieldSet legend={translate('DelayProfiles')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadDelayProfiles')}
|
||||
errorMessage={translate('DelayProfilesLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<Scroller
|
||||
|
||||
@@ -87,9 +87,9 @@ function EditDelayProfileModalContent(props) {
|
||||
|
||||
{
|
||||
!isFetching && !!error ?
|
||||
<div>
|
||||
{translate('UnableToAddANewQualityProfilePleaseTryAgain')}
|
||||
</div> :
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddDelayProfileError')}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ function EditDelayProfileModalContent(props) {
|
||||
{
|
||||
id === 1 ?
|
||||
<Alert>
|
||||
{translate('DefaultDelayProfile')}
|
||||
{translate('DefaultDelayProfileMovie')}
|
||||
</Alert> :
|
||||
|
||||
<FormGroup>
|
||||
@@ -196,7 +196,7 @@ function EditDelayProfileModalContent(props) {
|
||||
type={inputTypes.TAG}
|
||||
name="tags"
|
||||
{...tags}
|
||||
helpText={translate('TagsHelpText')}
|
||||
helpText={translate('DelayProfileMovieTagsHelpText')}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
@@ -8,6 +8,7 @@ import translate from 'Utilities/String/translate';
|
||||
import DelayProfilesConnector from './Delay/DelayProfilesConnector';
|
||||
import QualityProfilesConnector from './Quality/QualityProfilesConnector';
|
||||
import ReleaseProfilesConnector from './Release/ReleaseProfilesConnector';
|
||||
|
||||
// Only a single DragDrop Context can exist so it's done here to allow editing
|
||||
// quality profiles and reordering delay profiles to work.
|
||||
|
||||
@@ -19,9 +20,7 @@ class Profiles extends Component {
|
||||
render() {
|
||||
return (
|
||||
<PageContent title={translate('Profiles')}>
|
||||
<SettingsToolbarConnector
|
||||
showSave={false}
|
||||
/>
|
||||
<SettingsToolbarConnector showSave={false} />
|
||||
|
||||
<PageContentBody>
|
||||
<DndProvider options={HTML5toTouch}>
|
||||
|
||||
@@ -158,7 +158,7 @@ class EditQualityProfileModalContent extends Component {
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<div>
|
||||
{translate('UnableToAddANewQualityProfilePleaseTryAgain')}
|
||||
{translate('AddQualityProfileError')}
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -191,7 +191,7 @@ class EditQualityProfileModalContent extends Component {
|
||||
type={inputTypes.CHECK}
|
||||
name="upgradeAllowed"
|
||||
{...upgradeAllowed}
|
||||
helpText={translate('UpgradeAllowedHelpText')}
|
||||
helpText={translate('UpgradesAllowedHelpText')}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
@@ -200,7 +200,7 @@ class EditQualityProfileModalContent extends Component {
|
||||
upgradeAllowed.value &&
|
||||
<FormGroup size={sizes.EXTRA_SMALL}>
|
||||
<FormLabel size={sizes.SMALL}>
|
||||
{translate('UpgradeUntilQuality')}
|
||||
{translate('UpgradeUntil')}
|
||||
</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
@@ -208,7 +208,7 @@ class EditQualityProfileModalContent extends Component {
|
||||
name="cutoff"
|
||||
{...cutoff}
|
||||
values={qualities}
|
||||
helpText={translate('CutoffHelpText')}
|
||||
helpText={translate('UpgradeUntilMovieHelpText')}
|
||||
onChange={onCutoffChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
@@ -225,7 +225,7 @@ class EditQualityProfileModalContent extends Component {
|
||||
type={inputTypes.NUMBER}
|
||||
name="minFormatScore"
|
||||
{...minFormatScore}
|
||||
helpText={translate('MinFormatScoreHelpText')}
|
||||
helpText={translate('MinimumCustomFormatScoreHelpText')}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
@@ -242,7 +242,7 @@ class EditQualityProfileModalContent extends Component {
|
||||
type={inputTypes.NUMBER}
|
||||
name="cutoffFormatScore"
|
||||
{...cutoffFormatScore}
|
||||
helpText={translate('CutoffFormatScoreHelpText')}
|
||||
helpText={translate('UpgradeUntilCustomFormatScoreMovieHelpText')}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
@@ -301,7 +301,7 @@ class EditQualityProfileModalContent extends Component {
|
||||
className={styles.deleteButtonContainer}
|
||||
title={
|
||||
isInUse ?
|
||||
translate('QualityProfileInUse') :
|
||||
translate('QualityProfileInUseMovieListCollection') :
|
||||
undefined
|
||||
}
|
||||
>
|
||||
|
||||
@@ -4,7 +4,7 @@ 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 InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
||||
import { sizes } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import QualityProfileFormatItem from './QualityProfileFormatItem';
|
||||
@@ -67,10 +67,7 @@ class QualityProfileFormatItems extends Component {
|
||||
|
||||
if (profileFormatItems.length < 1) {
|
||||
return (
|
||||
<div className={styles.addCustomFormatMessage}>
|
||||
{translate('MoreControlCFText')}
|
||||
<Link to='/settings/customformats'> {translate('CustomFormat')} </Link>
|
||||
</div>
|
||||
<InlineMarkdown className={styles.addCustomFormatMessage} data={translate('WantMoreControlAddACustomFormat')} />
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ class QualityProfiles extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('QualityProfiles')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadQualityProfiles')}
|
||||
errorMessage={translate('QualityProfilesLoadError')}
|
||||
{...otherProps}c={true}
|
||||
>
|
||||
<div className={styles.qualityProfiles}>
|
||||
|
||||
@@ -41,7 +41,7 @@ function EditReleaseProfileModalContent(props) {
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>
|
||||
{id ? translate('Edit Release Profile') : translate('Add Release Profile')}
|
||||
{id ? translate('EditReleaseProfile') : translate('AddReleaseProfile')}
|
||||
</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
@@ -54,7 +54,7 @@ function EditReleaseProfileModalContent(props) {
|
||||
type={inputTypes.TEXT}
|
||||
name="name"
|
||||
{...name}
|
||||
placeholder="Optional name"
|
||||
placeholder={translate('OptionalName')}
|
||||
canEdit={true}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -66,7 +66,7 @@ function EditReleaseProfileModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="enabled"
|
||||
helpText="Check to enable release profile"
|
||||
helpText={translate('EnableProfileHelpText')}
|
||||
{...enabled}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
@@ -80,9 +80,9 @@ function EditReleaseProfileModalContent(props) {
|
||||
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={translate('RequiredRestrictionPlaceHolder')}
|
||||
placeholder={translate('AddNewRestriction')}
|
||||
delimiters={tagInputDelimiters}
|
||||
canEdit={true}
|
||||
onChange={onInputChange}
|
||||
@@ -97,9 +97,9 @@ function EditReleaseProfileModalContent(props) {
|
||||
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={translate('IgnoredPlaceHolder')}
|
||||
placeholder={translate('AddNewRestriction')}
|
||||
delimiters={tagInputDelimiters}
|
||||
canEdit={true}
|
||||
onChange={onInputChange}
|
||||
@@ -112,8 +112,8 @@ function EditReleaseProfileModalContent(props) {
|
||||
<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}
|
||||
@@ -126,7 +126,7 @@ function EditReleaseProfileModalContent(props) {
|
||||
<FormInputGroup
|
||||
type={inputTypes.TAG}
|
||||
name="tags"
|
||||
helpText="Release profiles will apply to movies with at least one matching tag. Leave blank to apply to all movies"
|
||||
helpText={translate('ReleaseProfileTagMovieHelpText')}
|
||||
{...tags}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
|
||||
@@ -5,6 +5,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';
|
||||
|
||||
@@ -137,7 +138,7 @@ class ReleaseProfile extends Component {
|
||||
kind={kinds.DISABLED}
|
||||
outline={true}
|
||||
>
|
||||
Disabled
|
||||
{translate('Disabled')}
|
||||
</Label>
|
||||
}
|
||||
|
||||
@@ -162,9 +163,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}
|
||||
/>
|
||||
|
||||
@@ -150,13 +150,13 @@ class QualityDefinition extends Component {
|
||||
} = this.state;
|
||||
|
||||
const minBytes = minSize * 1024 * 1024;
|
||||
const minSixty = `${formatBytes(minBytes * 60)}/h`;
|
||||
const minSixty = `${formatBytes(minBytes * 60)}/${translate('HourShorthand')}`;
|
||||
|
||||
const preferredBytes = preferredSize * 1024 * 1024;
|
||||
const preferredSixty = preferredBytes ? `${formatBytes(preferredBytes * 60)}/h` : translate('Unlimited');
|
||||
const preferredSixty = preferredBytes ? `${formatBytes(preferredBytes * 60)}/${translate('HourShorthand')}` : translate('Unlimited');
|
||||
|
||||
const maxBytes = maxSize && maxSize * 1024 * 1024;
|
||||
const maxSixty = maxBytes ? `${formatBytes(maxBytes * 60)}/h` : translate('Unlimited');
|
||||
const maxSixty = maxBytes ? `${formatBytes(maxBytes * 60)}/${translate('HourShorthand')}` : translate('Unlimited');
|
||||
|
||||
return (
|
||||
<div className={styles.qualityDefinition}>
|
||||
|
||||
@@ -20,13 +20,13 @@ function QualityDefinitionLimits(props) {
|
||||
return (
|
||||
<div>
|
||||
<div>
|
||||
{translate('MinutesSixty', [sixty])}
|
||||
{translate('MinutesSixty', { sixty })}
|
||||
</div>
|
||||
<div>
|
||||
{translate('MinutesNinety', [ninety])}
|
||||
{translate('MinutesNinety', { ninety })}
|
||||
</div>
|
||||
<div>
|
||||
{translate('MinutesHundredTwenty', [hundredTwenty])}
|
||||
{translate('MinutesHundredTwenty', { hundredTwenty })}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -21,7 +21,7 @@ class QualityDefinitions extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('QualityDefinitions')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadQualityDefinitions')}
|
||||
errorMessage={translate('QualityDefinitionsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.header}>
|
||||
|
||||
@@ -84,11 +84,11 @@ function Settings() {
|
||||
className={styles.link}
|
||||
to="/settings/importlists"
|
||||
>
|
||||
{translate('Lists')}
|
||||
{translate('ImportLists')}
|
||||
</Link>
|
||||
|
||||
<div className={styles.summary}>
|
||||
{translate('ListsSettingsSummary')}
|
||||
{translate('ImportListsSettingsSummary')}
|
||||
</div>
|
||||
|
||||
<Link
|
||||
@@ -110,7 +110,7 @@ function Settings() {
|
||||
</Link>
|
||||
|
||||
<div className={styles.summary}>
|
||||
{translate('MetadataSettingsSummary')}
|
||||
{translate('MetadataSettingsMovieSummary')}
|
||||
</div>
|
||||
|
||||
<Link
|
||||
@@ -139,11 +139,11 @@ function Settings() {
|
||||
className={styles.link}
|
||||
to="/settings/ui"
|
||||
>
|
||||
{translate('UI')}
|
||||
{translate('Ui')}
|
||||
</Link>
|
||||
|
||||
<div className={styles.summary}>
|
||||
{translate('UISettingsSummary')}
|
||||
{translate('UiSettingsSummary')}
|
||||
</div>
|
||||
</PageContentBody>
|
||||
</PageContent>
|
||||
|
||||
@@ -58,7 +58,7 @@ export default function AutoTaggings() {
|
||||
return (
|
||||
<FieldSet legend={translate('AutoTagging')}>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadAutoTagging')}
|
||||
errorMessage={translate('AutoTaggingLoadError')}
|
||||
error={error}
|
||||
isFetching={isFetching}
|
||||
isPopulated={isPopulated}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import Alert from 'Components/Alert';
|
||||
import Card from 'Components/Card';
|
||||
import FieldSet from 'Components/FieldSet';
|
||||
import Form from 'Components/Form/Form';
|
||||
@@ -122,9 +123,9 @@ export default function EditAutoTaggingModalContent(props) {
|
||||
|
||||
{
|
||||
!isFetching && !!error ?
|
||||
<div>
|
||||
{'Unable to add a new auto tag, please try again.'}
|
||||
</div> :
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddAutoTagError')}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -55,9 +55,9 @@ export default function AddSpecificationModalContent(props) {
|
||||
|
||||
{
|
||||
!isSchemaFetching && !!schemaError ?
|
||||
<div>
|
||||
{'Unable to add a new condition, please try again.'}
|
||||
</div> :
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('AddConditionError')}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ export default function AddSpecificationModalContent(props) {
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{'Radarr supports the follow properties for auto tagging rules'}
|
||||
{translate('SupportedAutoTaggingProperties')}
|
||||
</div>
|
||||
</Alert>
|
||||
|
||||
|
||||
+8
-7
@@ -8,8 +8,8 @@ import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||
import FormLabel from 'Components/Form/FormLabel';
|
||||
import ProviderFieldFormGroup from 'Components/Form/ProviderFieldFormGroup';
|
||||
import Button from 'Components/Link/Button';
|
||||
import Link from 'Components/Link/Link';
|
||||
import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton';
|
||||
import InlineMarkdown from 'Components/Markdown/InlineMarkdown';
|
||||
import ModalBody from 'Components/Modal/ModalBody';
|
||||
import ModalContent from 'Components/Modal/ModalContent';
|
||||
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||
@@ -83,12 +83,13 @@ function EditSpecificationModalContent(props) {
|
||||
fields && fields.some((x) => x.label === 'Regular Expression') &&
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
<div dangerouslySetInnerHTML={{ __html: 'This condition matches using Regular Expressions. Note that the characters <code>\\^$.|?*+()[{</code> have special meanings and need escaping with a <code>\\</code>' }} />
|
||||
{'More details'} <Link to="https://www.regular-expressions.info/tutorial.html">{'Here'}</Link>
|
||||
<InlineMarkdown data={translate('ConditionUsingRegularExpressions')} />
|
||||
</div>
|
||||
<div>
|
||||
{'Regular expressions can be tested '}
|
||||
<Link to="http://regexstorm.net/tester">Here</Link>
|
||||
<InlineMarkdown data={translate('RegularExpressionsTutorialLink')} />
|
||||
</div>
|
||||
<div>
|
||||
<InlineMarkdown data={translate('RegularExpressionsCanBeTested')} />
|
||||
</div>
|
||||
</Alert>
|
||||
}
|
||||
@@ -130,7 +131,7 @@ function EditSpecificationModalContent(props) {
|
||||
type={inputTypes.CHECK}
|
||||
name="negate"
|
||||
{...negate}
|
||||
helpText={translate('AutoTaggingNegateHelpText', [implementationName])}
|
||||
helpText={translate('AutoTaggingNegateHelpText', { implementationName })}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
@@ -144,7 +145,7 @@ function EditSpecificationModalContent(props) {
|
||||
type={inputTypes.CHECK}
|
||||
name="required"
|
||||
{...required}
|
||||
helpText={translate('AutoTaggingRequiredHelpText', [implementationName])}
|
||||
helpText={translate('AutoTaggingRequiredHelpText', { implementationName })}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
|
||||
@@ -5,6 +5,7 @@ import Label from 'Components/Label';
|
||||
import IconButton from 'Components/Link/IconButton';
|
||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import EditSpecificationModal from './EditSpecificationModal';
|
||||
import styles from './Specification.css';
|
||||
|
||||
@@ -60,7 +61,7 @@ export default function Specification(props) {
|
||||
|
||||
<IconButton
|
||||
className={styles.cloneButton}
|
||||
title="Clone"
|
||||
title={translate('Clone')}
|
||||
name={icons.CLONE}
|
||||
onPress={onClonePress}
|
||||
/>
|
||||
@@ -74,7 +75,7 @@ export default function Specification(props) {
|
||||
{
|
||||
negate ?
|
||||
<Label kind={kinds.DANGER}>
|
||||
Negated
|
||||
{translate('Negated')}
|
||||
</Label> :
|
||||
null
|
||||
}
|
||||
@@ -82,7 +83,7 @@ export default function Specification(props) {
|
||||
{
|
||||
required ?
|
||||
<Label kind={kinds.SUCCESS}>
|
||||
Required
|
||||
{translate('Required')}
|
||||
</Label> :
|
||||
null
|
||||
}
|
||||
@@ -98,9 +99,9 @@ export default function Specification(props) {
|
||||
<ConfirmModal
|
||||
isOpen={isDeleteModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title="Delete Specification"
|
||||
message={`Are you sure you want to delete specification ${name} ?`}
|
||||
confirmLabel="Delete"
|
||||
title={translate('DeleteSpecification')}
|
||||
message={translate('DeleteSpecificationHelpText', { name })}
|
||||
confirmLabel={translate('Delete')}
|
||||
onConfirm={onConfirmDelete}
|
||||
onCancel={onDeleteModalClose}
|
||||
/>
|
||||
|
||||
@@ -15,13 +15,13 @@ function TagDetailsDelayProfile(props) {
|
||||
return (
|
||||
<div>
|
||||
<div>
|
||||
Protocol: {titleCase(preferredProtocol)}
|
||||
{titleCase(translate('DelayProfileProtocol', { preferredProtocol }))}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{
|
||||
enableUsenet ?
|
||||
translate('UsenetDelayTime', [usenetDelay]) :
|
||||
translate('UsenetDelayTime', { usenetDelay }) :
|
||||
translate('UsenetDisabled')
|
||||
}
|
||||
</div>
|
||||
@@ -29,7 +29,7 @@ function TagDetailsDelayProfile(props) {
|
||||
<div>
|
||||
{
|
||||
enableTorrent ?
|
||||
translate('TorrentDelayTime', [torrentDelay]) :
|
||||
translate('TorrentDelayTime', { torrentDelay }) :
|
||||
translate('TorrentsDisabled')
|
||||
}
|
||||
</div>
|
||||
|
||||
@@ -104,6 +104,22 @@ function TagDetailsModalContent(props) {
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
importLists.length ?
|
||||
<FieldSet legend={translate('ImportLists')}>
|
||||
{
|
||||
importLists.map((item) => {
|
||||
return (
|
||||
<div key={item.id}>
|
||||
{item.name}
|
||||
</div>
|
||||
);
|
||||
})
|
||||
}
|
||||
</FieldSet> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
releaseProfiles.length ?
|
||||
<FieldSet legend={translate('ReleaseProfiles')}>
|
||||
@@ -167,22 +183,6 @@ function TagDetailsModalContent(props) {
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
importLists.length ?
|
||||
<FieldSet legend={translate('Lists')}>
|
||||
{
|
||||
importLists.map((item) => {
|
||||
return (
|
||||
<div key={item.id}>
|
||||
{item.name}
|
||||
</div>
|
||||
);
|
||||
})
|
||||
}
|
||||
</FieldSet> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
downloadClients.length ?
|
||||
<FieldSet legend={translate('DownloadClients')}>
|
||||
|
||||
@@ -88,50 +88,55 @@ class Tag extends Component {
|
||||
isTagUsed ?
|
||||
<div>
|
||||
<TagInUse
|
||||
label="movie"
|
||||
label={translate('Movie')}
|
||||
labelPlural={translate('Movies')}
|
||||
count={movieIds.length}
|
||||
/>
|
||||
|
||||
<TagInUse
|
||||
label="delay profile"
|
||||
label={translate('DelayProfile')}
|
||||
labelPlural={translate('DelayProfiles')}
|
||||
count={delayProfileIds.length}
|
||||
/>
|
||||
|
||||
<TagInUse
|
||||
label="import list"
|
||||
label={translate('ImportList')}
|
||||
labelPlural={translate('ImportLists')}
|
||||
count={importListIds.length}
|
||||
/>
|
||||
|
||||
<TagInUse
|
||||
label="connection"
|
||||
label={translate('Connection')}
|
||||
labelPlural={translate('Connections')}
|
||||
count={notificationIds.length}
|
||||
/>
|
||||
|
||||
<TagInUse
|
||||
label="release profile"
|
||||
count={releaseProfileIds.length}
|
||||
/>
|
||||
|
||||
<TagInUse
|
||||
label="indexer"
|
||||
label={translate('Indexer')}
|
||||
labelPlural={translate('Indexers')}
|
||||
count={indexerIds.length}
|
||||
/>
|
||||
|
||||
<TagInUse
|
||||
label="download client"
|
||||
label={translate('DownloadClient')}
|
||||
labelPlural={translate('DownloadClients')}
|
||||
count={downloadClientIds.length}
|
||||
/>
|
||||
|
||||
<TagInUse
|
||||
label="auto tagging"
|
||||
label={translate('AutoTagging')}
|
||||
count={autoTagIds.length}
|
||||
shouldPluralize={false}
|
||||
/>
|
||||
</div> :
|
||||
null
|
||||
}
|
||||
|
||||
{!isTagUsed && <div>{translate('NoLinks')}</div>}
|
||||
{
|
||||
!isTagUsed &&
|
||||
<div>
|
||||
{translate('NoLinks')}
|
||||
</div>
|
||||
}
|
||||
|
||||
<TagDetailsModal
|
||||
label={label}
|
||||
|
||||
@@ -4,31 +4,31 @@ import React from 'react';
|
||||
export default function TagInUse(props) {
|
||||
const {
|
||||
label,
|
||||
count,
|
||||
shouldPluralize = true
|
||||
labelPlural,
|
||||
count
|
||||
} = props;
|
||||
|
||||
if (count === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (count > 1 && shouldPluralize) {
|
||||
if (count > 1 && labelPlural ) {
|
||||
return (
|
||||
<div>
|
||||
{count} {label}s
|
||||
{count} {labelPlural.toLowerCase()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
{count} {label}
|
||||
{count} {label.toLowerCase()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
TagInUse.propTypes = {
|
||||
label: PropTypes.string.isRequired,
|
||||
count: PropTypes.number.isRequired,
|
||||
shouldPluralize: PropTypes.bool
|
||||
labelPlural: PropTypes.string,
|
||||
count: PropTypes.number.isRequired
|
||||
};
|
||||
|
||||
@@ -27,7 +27,7 @@ function Tags(props) {
|
||||
legend={translate('Tags')}
|
||||
>
|
||||
<PageSectionContent
|
||||
errorMessage={translate('UnableToLoadTags')}
|
||||
errorMessage={translate('TagsLoadError')}
|
||||
{...otherProps}
|
||||
>
|
||||
<div className={styles.tags}>
|
||||
|
||||
@@ -84,7 +84,7 @@ class UISettings extends Component {
|
||||
const uiLanguages = languages.filter((item) => item.value !== 'Original');
|
||||
|
||||
return (
|
||||
<PageContent title={translate('UISettings')}>
|
||||
<PageContent title={translate('UiSettings')}>
|
||||
<SettingsToolbarConnector
|
||||
{...otherProps}
|
||||
onSavePress={onSavePress}
|
||||
@@ -92,26 +92,28 @@ class UISettings extends Component {
|
||||
|
||||
<PageContentBody>
|
||||
{
|
||||
isFetching &&
|
||||
<LoadingIndicator />
|
||||
isFetching ?
|
||||
<LoadingIndicator /> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
!isFetching && error &&
|
||||
!isFetching && error ?
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('UnableToLoadUISettings')}
|
||||
</Alert>
|
||||
{translate('UiSettingsLoadError')}
|
||||
</Alert> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
hasSettings && !isFetching && !error &&
|
||||
hasSettings && !isFetching && !error ?
|
||||
<Form
|
||||
id="uiSettings"
|
||||
{...otherProps}
|
||||
>
|
||||
<FieldSet legend={translate('Calendar')}>
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsFirstDayOfWeek')}</FormLabel>
|
||||
<FormLabel>{translate('FirstDayOfWeek')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
@@ -123,14 +125,14 @@ class UISettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsWeekColumnHeader')}</FormLabel>
|
||||
<FormLabel>{translate('WeekColumnHeader')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="calendarWeekColumnHeader"
|
||||
values={weekColumnOptions}
|
||||
onChange={onInputChange}
|
||||
helpText={translate('SettingsWeekColumnHeaderHelpText')}
|
||||
helpText={translate('WeekColumnHeaderHelpText')}
|
||||
{...settings.calendarWeekColumnHeader}
|
||||
/>
|
||||
</FormGroup>
|
||||
@@ -138,7 +140,7 @@ class UISettings extends Component {
|
||||
|
||||
<FieldSet legend={translate('Movies')}>
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsRuntimeFormat')}</FormLabel>
|
||||
<FormLabel>{translate('RuntimeFormat')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
@@ -150,9 +152,11 @@ class UISettings extends Component {
|
||||
</FormGroup>
|
||||
</FieldSet>
|
||||
|
||||
<FieldSet legend={translate('Dates')}>
|
||||
<FieldSet
|
||||
legend={translate('Dates')}
|
||||
>
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsShortDateFormat')}</FormLabel>
|
||||
<FormLabel>{translate('ShortDateFormat')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
@@ -164,7 +168,7 @@ class UISettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsLongDateFormat')}</FormLabel>
|
||||
<FormLabel>{translate('LongDateFormat')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
@@ -176,7 +180,7 @@ class UISettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsTimeFormat')}</FormLabel>
|
||||
<FormLabel>{translate('TimeFormat')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
@@ -188,24 +192,26 @@ class UISettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsShowRelativeDates')}</FormLabel>
|
||||
<FormLabel>{translate('ShowRelativeDates')}</FormLabel>
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="showRelativeDates"
|
||||
helpText={translate('SettingsShowRelativeDatesHelpText')}
|
||||
helpText={translate('ShowRelativeDatesHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.showRelativeDates}
|
||||
/>
|
||||
</FormGroup>
|
||||
</FieldSet>
|
||||
|
||||
<FieldSet legend={translate('Style')}>
|
||||
<FieldSet
|
||||
legend={translate('Style')}
|
||||
>
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsTheme')}</FormLabel>
|
||||
<FormLabel>{translate('Theme')}</FormLabel>
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="theme"
|
||||
helpText={translate('SettingsThemeHelpText')}
|
||||
helpText={translate('ThemeHelpText')}
|
||||
values={themeOptions}
|
||||
onChange={onInputChange}
|
||||
{...settings.theme}
|
||||
@@ -213,11 +219,11 @@ class UISettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('SettingsEnableColorImpairedMode')}</FormLabel>
|
||||
<FormLabel>{translate('EnableColorImpairedMode')}</FormLabel>
|
||||
<FormInputGroup
|
||||
type={inputTypes.CHECK}
|
||||
name="enableColorImpairedMode"
|
||||
helpText={translate('SettingsEnableColorImpairedModeHelpText')}
|
||||
helpText={translate('EnableColorImpairedModeHelpText')}
|
||||
onChange={onInputChange}
|
||||
{...settings.enableColorImpairedMode}
|
||||
/>
|
||||
@@ -239,13 +245,13 @@ class UISettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{translate('UILanguage')}</FormLabel>
|
||||
<FormLabel>{translate('UiLanguage')}</FormLabel>
|
||||
<FormInputGroup
|
||||
type={inputTypes.LANGUAGE_SELECT}
|
||||
name="uiLanguage"
|
||||
values={uiLanguages}
|
||||
helpText={translate('UILanguageHelpText')}
|
||||
helpTextWarning={translate('UILanguageHelpTextWarning')}
|
||||
helpText={translate('UiLanguageHelpText')}
|
||||
helpTextWarning={translate('BrowserReloadRequired')}
|
||||
onChange={onInputChange}
|
||||
{...settings.uiLanguage}
|
||||
errors={
|
||||
@@ -258,7 +264,8 @@ class UISettings extends Component {
|
||||
/>
|
||||
</FormGroup>
|
||||
</FieldSet>
|
||||
</Form>
|
||||
</Form> :
|
||||
null
|
||||
}
|
||||
</PageContentBody>
|
||||
</PageContent>
|
||||
|
||||
Reference in New Issue
Block a user