1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2026-04-25 22:46:31 -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
@@ -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
@@ -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 CustomFormat from './CustomFormat';
import EditCustomFormatModalConnector from './EditCustomFormatModalConnector';
import styles from './CustomFormats.css';
@@ -58,9 +59,9 @@ class CustomFormats extends Component {
} = this.props;
return (
<FieldSet legend="Custom Formats">
<FieldSet legend={translate('CustomFormats')}>
<PageSectionContent
errorMessage="Unable to load custom formats"
errorMessage={translate('CustomFormatsLoadError')}
{...otherProps}c={true}
>
<div className={styles.customFormats}>
@@ -15,6 +15,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { icons, inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import ImportCustomFormatModal from './ImportCustomFormatModal';
import AddSpecificationModal from './Specifications/AddSpecificationModal';
import EditSpecificationModalConnector from './Specifications/EditSpecificationModalConnector';
@@ -99,7 +100,7 @@ class EditCustomFormatModalContent extends Component {
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{id ? 'Edit Custom Format' : 'Add Custom Format'}
{id ? translate('EditCustomFormat') : translate('AddCustomFormat')}
</ModalHeader>
<ModalBody>
@@ -112,7 +113,7 @@ class EditCustomFormatModalContent extends Component {
{
!isFetching && !!error &&
<div>
{'Unable to add a new custom format, please try again.'}
{translate('AddCustomFormatError')}
</div>
}
@@ -124,7 +125,7 @@ class EditCustomFormatModalContent extends Component {
>
<FormGroup>
<FormLabel>
Name
{translate('Name')}
</FormLabel>
<FormInputGroup
@@ -136,19 +137,19 @@ class EditCustomFormatModalContent extends Component {
</FormGroup>
<FormGroup>
<FormLabel>{'Include Custom Format when Renaming'}</FormLabel>
<FormLabel>{translate('IncludeCustomFormatWhenRenaming')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="includeCustomFormatWhenRenaming"
helpText={'Include in {Custom Formats} renaming format'}
helpText={translate('IncludeCustomFormatWhenRenamingHelpText')}
{...includeCustomFormatWhenRenaming}
onChange={onInputChange}
/>
</FormGroup>
</Form>
<FieldSet legend={'Conditions'}>
<FieldSet legend={translate('Conditions')}>
<div className={styles.customFormats}>
{
specifications.map((tag) => {
@@ -205,7 +206,7 @@ class EditCustomFormatModalContent extends Component {
kind={kinds.DANGER}
onPress={onDeleteCustomFormatPress}
>
Delete
{translate('Delete')}
</Button>
}
@@ -213,14 +214,14 @@ class EditCustomFormatModalContent extends Component {
className={styles.deleteButton}
onPress={this.onImportPress}
>
Import
{translate('Import')}
</Button>
</div>
<Button
onPress={onModalClose}
>
Cancel
{translate('Cancel')}
</Button>
<SpinnerErrorButton
@@ -228,7 +229,7 @@ class EditCustomFormatModalContent extends Component {
error={saveError}
onPress={onSavePress}
>
Save
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>
@@ -8,6 +8,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './ExportCustomFormatModalContent.css';
class ExportCustomFormatModalContent extends Component {
@@ -28,7 +29,7 @@ class ExportCustomFormatModalContent extends Component {
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
Export Custom Format
{translate('ExportCustomFormat')}
</ModalHeader>
<ModalBody>
@@ -41,7 +42,7 @@ class ExportCustomFormatModalContent extends Component {
{
!isFetching && !!error &&
<div>
Unable to load custom formats
{translate('CustomFormatsLoadError')}
</div>
}
@@ -59,13 +60,13 @@ class ExportCustomFormatModalContent extends Component {
<ClipboardButton
className={styles.button}
value={json}
title="Copy to clipboard"
title={translate('CopyToClipboard')}
kind={kinds.DEFAULT}
/>
<Button
onPress={onModalClose}
>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>
@@ -12,6 +12,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './ImportCustomFormatModalContent.css';
class ImportCustomFormatModalContent extends Component {
@@ -82,7 +83,7 @@ class ImportCustomFormatModalContent extends Component {
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
Import Custom Format
{translate('ImportCustomFormat')}
</ModalHeader>
<ModalBody>
@@ -95,7 +96,7 @@ class ImportCustomFormatModalContent extends Component {
{
!isFetching && !!error &&
<div>
Unable to load custom formats
{translate('CustomFormatsLoadError')}
</div>
}
@@ -104,7 +105,7 @@ class ImportCustomFormatModalContent extends Component {
<Form>
<FormGroup size={sizes.MEDIUM}>
<FormLabel>
Custom Format JSON
{translate('CustomFormatJSON')}
</FormLabel>
<FormInputGroup
key={0}
@@ -125,14 +126,14 @@ class ImportCustomFormatModalContent extends Component {
<Button
onPress={onModalClose}
>
Cancel
{translate('Cancel')}
</Button>
<SpinnerErrorButton
onPress={this.onImportPress}
isSpinning={isSpinning}
error={parseError}
>
Import
{translate('Import')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>
@@ -6,6 +6,7 @@ import { createSelector } from 'reselect';
import { clearPendingChanges } from 'Store/Actions/baseActions';
import { clearCustomFormatSpecificationPending, deleteAllCustomFormatSpecification, fetchCustomFormatSpecificationSchema, saveCustomFormatSpecification, selectCustomFormatSpecificationSchema, setCustomFormatSpecificationFieldValue, setCustomFormatSpecificationValue, setCustomFormatValue } from 'Store/Actions/settingsActions';
import createProviderSettingsSelector from 'Store/Selectors/createProviderSettingsSelector';
import translate from 'Utilities/String/translate';
import ImportCustomFormatModalContent from './ImportCustomFormatModalContent';
function createMapStateToProps() {
@@ -88,7 +89,9 @@ class ImportCustomFormatModalContentConnector extends Component {
const selectedImplementation = _.find(this.props.specificationSchema, { implementation: spec.implementation });
if (!selectedImplementation) {
throw new Error(`Unknown Custom Format condition '${spec.implementation}'`);
throw new Error(translate('CustomFormatUnknownCondition', {
implementation: spec.implementation
}));
}
this.props.selectCustomFormatSpecificationSchema({ implementation: spec.implementation });
@@ -108,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(`Unknown option '${key}' for condition '${schema.implementationName}'`);
throw new Error(translate('CustomFormatUnknownConditionOption', {
key,
implementation: schema.implementationName
}));
}
this.props.setCustomFormatSpecificationFieldValue({ name: key, value });
@@ -5,6 +5,7 @@ import Link from 'Components/Link/Link';
import Menu from 'Components/Menu/Menu';
import MenuContent from 'Components/Menu/MenuContent';
import { sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AddSpecificationPresetMenuItem from './AddSpecificationPresetMenuItem';
import styles from './AddSpecificationItem.css';
@@ -57,7 +58,7 @@ class AddSpecificationItem extends Component {
size={sizes.SMALL}
onPress={this.onSpecificationSelect}
>
Custom
{translate('Custom')}
</Button>
<Menu className={styles.presetsMenu}>
@@ -65,7 +66,7 @@ class AddSpecificationItem extends Component {
className={styles.presetsMenuButton}
size={sizes.SMALL}
>
Presets
{translate('Presets')}
</Button>
<MenuContent>
@@ -90,7 +91,7 @@ class AddSpecificationItem extends Component {
to={infoLink}
size={sizes.SMALL}
>
More Info
{translate('MoreInfo')}
</Button>
</div>
</div>
@@ -9,6 +9,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import AddSpecificationItem from './AddSpecificationItem';
import styles from './AddSpecificationModalContent.css';
@@ -42,7 +43,7 @@ class AddSpecificationModalContent extends Component {
{
!isSchemaFetching && !!schemaError &&
<div>
{'Unable to add a new condition, please try again.'}
{translate('AddConditionError')}
</div>
}
@@ -52,11 +53,11 @@ class AddSpecificationModalContent extends Component {
<Alert kind={kinds.INFO}>
<div>
{'Sonarr supports custom conditions against the release properties below.'}
{translate('SupportedCustomConditions')}
</div>
<div>
{'Visit the wiki for more details: '}
<Link to="https://wiki.servarr.com/sonarr/settings#custom-formats-2">{'Wiki'}</Link>
{translate('VisitTheWikiForMoreDetails')}
<Link to="https://wiki.servarr.com/sonarr/settings#custom-formats-2">{translate('Wiki')}</Link>
</div>
</Alert>
@@ -81,7 +82,7 @@ class AddSpecificationModalContent extends Component {
<Button
onPress={onModalClose}
>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>
@@ -7,13 +7,14 @@ 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 ModalBody from 'Components/Modal/ModalBody';
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 InlineMarkdown from '../../../../Components/Markdown/InlineMarkdown';
import styles from './EditSpecificationModalContent.css';
function EditSpecificationModalContent(props) {
@@ -40,7 +41,7 @@ function EditSpecificationModalContent(props) {
return (
<ModalContent onModalClose={onCancelPress}>
<ModalHeader>
{`${id ? 'Edit' : 'Add'} Condition - ${implementationName}`}
{`${id ? translate('EditCondition') : translate('AddCondition')} - ${implementationName}`}
</ModalHeader>
<ModalBody>
@@ -48,22 +49,23 @@ function EditSpecificationModalContent(props) {
{...otherProps}
>
{
fields && fields.some((x) => x.label === 'Regular Expression') &&
fields && fields.some((x) => x.label === translate('RegularExpression')) &&
<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>
}
<FormGroup>
<FormLabel>
Name
{translate('Name')}
</FormLabel>
<FormInputGroup
@@ -91,28 +93,28 @@ function EditSpecificationModalContent(props) {
<FormGroup>
<FormLabel>
Negate
{translate('Negate')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="negate"
{...negate}
helpText={`If checked, the custom format will not apply if this ${implementationName} condition matches.`}
helpText={translate('NegateHelpText', { implementationName })}
onChange={onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>
Required
{translate('Required')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="required"
{...required}
helpText={`This ${implementationName} condition must match for the custom format to apply. Otherwise a single ${implementationName} match is sufficient.`}
helpText={translate('RequiredHelpText', { implementationName })}
onChange={onInputChange}
/>
</FormGroup>
@@ -126,21 +128,21 @@ function EditSpecificationModalContent(props) {
kind={kinds.DANGER}
onPress={onDeleteSpecificationPress}
>
Delete
{translate('Delete')}
</Button>
}
<Button
onPress={onCancelPress}
>
Cancel
{translate('Cancel')}
</Button>
<SpinnerErrorButton
isSpinning={false}
onPress={onSavePress}
>
Save
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>
@@ -115,7 +115,7 @@ class Specification extends Component {
isOpen={this.state.isDeleteSpecificationModalOpen}
kind={kinds.DANGER}
title={translate('DeleteCondition')}
message={translate('DeleteConditionMessageText', [name])}
message={translate('DeleteConditionMessageText', { name })}
confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteSpecification}
onCancel={this.onDeleteSpecificationModalClose}