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
@@ -5,6 +5,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function AnalyticSettings(props) {
const {
@@ -17,15 +18,17 @@ function AnalyticSettings(props) {
} = settings;
return (
<FieldSet legend="Analytics">
<FieldSet legend={translate('Analytics')}>
<FormGroup size={sizes.MEDIUM}>
<FormLabel>Send Anonymous Usage Data</FormLabel>
<FormLabel>
{translate('SendAnonymousUsageData')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="analyticsEnabled"
helpText="Send anonymous usage and error information to Readarr's servers. This includes information on your browser, which Readarr WebUI pages you use, error reporting as well as OS and runtime version. We will use this information to prioritize features and bug fixes."
helpTextWarning="Requires restart to take effect"
helpText={translate('AnalyticsEnabledHelpText')}
helpTextWarning={translate('AnalyticsEnabledHelpTextWarning')}
onChange={onInputChange}
{...analyticsEnabled}
/>
@@ -5,6 +5,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function BackupSettings(props) {
const {
@@ -24,17 +25,19 @@ function BackupSettings(props) {
}
return (
<FieldSet legend="Backups">
<FieldSet legend={translate('Backups')}>
<FormGroup
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Folder</FormLabel>
<FormLabel>
{translate('Folder')}
</FormLabel>
<FormInputGroup
type={inputTypes.PATH}
name="backupFolder"
helpText="Relative paths will be under Readarr's AppData directory"
helpText={translate('BackupFolderHelpText')}
onChange={onInputChange}
{...backupFolder}
/>
@@ -44,13 +47,15 @@ function BackupSettings(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Interval</FormLabel>
<FormLabel>
{translate('Interval')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="backupInterval"
unit="days"
helpText="Interval to backup the Readarr DB and settings"
helpText={translate('BackupIntervalHelpText')}
onChange={onInputChange}
{...backupInterval}
/>
@@ -60,13 +65,15 @@ function BackupSettings(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Retention</FormLabel>
<FormLabel>
{translate('Retention')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="backupRetention"
unit="days"
helpText="Automatic backups older than the retention period will be cleaned up automatically"
helpText={translate('BackupRetentionHelpText')}
onChange={onInputChange}
{...backupRetention}
/>
@@ -8,6 +8,7 @@ import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import { kinds } from 'Helpers/Props';
import SettingsToolbarConnector from 'Settings/SettingsToolbarConnector';
import translate from 'Utilities/String/translate';
import AnalyticSettings from './AnalyticSettings';
import BackupSettings from './BackupSettings';
import HostSettings from './HostSettings';
@@ -110,7 +111,7 @@ class GeneralSettings extends Component {
} = this.props;
return (
<PageContent title="General Settings">
<PageContent title={translate('GeneralSettings')}>
<SettingsToolbarConnector
{...otherProps}
/>
@@ -123,7 +124,9 @@ class GeneralSettings extends Component {
{
!isFetching && error &&
<div>Unable to load General settings</div>
<div>
{translate('UnableToLoadGeneralSettings')}
</div>
}
{
@@ -183,12 +186,12 @@ class GeneralSettings extends Component {
<ConfirmModal
isOpen={this.state.isRestartRequiredModalOpen}
kind={kinds.DANGER}
title="Restart Readarr"
title={translate('RestartReadarr')}
message={
`Readarr requires a restart to apply changes, do you want to restart now? ${isWindowsService ? 'Depending which user is running the Readarr service you may need to restart Readarr as admin once before the service will start automatically.' : ''}`
}
cancelLabel="I'll restart later"
confirmLabel="Restart Now"
cancelLabel={translate('IllRestartLater')}
confirmLabel={translate('RestartNow')}
onConfirm={this.onConfirmRestart}
onCancel={this.onCloseRestartRequiredModalOpen}
/>
+38 -21
View File
@@ -5,6 +5,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function HostSettings(props) {
const {
@@ -27,45 +28,51 @@ function HostSettings(props) {
} = settings;
return (
<FieldSet legend="Host">
<FieldSet legend={translate('Host')}>
<FormGroup
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Bind Address</FormLabel>
<FormLabel>
{translate('BindAddress')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="bindAddress"
helpText="Valid IP4 address or '*' for all interfaces"
helpTextWarning="Requires restart to take effect"
helpText={translate('BindAddressHelpText')}
helpTextWarning={translate('BindAddressHelpTextWarning')}
onChange={onInputChange}
{...bindAddress}
/>
</FormGroup>
<FormGroup>
<FormLabel>Port Number</FormLabel>
<FormLabel>
{translate('PortNumber')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="port"
min={1}
max={65535}
helpTextWarning="Requires restart to take effect"
helpTextWarning={translate('PortHelpTextWarning')}
onChange={onInputChange}
{...port}
/>
</FormGroup>
<FormGroup>
<FormLabel>URL Base</FormLabel>
<FormLabel>
{translate('URLBase')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="urlBase"
helpText="For reverse proxy support, default is empty"
helpTextWarning="Requires restart to take effect"
helpText={translate('UrlBaseHelpText')}
helpTextWarning={translate('UrlBaseHelpTextWarning')}
onChange={onInputChange}
{...urlBase}
/>
@@ -76,12 +83,14 @@ function HostSettings(props) {
isAdvanced={true}
size={sizes.MEDIUM}
>
<FormLabel>Enable SSL</FormLabel>
<FormLabel>
{translate('EnableSSL')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="enableSsl"
helpText=" Requires restart running as administrator to take effect"
helpText={translate('EnableSslHelpText')}
onChange={onInputChange}
{...enableSsl}
/>
@@ -93,14 +102,16 @@ function HostSettings(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>SSL Port</FormLabel>
<FormLabel>
{translate('SSLPort')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
name="sslPort"
min={1}
max={65535}
helpTextWarning="Requires restart to take effect"
helpTextWarning={translate('SslPortHelpTextWarning')}
onChange={onInputChange}
{...sslPort}
/>
@@ -114,13 +125,15 @@ function HostSettings(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>SSL Cert Path</FormLabel>
<FormLabel>
{translate('SSLCertPath')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="sslCertPath"
helpText="Path to pfx file"
helpTextWarning="Requires restart to take effect"
helpText={translate('SslCertPathHelpText')}
helpTextWarning={translate('SslCertPathHelpTextWarning')}
onChange={onInputChange}
{...sslCertPath}
/>
@@ -134,13 +147,15 @@ function HostSettings(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>SSL Cert Password</FormLabel>
<FormLabel>
{translate('SSLCertPassword')}
</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
name="sslCertPassword"
helpText="Password for pfx file"
helpTextWarning="Requires restart to take effect"
helpText={translate('SslCertPasswordHelpText')}
helpTextWarning={translate('SslCertPasswordHelpTextWarning')}
onChange={onInputChange}
{...sslCertPassword}
/>
@@ -151,12 +166,14 @@ function HostSettings(props) {
{
isWindows && mode !== 'service' &&
<FormGroup size={sizes.MEDIUM}>
<FormLabel>Open browser on start</FormLabel>
<FormLabel>
{translate('OpenBrowserOnStart')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="launchBrowser"
helpText=" Open a web browser and navigate to Readarr homepage on app start."
helpText={translate('LaunchBrowserHelpText')}
onChange={onInputChange}
{...launchBrowser}
/>
@@ -5,6 +5,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
const logLevelOptions = [
{ key: 'info', value: 'Info' },
@@ -23,15 +24,17 @@ function LoggingSettings(props) {
} = settings;
return (
<FieldSet legend="Logging">
<FieldSet legend={translate('Logging')}>
<FormGroup>
<FormLabel>Log Level</FormLabel>
<FormLabel>
{translate('LogLevel')}
</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="logLevel"
values={logLevelOptions}
helpTextWarning={logLevel.value === 'trace' ? 'Trace logging should only be enabled temporarily' : undefined}
helpTextWarning={logLevel.value === 'trace' ? translate('LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily') : undefined}
onChange={onInputChange}
{...logLevel}
/>
+29 -12
View File
@@ -5,6 +5,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function ProxySettings(props) {
const {
@@ -30,9 +31,11 @@ function ProxySettings(props) {
];
return (
<FieldSet legend="Proxy">
<FieldSet legend={translate('Proxy')}>
<FormGroup size={sizes.MEDIUM}>
<FormLabel>Use Proxy</FormLabel>
<FormLabel>
{translate('UseProxy')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
@@ -46,7 +49,9 @@ function ProxySettings(props) {
proxyEnabled.value &&
<div>
<FormGroup>
<FormLabel>Proxy Type</FormLabel>
<FormLabel>
{translate('ProxyType')}
</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
@@ -58,7 +63,9 @@ function ProxySettings(props) {
</FormGroup>
<FormGroup>
<FormLabel>Hostname</FormLabel>
<FormLabel>
{translate('Hostname')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
@@ -69,7 +76,9 @@ function ProxySettings(props) {
</FormGroup>
<FormGroup>
<FormLabel>Port</FormLabel>
<FormLabel>
{translate('Port')}
</FormLabel>
<FormInputGroup
type={inputTypes.NUMBER}
@@ -82,43 +91,51 @@ function ProxySettings(props) {
</FormGroup>
<FormGroup>
<FormLabel>Username</FormLabel>
<FormLabel>
{translate('Username')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="proxyUsername"
helpText="You only need to enter a username and password if one is required. Leave them blank otherwise."
helpText={translate('ProxyUsernameHelpText')}
onChange={onInputChange}
{...proxyUsername}
/>
</FormGroup>
<FormGroup>
<FormLabel>Password</FormLabel>
<FormLabel>
{translate('Password')}
</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
name="proxyPassword"
helpText="You only need to enter a username and password if one is required. Leave them blank otherwise."
helpText={translate('ProxyPasswordHelpText')}
onChange={onInputChange}
{...proxyPassword}
/>
</FormGroup>
<FormGroup>
<FormLabel>Ignored Addresses</FormLabel>
<FormLabel>
{translate('IgnoredAddresses')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="proxyBypassFilter"
helpText="Use ',' as a separator, and '*.' as a wildcard for subdomains"
helpText={translate('ProxyBypassFilterHelpText')}
onChange={onInputChange}
{...proxyBypassFilter}
/>
</FormGroup>
<FormGroup size={sizes.MEDIUM}>
<FormLabel>Bypass Proxy for Local Addresses</FormLabel>
<FormLabel>
{translate('BypassProxyForLocalAddresses')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
@@ -9,6 +9,7 @@ import Icon from 'Components/Icon';
import ClipboardButton from 'Components/Link/ClipboardButton';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import { icons, inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
const authenticationMethodOptions = [
{ key: 'none', value: 'None' },
@@ -76,15 +77,17 @@ class SecuritySettings extends Component {
const authenticationEnabled = authenticationMethod && authenticationMethod.value !== 'none';
return (
<FieldSet legend="Security">
<FieldSet legend={translate('Security')}>
<FormGroup>
<FormLabel>Authentication</FormLabel>
<FormLabel>
{translate('Authentication')}
</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="authenticationMethod"
values={authenticationMethodOptions}
helpText="Require Username and Password to access Readarr"
helpText={translate('AuthenticationMethodHelpText')}
onChange={onInputChange}
{...authenticationMethod}
/>
@@ -93,7 +96,9 @@ class SecuritySettings extends Component {
{
authenticationEnabled &&
<FormGroup>
<FormLabel>Username</FormLabel>
<FormLabel>
{translate('Username')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
@@ -107,7 +112,9 @@ class SecuritySettings extends Component {
{
authenticationEnabled &&
<FormGroup>
<FormLabel>Password</FormLabel>
<FormLabel>
{translate('Password')}
</FormLabel>
<FormInputGroup
type={inputTypes.PASSWORD}
@@ -119,13 +126,15 @@ class SecuritySettings extends Component {
}
<FormGroup>
<FormLabel>API Key</FormLabel>
<FormLabel>
{translate('APIKey')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="apiKey"
readOnly={true}
helpTextWarning="Requires restart to take effect"
helpTextWarning={translate('ApiKeyHelpTextWarning')}
buttons={[
<ClipboardButton
key="copy"
@@ -151,13 +160,15 @@ class SecuritySettings extends Component {
</FormGroup>
<FormGroup>
<FormLabel>Certificate Validation</FormLabel>
<FormLabel>
{translate('CertificateValidation')}
</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="certificateValidation"
values={certificateValidationOptions}
helpText="Change how strict HTTPS certification validation is"
helpText={translate('CertificateValidationHelpText')}
onChange={onInputChange}
{...certificateValidation}
/>
@@ -166,9 +177,9 @@ class SecuritySettings extends Component {
<ConfirmModal
isOpen={this.state.isConfirmApiKeyResetModalOpen}
kind={kinds.DANGER}
title="Reset API Key"
message="Are you sure you want to reset your API Key?"
confirmLabel="Reset"
title={translate('ResetAPIKey')}
message={translate('ResetAPIKeyMessageText')}
confirmLabel={translate('Reset')}
onConfirm={this.onConfirmResetApiKey}
onCancel={this.onCloseResetApiKeyModal}
/>
+22 -11
View File
@@ -6,6 +6,7 @@ import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes, sizes } from 'Helpers/Props';
import titleCase from 'Utilities/String/titleCase';
import translate from 'Utilities/String/translate';
function UpdateSettings(props) {
const {
@@ -45,24 +46,28 @@ function UpdateSettings(props) {
if (isDocker) {
return (
<FieldSet legend="Updates">
<div>Updating is disabled inside a docker container. Update the container image instead.</div>
<FieldSet legend={translate('Updates')}>
<div>
{translate('UpdatingIsDisabledInsideADockerContainerUpdateTheContainerImageInstead')}
</div>
</FieldSet>
);
}
return (
<FieldSet legend="Updates">
<FieldSet legend={translate('Updates')}>
<FormGroup
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Branch</FormLabel>
<FormLabel>
{translate('Branch')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="branch"
helpText={usingExternalUpdateMechanism ? 'Branch used by external update mechanism' : 'Branch to use to update Readarr'}
helpText={usingExternalUpdateMechanism ? translate('UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism') : translate('UsingExternalUpdateMechanismBranchToUseToUpdateReadarr')}
helpLink="https://wiki.servarr.com/Readarr_FAQ#How_do_I_update_my_Readarr"
{...branch}
onChange={onInputChange}
@@ -78,12 +83,14 @@ function UpdateSettings(props) {
isAdvanced={true}
size={sizes.MEDIUM}
>
<FormLabel>Automatic</FormLabel>
<FormLabel>
{translate('Automatic')}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="updateAutomatically"
helpText="Automatically download and install updates. You will still be able to install from System: Updates"
helpText={translate('UpdateAutomaticallyHelpText')}
onChange={onInputChange}
{...updateAutomatically}
/>
@@ -93,13 +100,15 @@ function UpdateSettings(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Mechanism</FormLabel>
<FormLabel>
{translate('Mechanism')}
</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
name="updateMechanism"
values={updateOptions}
helpText="Use Readarr's built-in updater or a script"
helpText={translate('UpdateMechanismHelpText')}
helpLink="https://wiki.servarr.com/Readarr_FAQ#How_do_I_update_my_Readarr"
onChange={onInputChange}
{...updateMechanism}
@@ -112,12 +121,14 @@ function UpdateSettings(props) {
advancedSettings={advancedSettings}
isAdvanced={true}
>
<FormLabel>Script Path</FormLabel>
<FormLabel>
{translate('ScriptPath')}
</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="updateScriptPath"
helpText="Path to a custom script that takes an extracted update package and handle the remainder of the update process"
helpText={translate('UpdateScriptPathHelpText')}
onChange={onInputChange}
{...updateScriptPath}
/>