Localization framework

This commit is contained in:
nitsua
2021-04-16 22:01:47 -04:00
committed by ta264
parent 144134446d
commit d87bf5ae63
196 changed files with 3074 additions and 924 deletions
@@ -6,6 +6,7 @@ import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
import { icons } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import IndexersConnector from './Indexers/IndexersConnector';
import IndexerOptionsConnector from './Options/IndexerOptionsConnector';
@@ -57,7 +58,7 @@ class IndexerSettings extends Component {
} = this.state;
return (
<PageContent title="Indexer Settings">
<PageContent title={translate('IndexerSettings')}>
<SettingsToolbarConnector
isSaving={isSaving}
hasPendingChanges={hasPendingChanges}
@@ -66,7 +67,7 @@ class IndexerSettings extends Component {
<PageToolbarSeparator />
<PageToolbarButton
label="Test All Indexers"
label={translate('TestAllIndexers')}
iconName={icons.TEST}
isSpinning={isTestingAll}
onPress={dispatchTestAllIndexers}
@@ -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 AddIndexerItem from './AddIndexerItem';
import styles from './AddIndexerModalContent.css';
@@ -42,7 +43,9 @@ class AddIndexerModalContent extends Component {
{
!isSchemaFetching && !!schemaError &&
<div>Unable to add a new indexer, please try again.</div>
<div>
{translate('UnableToAddANewIndexerPleaseTryAgain')}
</div>
}
{
@@ -50,11 +53,15 @@ class AddIndexerModalContent extends Component {
<div>
<Alert kind={kinds.INFO}>
<div>Readarr supports any indexer that uses the Newznab standard, as well as other indexers listed below.</div>
<div>For more information on the individual indexers, click on the info buttons.</div>
<div>
{translate('ReadarrSupportsAnyIndexerThatUsesTheNewznabStandardAsWellAsOtherIndexersListedBelow')}
</div>
<div>
{translate('ForMoreInformationOnTheIndividualIndexersClickOnTheInfoButtons')}
</div>
</Alert>
<FieldSet legend="Usenet">
<FieldSet legend={translate('Usenet')}>
<div className={styles.indexers}>
{
usenetIndexers.map((indexer) => {
@@ -71,7 +78,7 @@ class AddIndexerModalContent extends Component {
</div>
</FieldSet>
<FieldSet legend="Torrents">
<FieldSet legend={translate('Torrents')}>
<div className={styles.indexers}>
{
torrentIndexers.map((indexer) => {
@@ -13,6 +13,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './EditIndexerModalContent.css';
function EditIndexerModalContent(props) {
@@ -60,14 +61,18 @@ function EditIndexerModalContent(props) {
{
!isFetching && !!error &&
<div>Unable to add a new indexer, please try again.</div>
<div>
{translate('UnableToAddANewIndexerPleaseTryAgain')}
</div>
}
{
!isFetching && !error &&
<Form {...otherProps}>
<FormGroup>
<FormLabel>Name</FormLabel>
<FormLabel>
{translate('Name')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
@@ -78,12 +83,14 @@ function EditIndexerModalContent(props) {
</FormGroup>
<FormGroup>
<FormLabel>Enable RSS</FormLabel>
<FormLabel>
{translate('EnableRSS')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="enableRss"
helpTextWarning={supportsRss.value ? undefined : 'RSS is not supported with this indexer'}
helpTextWarning={supportsRss.value ? undefined : translate('SupportsRssvalueRSSIsNotSupportedWithThisIndexer')}
isDisabled={!supportsRss.value}
{...enableRss}
onChange={onInputChange}
@@ -91,13 +98,15 @@ function EditIndexerModalContent(props) {
</FormGroup>
<FormGroup>
<FormLabel>Enable Automatic Search</FormLabel>
<FormLabel>
{translate('EnableAutomaticSearch')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="enableAutomaticSearch"
helpText={supportsSearch.value ? 'Will be used when automatic searches are performed via the UI or by Readarr' : undefined}
helpTextWarning={supportsSearch.value ? undefined : 'Search is not supported with this indexer'}
helpText={supportsSearch.value ? translate('SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr') : undefined}
helpTextWarning={supportsSearch.value ? undefined : translate('SupportsSearchvalueSearchIsNotSupportedWithThisIndexer')}
isDisabled={!supportsSearch.value}
{...enableAutomaticSearch}
onChange={onInputChange}
@@ -105,13 +114,15 @@ function EditIndexerModalContent(props) {
</FormGroup>
<FormGroup>
<FormLabel>Enable Interactive Search</FormLabel>
<FormLabel>
{translate('EnableInteractiveSearch')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="enableInteractiveSearch"
helpText={supportsSearch.value ? 'Will be used when interactive search is used' : undefined}
helpTextWarning={supportsSearch.value ? undefined : 'Search is not supported with this indexer'}
helpText={supportsSearch.value ? translate('SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed') : undefined}
helpTextWarning={supportsSearch.value ? undefined : translate('SupportsSearchvalueSearchIsNotSupportedWithThisIndexer')}
isDisabled={!supportsSearch.value}
{...enableInteractiveSearch}
onChange={onInputChange}
@@ -136,12 +147,14 @@ function EditIndexerModalContent(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Indexer Priority</FormLabel>
<FormLabel>
{translate('IndexerPriority')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="priority"
helpText="Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25."
helpText={translate('PriorityHelpText')}
min={1}
max={50}
{...priority}
@@ -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 EditIndexerModalConnector from './EditIndexerModalConnector';
import styles from './Indexer.css';
@@ -86,7 +87,7 @@ class Indexer extends Component {
<IconButton
className={styles.cloneButton}
title="Clone Profile"
title={translate('CloneProfile')}
name={icons.CLONE}
onPress={this.onCloneIndexerPress}
/>
@@ -142,9 +143,9 @@ class Indexer extends Component {
<ConfirmModal
isOpen={this.state.isDeleteIndexerModalOpen}
kind={kinds.DANGER}
title="Delete Indexer"
message={`Are you sure you want to delete the indexer '${name}'?`}
confirmLabel="Delete"
title={translate('DeleteIndexer')}
message={translate('DeleteIndexerMessageText', [name])}
confirmLabel={translate('Delete')}
onConfirm={this.onConfirmDeleteIndexer}
onCancel={this.onDeleteIndexerModalClose}
/>
@@ -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 AddIndexerModal from './AddIndexerModal';
import EditIndexerModalConnector from './EditIndexerModalConnector';
import Indexer from './Indexer';
@@ -66,9 +67,9 @@ class Indexers extends Component {
const showPriority = items.some((index) => index.priority !== 25);
return (
<FieldSet legend="Indexers">
<FieldSet legend={translate('Indexers')}>
<PageSectionContent
errorMessage="Unable to load Indexers"
errorMessage={translate('UnableToLoadIndexers')}
{...otherProps}
>
<div className={styles.indexers}>
@@ -7,6 +7,7 @@ import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function IndexerOptions(props) {
const {
@@ -19,7 +20,7 @@ function IndexerOptions(props) {
} = props;
return (
<FieldSet legend="Options">
<FieldSet legend={translate('Options')}>
{
isFetching &&
<LoadingIndicator />
@@ -27,49 +28,57 @@ function IndexerOptions(props) {
{
!isFetching && error &&
<div>Unable to load indexer options</div>
<div>
{translate('UnableToLoadIndexerOptions')}
</div>
}
{
hasSettings && !isFetching && !error &&
<Form>
<FormGroup>
<FormLabel>Minimum Age</FormLabel>
<FormLabel>
{translate('MinimumAge')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="minimumAge"
min={0}
unit="minutes"
helpText="Usenet only: Minimum age in minutes of NZBs before they are grabbed. Use this to give new releases time to propagate to your usenet provider."
helpText={translate('MinimumAgeHelpText')}
onChange={onInputChange}
{...settings.minimumAge}
/>
</FormGroup>
<FormGroup>
<FormLabel>Maximum Size</FormLabel>
<FormLabel>
{translate('MaximumSize')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="maximumSize"
min={0}
unit="MB"
helpText="Maximum size for a release to be grabbed in MB. Set to zero to set to unlimited."
helpText={translate('MaximumSizeHelpText')}
onChange={onInputChange}
{...settings.maximumSize}
/>
</FormGroup>
<FormGroup>
<FormLabel>Retention</FormLabel>
<FormLabel>
{translate('Retention')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="retention"
min={0}
unit="days"
helpText="Usenet only: Set to zero to set for unlimited retention"
helpText={translate('RetentionHelpText')}
onChange={onInputChange}
{...settings.retention}
/>
@@ -79,15 +88,17 @@ function IndexerOptions(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>RSS Sync Interval</FormLabel>
<FormLabel>
{translate('RSSSyncInterval')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="rssSyncInterval"
min={0}
unit="minutes"
helpText="Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)"
helpTextWarning="This will apply to all indexers, please follow the rules set forth by them"
helpText={translate('RssSyncIntervalHelpText')}
helpTextWarning={translate('ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem')}
helpLink="https://wiki.servarr.com/Readarr_FAQ#How_does_Readarr_work"
onChange={onInputChange}
{...settings.rssSyncInterval}