mirror of
https://github.com/Readarr/Readarr.git
synced 2026-03-12 15:29:59 -04:00
Compare commits
1 Commits
sonarr-pul
...
sonarr-pul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
03ed01e7d8 |
@@ -36,7 +36,7 @@ module.exports = (env) => {
|
||||
},
|
||||
|
||||
entry: {
|
||||
index: 'index.ts'
|
||||
index: 'index.js'
|
||||
},
|
||||
|
||||
resolve: {
|
||||
@@ -98,8 +98,7 @@ module.exports = (env) => {
|
||||
new HtmlWebpackPlugin({
|
||||
template: 'frontend/src/index.ejs',
|
||||
filename: 'index.html',
|
||||
publicPath: '/',
|
||||
inject: false
|
||||
publicPath: '/'
|
||||
}),
|
||||
|
||||
new FileManagerPlugin({
|
||||
|
||||
@@ -108,7 +108,7 @@ class RemoveQueueItemModal extends Component {
|
||||
type={inputTypes.CHECK}
|
||||
name="remove"
|
||||
value={remove}
|
||||
helpTextWarning={translate('RemoveFromDownloadClientHelpTextWarning')}
|
||||
helpTextWarning={translate('RemoveHelpTextWarning')}
|
||||
isDisabled={!canIgnore}
|
||||
onChange={this.onRemoveChange}
|
||||
/>
|
||||
|
||||
@@ -7,13 +7,13 @@ import PageConnector from 'Components/Page/PageConnector';
|
||||
import ApplyTheme from './ApplyTheme';
|
||||
import AppRoutes from './AppRoutes';
|
||||
|
||||
function App({ store, history }) {
|
||||
function App({ store, history, hasTranslationsError }) {
|
||||
return (
|
||||
<DocumentTitle title={window.Readarr.instanceName}>
|
||||
<Provider store={store}>
|
||||
<ConnectedRouter history={history}>
|
||||
<ApplyTheme>
|
||||
<PageConnector>
|
||||
<PageConnector hasTranslationsError={hasTranslationsError}>
|
||||
<AppRoutes app={App} />
|
||||
</PageConnector>
|
||||
</ApplyTheme>
|
||||
@@ -25,7 +25,8 @@ function App({ store, history }) {
|
||||
|
||||
App.propTypes = {
|
||||
store: PropTypes.object.isRequired,
|
||||
history: PropTypes.object.isRequired
|
||||
history: PropTypes.object.isRequired,
|
||||
hasTranslationsError: PropTypes.bool.isRequired
|
||||
};
|
||||
|
||||
export default App;
|
||||
|
||||
@@ -14,39 +14,14 @@ import { inputTypes } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
const nameOptions = [
|
||||
{
|
||||
key: 'firstLast',
|
||||
get value() {
|
||||
return translate('NameFirstLast');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'lastFirst',
|
||||
get value() {
|
||||
return translate('NameLastFirst');
|
||||
}
|
||||
}
|
||||
{ key: 'firstLast', value: translate('NameFirstLast') },
|
||||
{ key: 'lastFirst', value: translate('NameLastFirst') }
|
||||
];
|
||||
|
||||
const posterSizeOptions = [
|
||||
{
|
||||
key: 'small',
|
||||
get value() {
|
||||
return translate('Small');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'medium',
|
||||
get value() {
|
||||
return translate('Medium');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'large',
|
||||
get value() {
|
||||
return translate('Large');
|
||||
}
|
||||
}
|
||||
{ key: 'small', value: 'Small' },
|
||||
{ key: 'medium', value: 'Medium' },
|
||||
{ key: 'large', value: 'Large' }
|
||||
];
|
||||
|
||||
class AuthorIndexOverviewOptionsModalContent extends Component {
|
||||
|
||||
@@ -14,45 +14,15 @@ import { inputTypes } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
const posterSizeOptions = [
|
||||
{
|
||||
key: 'small',
|
||||
get value() {
|
||||
return translate('Small');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'medium',
|
||||
get value() {
|
||||
return translate('Medium');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'large',
|
||||
get value() {
|
||||
return translate('Large');
|
||||
}
|
||||
}
|
||||
{ key: 'small', value: 'Small' },
|
||||
{ key: 'medium', value: 'Medium' },
|
||||
{ key: 'large', value: 'Large' }
|
||||
];
|
||||
|
||||
const nameOptions = [
|
||||
{
|
||||
key: 'no',
|
||||
get value() {
|
||||
return translate('NoName');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'firstLast',
|
||||
get value() {
|
||||
return translate('NameFirstLast');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'lastFirst',
|
||||
get value() {
|
||||
return translate('NameLastFirst');
|
||||
}
|
||||
}
|
||||
{ key: 'no', value: translate('NoName') },
|
||||
{ key: 'firstLast', value: translate('NameFirstLast') },
|
||||
{ key: 'lastFirst', value: translate('NameLastFirst') }
|
||||
];
|
||||
|
||||
class AuthorIndexPosterOptionsModalContent extends Component {
|
||||
|
||||
@@ -7,18 +7,8 @@ import { inputTypes } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
const nameOptions = [
|
||||
{
|
||||
key: 'firstLast',
|
||||
get value() {
|
||||
return translate('NameFirstLast');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'lastFirst',
|
||||
get value() {
|
||||
return translate('NameLastFirst');
|
||||
}
|
||||
}
|
||||
{ key: 'firstLast', value: translate('NameFirstLast') },
|
||||
{ key: 'lastFirst', value: translate('NameLastFirst') }
|
||||
];
|
||||
|
||||
class AuthorIndexTableOptions extends Component {
|
||||
|
||||
@@ -206,11 +206,9 @@ class FilterBuilderRow extends Component {
|
||||
const selectedFilterBuilderProp = this.selectedFilterBuilderProp;
|
||||
|
||||
const keyOptions = filterBuilderProps.map((availablePropFilter) => {
|
||||
const { name, label } = availablePropFilter;
|
||||
|
||||
return {
|
||||
key: name,
|
||||
value: typeof label === 'function' ? label() : label
|
||||
key: availablePropFilter.name,
|
||||
value: availablePropFilter.label
|
||||
};
|
||||
}).sort((a, b) => a.value.localeCompare(b.value));
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ class SelectInput extends Component {
|
||||
value={key}
|
||||
{...otherOptionProps}
|
||||
>
|
||||
{typeof optionValue === 'function' ? optionValue() : optionValue}
|
||||
{optionValue}
|
||||
</option>
|
||||
);
|
||||
})
|
||||
@@ -75,7 +75,7 @@ SelectInput.propTypes = {
|
||||
className: PropTypes.string,
|
||||
disabledClassName: PropTypes.string,
|
||||
name: PropTypes.string.isRequired,
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]).isRequired,
|
||||
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
|
||||
values: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
isDisabled: PropTypes.bool,
|
||||
hasError: PropTypes.bool,
|
||||
|
||||
@@ -41,7 +41,7 @@ class Icon extends PureComponent {
|
||||
return (
|
||||
<span
|
||||
className={containerClassName}
|
||||
title={typeof title === 'function' ? title() : title}
|
||||
title={title}
|
||||
>
|
||||
{icon}
|
||||
</span>
|
||||
@@ -58,7 +58,7 @@ Icon.propTypes = {
|
||||
name: PropTypes.object.isRequired,
|
||||
kind: PropTypes.string.isRequired,
|
||||
size: PropTypes.number.isRequired,
|
||||
title: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
|
||||
title: PropTypes.string,
|
||||
isSpinning: PropTypes.bool.isRequired,
|
||||
fixedWidth: PropTypes.bool.isRequired
|
||||
};
|
||||
|
||||
@@ -32,7 +32,7 @@ class FilterMenuContent extends Component {
|
||||
selectedFilterKey={selectedFilterKey}
|
||||
onPress={onFilterSelect}
|
||||
>
|
||||
{typeof filter.label === 'function' ? filter.label() : filter.label}
|
||||
{filter.label}
|
||||
</FilterMenuItem>
|
||||
);
|
||||
})
|
||||
|
||||
@@ -7,7 +7,7 @@ function ErrorPage(props) {
|
||||
const {
|
||||
version,
|
||||
isLocalStorageSupported,
|
||||
translationsError,
|
||||
hasTranslationsError,
|
||||
authorError,
|
||||
customFiltersError,
|
||||
tagsError,
|
||||
@@ -21,8 +21,8 @@ function ErrorPage(props) {
|
||||
|
||||
if (!isLocalStorageSupported) {
|
||||
errorMessage = 'Local Storage is not supported or disabled. A plugin or private browsing may have disabled it.';
|
||||
} else if (translationsError) {
|
||||
errorMessage = getErrorMessage(translationsError, 'Failed to load translations from API');
|
||||
} else if (hasTranslationsError) {
|
||||
errorMessage = 'Failed to load translations from API';
|
||||
} else if (authorError) {
|
||||
errorMessage = getErrorMessage(authorError, 'Failed to load author from API');
|
||||
} else if (customFiltersError) {
|
||||
@@ -55,7 +55,7 @@ function ErrorPage(props) {
|
||||
ErrorPage.propTypes = {
|
||||
version: PropTypes.string.isRequired,
|
||||
isLocalStorageSupported: PropTypes.bool.isRequired,
|
||||
translationsError: PropTypes.object,
|
||||
hasTranslationsError: PropTypes.bool.isRequired,
|
||||
authorError: PropTypes.object,
|
||||
customFiltersError: PropTypes.object,
|
||||
tagsError: PropTypes.object,
|
||||
|
||||
@@ -3,7 +3,7 @@ import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { withRouter } from 'react-router-dom';
|
||||
import { createSelector } from 'reselect';
|
||||
import { fetchTranslations, saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
|
||||
import { saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
|
||||
import { fetchAuthor } from 'Store/Actions/authorActions';
|
||||
import { fetchBooks } from 'Store/Actions/bookActions';
|
||||
import { fetchCustomFilters } from 'Store/Actions/customFilterActions';
|
||||
@@ -52,7 +52,6 @@ const selectIsPopulated = createSelector(
|
||||
(state) => state.settings.metadataProfiles.isPopulated,
|
||||
(state) => state.settings.importLists.isPopulated,
|
||||
(state) => state.system.status.isPopulated,
|
||||
(state) => state.app.translations.isPopulated,
|
||||
(
|
||||
customFiltersIsPopulated,
|
||||
tagsIsPopulated,
|
||||
@@ -61,8 +60,7 @@ const selectIsPopulated = createSelector(
|
||||
qualityProfilesIsPopulated,
|
||||
metadataProfilesIsPopulated,
|
||||
importListsIsPopulated,
|
||||
systemStatusIsPopulated,
|
||||
translationsIsPopulated
|
||||
systemStatusIsPopulated
|
||||
) => {
|
||||
return (
|
||||
customFiltersIsPopulated &&
|
||||
@@ -72,8 +70,7 @@ const selectIsPopulated = createSelector(
|
||||
qualityProfilesIsPopulated &&
|
||||
metadataProfilesIsPopulated &&
|
||||
importListsIsPopulated &&
|
||||
systemStatusIsPopulated &&
|
||||
translationsIsPopulated
|
||||
systemStatusIsPopulated
|
||||
);
|
||||
}
|
||||
);
|
||||
@@ -87,7 +84,6 @@ const selectErrors = createSelector(
|
||||
(state) => state.settings.metadataProfiles.error,
|
||||
(state) => state.settings.importLists.error,
|
||||
(state) => state.system.status.error,
|
||||
(state) => state.app.translations.error,
|
||||
(
|
||||
customFiltersError,
|
||||
tagsError,
|
||||
@@ -96,8 +92,7 @@ const selectErrors = createSelector(
|
||||
qualityProfilesError,
|
||||
metadataProfilesError,
|
||||
importListsError,
|
||||
systemStatusError,
|
||||
translationsError
|
||||
systemStatusError
|
||||
) => {
|
||||
const hasError = !!(
|
||||
customFiltersError ||
|
||||
@@ -107,8 +102,7 @@ const selectErrors = createSelector(
|
||||
qualityProfilesError ||
|
||||
metadataProfilesError ||
|
||||
importListsError ||
|
||||
systemStatusError ||
|
||||
translationsError
|
||||
systemStatusError
|
||||
);
|
||||
|
||||
return {
|
||||
@@ -120,8 +114,7 @@ const selectErrors = createSelector(
|
||||
qualityProfilesError,
|
||||
metadataProfilesError,
|
||||
importListsError,
|
||||
systemStatusError,
|
||||
translationsError
|
||||
systemStatusError
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -183,9 +176,6 @@ function createMapDispatchToProps(dispatch, props) {
|
||||
dispatchFetchStatus() {
|
||||
dispatch(fetchStatus());
|
||||
},
|
||||
dispatchFetchTranslations() {
|
||||
dispatch(fetchTranslations());
|
||||
},
|
||||
onResize(dimensions) {
|
||||
dispatch(saveDimensions(dimensions));
|
||||
},
|
||||
@@ -220,7 +210,6 @@ class PageConnector extends Component {
|
||||
this.props.dispatchFetchImportLists();
|
||||
this.props.dispatchFetchUISettings();
|
||||
this.props.dispatchFetchStatus();
|
||||
this.props.dispatchFetchTranslations();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,6 +225,7 @@ class PageConnector extends Component {
|
||||
|
||||
render() {
|
||||
const {
|
||||
hasTranslationsError,
|
||||
isPopulated,
|
||||
hasError,
|
||||
dispatchFetchAuthor,
|
||||
@@ -247,15 +237,15 @@ class PageConnector extends Component {
|
||||
dispatchFetchImportLists,
|
||||
dispatchFetchUISettings,
|
||||
dispatchFetchStatus,
|
||||
dispatchFetchTranslations,
|
||||
...otherProps
|
||||
} = this.props;
|
||||
|
||||
if (hasError || !this.state.isLocalStorageSupported) {
|
||||
if (hasTranslationsError || hasError || !this.state.isLocalStorageSupported) {
|
||||
return (
|
||||
<ErrorPage
|
||||
{...this.state}
|
||||
{...otherProps}
|
||||
hasTranslationsError={hasTranslationsError}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -276,6 +266,7 @@ class PageConnector extends Component {
|
||||
}
|
||||
|
||||
PageConnector.propTypes = {
|
||||
hasTranslationsError: PropTypes.bool.isRequired,
|
||||
isPopulated: PropTypes.bool.isRequired,
|
||||
hasError: PropTypes.bool.isRequired,
|
||||
isSidebarVisible: PropTypes.bool.isRequired,
|
||||
@@ -289,7 +280,6 @@ PageConnector.propTypes = {
|
||||
dispatchFetchImportLists: PropTypes.func.isRequired,
|
||||
dispatchFetchUISettings: PropTypes.func.isRequired,
|
||||
dispatchFetchStatus: PropTypes.func.isRequired,
|
||||
dispatchFetchTranslations: PropTypes.func.isRequired,
|
||||
onSidebarVisibleChange: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -21,28 +21,28 @@ const SIDEBAR_WIDTH = parseInt(dimensions.sidebarWidth);
|
||||
const links = [
|
||||
{
|
||||
iconName: icons.AUTHOR_CONTINUING,
|
||||
title: () => translate('Library'),
|
||||
title: 'Library',
|
||||
to: '/',
|
||||
alias: '/authors',
|
||||
children: [
|
||||
{
|
||||
title: () => translate('Authors'),
|
||||
title: 'Authors',
|
||||
to: '/authors'
|
||||
},
|
||||
{
|
||||
title: () => translate('Books'),
|
||||
title: 'Books',
|
||||
to: '/books'
|
||||
},
|
||||
{
|
||||
title: () => translate('AddNew'),
|
||||
title: 'Add New',
|
||||
to: '/add/search'
|
||||
},
|
||||
{
|
||||
title: () => translate('Bookshelf'),
|
||||
title: 'Bookshelf',
|
||||
to: '/shelf'
|
||||
},
|
||||
{
|
||||
title: () => translate('UnmappedFiles'),
|
||||
title: 'Unmapped Files',
|
||||
to: '/unmapped'
|
||||
}
|
||||
]
|
||||
@@ -50,26 +50,26 @@ const links = [
|
||||
|
||||
{
|
||||
iconName: icons.CALENDAR,
|
||||
title: () => translate('Calendar'),
|
||||
title: 'Calendar',
|
||||
to: '/calendar'
|
||||
},
|
||||
|
||||
{
|
||||
iconName: icons.ACTIVITY,
|
||||
title: () => translate('Activity'),
|
||||
title: 'Activity',
|
||||
to: '/activity/queue',
|
||||
children: [
|
||||
{
|
||||
title: () => translate('Queue'),
|
||||
title: 'Queue',
|
||||
to: '/activity/queue',
|
||||
statusComponent: QueueStatusConnector
|
||||
},
|
||||
{
|
||||
title: () => translate('History'),
|
||||
title: 'History',
|
||||
to: '/activity/history'
|
||||
},
|
||||
{
|
||||
title: () => translate('Blocklist'),
|
||||
title: 'Blocklist',
|
||||
to: '/activity/blocklist'
|
||||
}
|
||||
]
|
||||
@@ -77,15 +77,15 @@ const links = [
|
||||
|
||||
{
|
||||
iconName: icons.WARNING,
|
||||
title: () => translate('Wanted'),
|
||||
title: 'Wanted',
|
||||
to: '/wanted/missing',
|
||||
children: [
|
||||
{
|
||||
title: () => translate('Missing'),
|
||||
title: 'Missing',
|
||||
to: '/wanted/missing'
|
||||
},
|
||||
{
|
||||
title: () => translate('CutoffUnmet'),
|
||||
title: 'Cutoff Unmet',
|
||||
to: '/wanted/cutoffunmet'
|
||||
}
|
||||
]
|
||||
@@ -93,55 +93,55 @@ const links = [
|
||||
|
||||
{
|
||||
iconName: icons.SETTINGS,
|
||||
title: () => translate('Settings'),
|
||||
title: 'Settings',
|
||||
to: '/settings',
|
||||
children: [
|
||||
{
|
||||
title: () => translate('MediaManagement'),
|
||||
title: 'Media Management',
|
||||
to: '/settings/mediamanagement'
|
||||
},
|
||||
{
|
||||
title: () => translate('Profiles'),
|
||||
title: 'Profiles',
|
||||
to: '/settings/profiles'
|
||||
},
|
||||
{
|
||||
title: () => translate('Quality'),
|
||||
title: 'Quality',
|
||||
to: '/settings/quality'
|
||||
},
|
||||
{
|
||||
title: () => translate('CustomFormats'),
|
||||
title: translate('CustomFormats'),
|
||||
to: '/settings/customformats'
|
||||
},
|
||||
{
|
||||
title: () => translate('Indexers'),
|
||||
title: translate('Indexers'),
|
||||
to: '/settings/indexers'
|
||||
},
|
||||
{
|
||||
title: () => translate('DownloadClients'),
|
||||
title: 'Download Clients',
|
||||
to: '/settings/downloadclients'
|
||||
},
|
||||
{
|
||||
title: () => translate('ImportLists'),
|
||||
title: 'Import Lists',
|
||||
to: '/settings/importlists'
|
||||
},
|
||||
{
|
||||
title: () => translate('Connect'),
|
||||
title: 'Connect',
|
||||
to: '/settings/connect'
|
||||
},
|
||||
{
|
||||
title: () => translate('Metadata'),
|
||||
title: 'Metadata',
|
||||
to: '/settings/metadata'
|
||||
},
|
||||
{
|
||||
title: () => translate('Tags'),
|
||||
title: 'Tags',
|
||||
to: '/settings/tags'
|
||||
},
|
||||
{
|
||||
title: () => translate('General'),
|
||||
title: 'General',
|
||||
to: '/settings/general'
|
||||
},
|
||||
{
|
||||
title: () => translate('Ui'),
|
||||
title: 'UI',
|
||||
to: '/settings/ui'
|
||||
}
|
||||
]
|
||||
@@ -149,32 +149,32 @@ const links = [
|
||||
|
||||
{
|
||||
iconName: icons.SYSTEM,
|
||||
title: () => translate('System'),
|
||||
title: 'System',
|
||||
to: '/system/status',
|
||||
children: [
|
||||
{
|
||||
title: () => translate('Status'),
|
||||
title: 'Status',
|
||||
to: '/system/status',
|
||||
statusComponent: HealthStatusConnector
|
||||
},
|
||||
{
|
||||
title: () => translate('Tasks'),
|
||||
title: 'Tasks',
|
||||
to: '/system/tasks'
|
||||
},
|
||||
{
|
||||
title: () => translate('Backup'),
|
||||
title: 'Backup',
|
||||
to: '/system/backup'
|
||||
},
|
||||
{
|
||||
title: () => translate('Updates'),
|
||||
title: 'Updates',
|
||||
to: '/system/updates'
|
||||
},
|
||||
{
|
||||
title: () => translate('Events'),
|
||||
title: 'Events',
|
||||
to: '/system/events'
|
||||
},
|
||||
{
|
||||
title: () => translate('LogFiles'),
|
||||
title: 'Log Files',
|
||||
to: '/system/logs/files'
|
||||
}
|
||||
]
|
||||
|
||||
@@ -64,7 +64,7 @@ class PageSidebarItem extends Component {
|
||||
}
|
||||
|
||||
<span className={isChildItem ? styles.noIcon : null}>
|
||||
{typeof title === 'function' ? title() : title}
|
||||
{title}
|
||||
</span>
|
||||
|
||||
{
|
||||
@@ -88,7 +88,7 @@ class PageSidebarItem extends Component {
|
||||
|
||||
PageSidebarItem.propTypes = {
|
||||
iconName: PropTypes.object,
|
||||
title: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
|
||||
title: PropTypes.string.isRequired,
|
||||
to: PropTypes.string.isRequired,
|
||||
isActive: PropTypes.bool,
|
||||
isActiveParent: PropTypes.bool,
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import React from 'react';
|
||||
|
||||
type PropertyFunction<T> = () => T;
|
||||
|
||||
interface Column {
|
||||
name: string;
|
||||
label: string | PropertyFunction<string> | React.ReactNode;
|
||||
label: string | React.ReactNode;
|
||||
columnLabel?: string;
|
||||
isSortable?: boolean;
|
||||
isVisible: boolean;
|
||||
|
||||
@@ -107,7 +107,7 @@ function Table(props) {
|
||||
{...getTableHeaderCellProps(otherProps)}
|
||||
{...column}
|
||||
>
|
||||
{typeof column.label === 'function' ? column.label() : column.label}
|
||||
{column.label}
|
||||
</TableHeaderCell>
|
||||
);
|
||||
})
|
||||
|
||||
@@ -30,7 +30,6 @@ class TableHeaderCell extends Component {
|
||||
const {
|
||||
className,
|
||||
name,
|
||||
label,
|
||||
columnLabel,
|
||||
isSortable,
|
||||
isVisible,
|
||||
@@ -54,8 +53,7 @@ class TableHeaderCell extends Component {
|
||||
{...otherProps}
|
||||
component="th"
|
||||
className={className}
|
||||
label={typeof label === 'function' ? label() : label}
|
||||
title={typeof columnLabel === 'function' ? columnLabel() : columnLabel}
|
||||
title={columnLabel}
|
||||
onPress={this.onPress}
|
||||
>
|
||||
{children}
|
||||
@@ -79,8 +77,7 @@ class TableHeaderCell extends Component {
|
||||
TableHeaderCell.propTypes = {
|
||||
className: PropTypes.string,
|
||||
name: PropTypes.string.isRequired,
|
||||
label: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.node]),
|
||||
columnLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
|
||||
columnLabel: PropTypes.string,
|
||||
isSortable: PropTypes.bool,
|
||||
isVisible: PropTypes.bool,
|
||||
isModifiable: PropTypes.bool,
|
||||
|
||||
@@ -35,7 +35,7 @@ function TableOptionsColumn(props) {
|
||||
isDisabled={isModifiable === false}
|
||||
onChange={onVisibleChange}
|
||||
/>
|
||||
{typeof label === 'function' ? label() : label}
|
||||
{label}
|
||||
</label>
|
||||
|
||||
{
|
||||
@@ -56,7 +56,7 @@ function TableOptionsColumn(props) {
|
||||
|
||||
TableOptionsColumn.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
label: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
|
||||
label: PropTypes.string.isRequired,
|
||||
isVisible: PropTypes.bool.isRequired,
|
||||
isModifiable: PropTypes.bool.isRequired,
|
||||
index: PropTypes.number.isRequired,
|
||||
|
||||
@@ -112,7 +112,7 @@ class TableOptionsColumnDragSource extends Component {
|
||||
|
||||
<TableOptionsColumn
|
||||
name={name}
|
||||
label={typeof label === 'function' ? label() : label}
|
||||
label={label}
|
||||
isVisible={isVisible}
|
||||
isModifiable={isModifiable}
|
||||
index={index}
|
||||
@@ -138,7 +138,7 @@ class TableOptionsColumnDragSource extends Component {
|
||||
|
||||
TableOptionsColumnDragSource.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
label: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
|
||||
label: PropTypes.string.isRequired,
|
||||
isVisible: PropTypes.bool.isRequired,
|
||||
isModifiable: PropTypes.bool.isRequired,
|
||||
index: PropTypes.number.isRequired,
|
||||
|
||||
@@ -69,7 +69,7 @@ const columns = [
|
||||
name: 'customFormats',
|
||||
label: React.createElement(Icon, {
|
||||
name: icons.INTERACTIVE,
|
||||
title: () => translate('CustomFormat')
|
||||
title: translate('CustomFormat')
|
||||
}),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
@@ -91,9 +91,9 @@ const filterExistingFilesOptions = {
|
||||
};
|
||||
|
||||
const importModeOptions = [
|
||||
{ key: 'chooseImportMode', value: () => translate('ChooseImportMethod'), disabled: true },
|
||||
{ key: 'move', value: () => translate('MoveFiles') },
|
||||
{ key: 'copy', value: () => translate('HardlinkCopyFiles') }
|
||||
{ key: 'chooseImportMode', value: translate('ChooseImportMethod'), disabled: true },
|
||||
{ key: 'move', value: translate('MoveFiles') },
|
||||
{ key: 'copy', value: translate('HardlinkCopyFiles') }
|
||||
];
|
||||
|
||||
const SELECT = 'select';
|
||||
|
||||
@@ -56,7 +56,7 @@ const columns = [
|
||||
name: 'customFormatScore',
|
||||
label: React.createElement(Icon, {
|
||||
name: icons.SCORE,
|
||||
title: () => translate('CustomFormatScore')
|
||||
title: translate('CustomFormatScore')
|
||||
}),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
|
||||
@@ -32,18 +32,6 @@ function getDownloadIcon(isGrabbing, isGrabbed, grabError) {
|
||||
return icons.DOWNLOAD;
|
||||
}
|
||||
|
||||
function getDownloadKind(isGrabbed, grabError, downloadAllowed) {
|
||||
if (isGrabbed) {
|
||||
return kinds.SUCCESS;
|
||||
}
|
||||
|
||||
if (grabError || !downloadAllowed) {
|
||||
return kinds.DANGER;
|
||||
}
|
||||
|
||||
return kinds.DEFAULT;
|
||||
}
|
||||
|
||||
function getDownloadTooltip(isGrabbing, isGrabbed, grabError) {
|
||||
if (isGrabbing) {
|
||||
return '';
|
||||
@@ -224,7 +212,7 @@ class InteractiveSearchRow extends Component {
|
||||
{
|
||||
<SpinnerIconButton
|
||||
name={getDownloadIcon(isGrabbing, isGrabbed, grabError)}
|
||||
kind={getDownloadKind(isGrabbed, grabError, downloadAllowed)}
|
||||
kind={grabError || !downloadAllowed ? kinds.DANGER : kinds.DEFAULT}
|
||||
title={getDownloadTooltip(isGrabbing, isGrabbed, grabError)}
|
||||
isSpinning={isGrabbing}
|
||||
onPress={downloadAllowed ? this.onGrabPress : this.onConfirmGrabPress}
|
||||
|
||||
@@ -27,25 +27,9 @@ interface ManageDownloadClientsEditModalContentProps {
|
||||
const NO_CHANGE = 'noChange';
|
||||
|
||||
const enableOptions = [
|
||||
{
|
||||
key: NO_CHANGE,
|
||||
get value() {
|
||||
return translate('NoChange');
|
||||
},
|
||||
disabled: true,
|
||||
},
|
||||
{
|
||||
key: 'enabled',
|
||||
get value() {
|
||||
return translate('Enabled');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'disabled',
|
||||
get value() {
|
||||
return translate('Disabled');
|
||||
},
|
||||
},
|
||||
{ key: NO_CHANGE, value: translate('NoChange'), disabled: true },
|
||||
{ key: 'enabled', value: translate('Enabled') },
|
||||
{ key: 'disabled', value: translate('Disabled') },
|
||||
];
|
||||
|
||||
function ManageDownloadClientsEditModalContent(
|
||||
|
||||
@@ -36,37 +36,37 @@ type OnSelectedChangeCallback = React.ComponentProps<
|
||||
const COLUMNS = [
|
||||
{
|
||||
name: 'name',
|
||||
label: () => translate('Name'),
|
||||
label: translate('Name'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'implementation',
|
||||
label: () => translate('Implementation'),
|
||||
label: translate('Implementation'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enable',
|
||||
label: () => translate('Enabled'),
|
||||
label: translate('Enabled'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'priority',
|
||||
label: () => translate('Priority'),
|
||||
label: translate('Priority'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'removeCompletedDownloads',
|
||||
label: () => translate('RemoveCompleted'),
|
||||
label: translate('RemoveCompleted'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'removeFailedDownloads',
|
||||
label: () => translate('RemoveFailed'),
|
||||
label: translate('RemoveFailed'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
|
||||
@@ -72,24 +72,9 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
}, [tags, applyTags, onApplyTagsPress]);
|
||||
|
||||
const applyTagsOptions = [
|
||||
{
|
||||
key: 'add',
|
||||
get value() {
|
||||
return translate('Add');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'remove',
|
||||
get value() {
|
||||
return translate('Remove');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'replace',
|
||||
get value() {
|
||||
return translate('Replace');
|
||||
},
|
||||
},
|
||||
{ key: 'add', value: translate('Add') },
|
||||
{ key: 'remove', value: translate('Remove') },
|
||||
{ key: 'replace', value: translate('Replace') },
|
||||
];
|
||||
|
||||
return (
|
||||
|
||||
@@ -17,6 +17,11 @@ const authenticationMethodOptions = [
|
||||
{ key: 'forms', value: 'Forms (Login Page)' }
|
||||
];
|
||||
|
||||
const authenticationRequiredOptions = [
|
||||
{ key: 'enabled', value: 'Enabled' },
|
||||
{ key: 'disabledForLocalAddresses', value: 'Disabled for Local Addresses' }
|
||||
];
|
||||
|
||||
const certificateValidationOptions = [
|
||||
{ key: 'enabled', value: 'Enabled' },
|
||||
{ key: 'disabledForLocalAddresses', value: 'Disabled for Local Addresses' },
|
||||
@@ -68,6 +73,7 @@ class SecuritySettings extends Component {
|
||||
|
||||
const {
|
||||
authenticationMethod,
|
||||
authenticationRequired,
|
||||
username,
|
||||
password,
|
||||
apiKey,
|
||||
@@ -94,7 +100,24 @@ class SecuritySettings extends Component {
|
||||
</FormGroup>
|
||||
|
||||
{
|
||||
authenticationEnabled &&
|
||||
authenticationEnabled ?
|
||||
<FormGroup>
|
||||
<FormLabel>Authentication Required</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
name="authenticationRequired"
|
||||
values={authenticationRequiredOptions}
|
||||
helpText="Change which requests authentication is required for. Do not change unless you understand the risks."
|
||||
onChange={onInputChange}
|
||||
{...authenticationRequired}
|
||||
/>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
authenticationEnabled ?
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
{translate('Username')}
|
||||
@@ -106,11 +129,12 @@ class SecuritySettings extends Component {
|
||||
onChange={onInputChange}
|
||||
{...username}
|
||||
/>
|
||||
</FormGroup>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
{
|
||||
authenticationEnabled &&
|
||||
authenticationEnabled ?
|
||||
<FormGroup>
|
||||
<FormLabel>
|
||||
{translate('Password')}
|
||||
@@ -122,7 +146,8 @@ class SecuritySettings extends Component {
|
||||
onChange={onInputChange}
|
||||
{...password}
|
||||
/>
|
||||
</FormGroup>
|
||||
</FormGroup> :
|
||||
null
|
||||
}
|
||||
|
||||
<FormGroup>
|
||||
|
||||
@@ -27,25 +27,9 @@ interface ManageImportListsEditModalContentProps {
|
||||
const NO_CHANGE = 'noChange';
|
||||
|
||||
const autoAddOptions = [
|
||||
{
|
||||
key: NO_CHANGE,
|
||||
get value() {
|
||||
return translate('NoChange');
|
||||
},
|
||||
disabled: true,
|
||||
},
|
||||
{
|
||||
key: 'enabled',
|
||||
get value() {
|
||||
return translate('Enabled');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'disabled',
|
||||
get value() {
|
||||
return translate('Disabled');
|
||||
},
|
||||
},
|
||||
{ key: NO_CHANGE, value: translate('NoChange'), disabled: true },
|
||||
{ key: 'enabled', value: translate('Enabled') },
|
||||
{ key: 'disabled', value: translate('Disabled') },
|
||||
];
|
||||
|
||||
function ManageImportListsEditModalContent(
|
||||
|
||||
@@ -36,43 +36,43 @@ type OnSelectedChangeCallback = React.ComponentProps<
|
||||
const COLUMNS = [
|
||||
{
|
||||
name: 'name',
|
||||
label: () => translate('Name'),
|
||||
label: translate('Name'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'implementation',
|
||||
label: () => translate('Implementation'),
|
||||
label: translate('Implementation'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'qualityProfileId',
|
||||
label: () => translate('QualityProfile'),
|
||||
label: translate('QualityProfile'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'metadataProfileId',
|
||||
label: () => translate('MetadataProfile'),
|
||||
label: translate('MetadataProfile'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'rootFolderPath',
|
||||
label: () => translate('RootFolder'),
|
||||
label: translate('RootFolder'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableAutomaticAdd',
|
||||
label: () => translate('AutoAdd'),
|
||||
label: translate('AutoAdd'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'tags',
|
||||
label: () => translate('Tags'),
|
||||
label: translate('Tags'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
|
||||
@@ -70,24 +70,9 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
}, [tags, applyTags, onApplyTagsPress]);
|
||||
|
||||
const applyTagsOptions = [
|
||||
{
|
||||
key: 'add',
|
||||
get value() {
|
||||
return translate('Add');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'remove',
|
||||
get value() {
|
||||
return translate('Remove');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'replace',
|
||||
get value() {
|
||||
return translate('Replace');
|
||||
},
|
||||
},
|
||||
{ key: 'add', value: translate('Add') },
|
||||
{ key: 'remove', value: translate('Remove') },
|
||||
{ key: 'replace', value: translate('Replace') },
|
||||
];
|
||||
|
||||
return (
|
||||
|
||||
@@ -27,25 +27,9 @@ interface ManageIndexersEditModalContentProps {
|
||||
const NO_CHANGE = 'noChange';
|
||||
|
||||
const enableOptions = [
|
||||
{
|
||||
key: NO_CHANGE,
|
||||
get value() {
|
||||
return translate('NoChange');
|
||||
},
|
||||
disabled: true,
|
||||
},
|
||||
{
|
||||
key: 'enabled',
|
||||
get value() {
|
||||
return translate('Enabled');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'disabled',
|
||||
get value() {
|
||||
return translate('Disabled');
|
||||
},
|
||||
},
|
||||
{ key: NO_CHANGE, value: translate('NoChange'), disabled: true },
|
||||
{ key: 'enabled', value: translate('Enabled') },
|
||||
{ key: 'disabled', value: translate('Disabled') },
|
||||
];
|
||||
|
||||
function ManageIndexersEditModalContent(
|
||||
|
||||
@@ -36,43 +36,43 @@ type OnSelectedChangeCallback = React.ComponentProps<
|
||||
const COLUMNS = [
|
||||
{
|
||||
name: 'name',
|
||||
label: () => translate('Name'),
|
||||
label: translate('Name'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'implementation',
|
||||
label: () => translate('Implementation'),
|
||||
label: translate('Implementation'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableRss',
|
||||
label: () => translate('EnableRSS'),
|
||||
label: translate('EnableRSS'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableAutomaticSearch',
|
||||
label: () => translate('EnableAutomaticSearch'),
|
||||
label: translate('EnableAutomaticSearch'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'enableInteractiveSearch',
|
||||
label: () => translate('EnableInteractiveSearch'),
|
||||
label: translate('EnableInteractiveSearch'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'priority',
|
||||
label: () => translate('Priority'),
|
||||
label: translate('Priority'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'tags',
|
||||
label: () => translate('Tags'),
|
||||
label: translate('Tags'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
|
||||
@@ -70,24 +70,9 @@ function TagsModalContent(props: TagsModalContentProps) {
|
||||
}, [tags, applyTags, onApplyTagsPress]);
|
||||
|
||||
const applyTagsOptions = [
|
||||
{
|
||||
key: 'add',
|
||||
get value() {
|
||||
return translate('Add');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'remove',
|
||||
get value() {
|
||||
return translate('Remove');
|
||||
},
|
||||
},
|
||||
{
|
||||
key: 'replace',
|
||||
get value() {
|
||||
return translate('Replace');
|
||||
},
|
||||
},
|
||||
{ key: 'add', value: translate('Add') },
|
||||
{ key: 'remove', value: translate('Remove') },
|
||||
{ key: 'replace', value: translate('Replace') },
|
||||
];
|
||||
|
||||
return (
|
||||
|
||||
@@ -11,51 +11,16 @@ import { inputTypes, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
|
||||
const writeAudioTagOptions = [
|
||||
{
|
||||
key: 'no',
|
||||
get value() {
|
||||
return translate('WriteTagsNo');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'sync',
|
||||
get value() {
|
||||
return translate('WriteTagsSync');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'allFiles',
|
||||
get value() {
|
||||
return translate('WriteTagsAll');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'newFiles',
|
||||
get value() {
|
||||
return translate('WriteTagsNew');
|
||||
}
|
||||
}
|
||||
{ key: 'no', value: translate('WriteTagsNo') },
|
||||
{ key: 'sync', value: translate('WriteTagsSync') },
|
||||
{ key: 'allFiles', value: translate('WriteTagsAll') },
|
||||
{ key: 'newFiles', value: translate('WriteTagsNew') }
|
||||
];
|
||||
|
||||
const writeBookTagOptions = [
|
||||
{
|
||||
key: 'sync',
|
||||
get value() {
|
||||
return translate('WriteTagsSync');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'allFiles',
|
||||
get value() {
|
||||
return translate('WriteTagsAll');
|
||||
}
|
||||
},
|
||||
{
|
||||
key: 'newFiles',
|
||||
get value() {
|
||||
return translate('WriteTagsNew');
|
||||
}
|
||||
}
|
||||
{ key: 'sync', value: translate('WriteTagsSync') },
|
||||
{ key: 'allFiles', value: translate('WriteTagsAll') },
|
||||
{ key: 'newFiles', value: translate('WriteTagsNew') }
|
||||
];
|
||||
|
||||
function MetadataProvider(props) {
|
||||
|
||||
@@ -139,7 +139,7 @@ function Settings() {
|
||||
className={styles.link}
|
||||
to="/settings/ui"
|
||||
>
|
||||
{translate('Ui')}
|
||||
{translate('UI')}
|
||||
</Link>
|
||||
|
||||
<div className={styles.summary}>
|
||||
|
||||
@@ -4,7 +4,6 @@ import { createThunk, handleThunks } from 'Store/thunks';
|
||||
import createAjaxRequest from 'Utilities/createAjaxRequest';
|
||||
import getSectionState from 'Utilities/State/getSectionState';
|
||||
import updateSectionState from 'Utilities/State/updateSectionState';
|
||||
import { fetchTranslations as fetchAppTranslations } from 'Utilities/String/translate';
|
||||
import createHandleActions from './Creators/createHandleActions';
|
||||
|
||||
function getDimensions(width, height) {
|
||||
@@ -42,12 +41,7 @@ export const defaultState = {
|
||||
isReconnecting: false,
|
||||
isDisconnected: false,
|
||||
isRestarting: false,
|
||||
isSidebarVisible: !getDimensions(window.innerWidth, window.innerHeight).isSmallScreen,
|
||||
translations: {
|
||||
isFetching: true,
|
||||
isPopulated: false,
|
||||
error: null
|
||||
}
|
||||
isSidebarVisible: !getDimensions(window.innerWidth, window.innerHeight).isSmallScreen
|
||||
};
|
||||
|
||||
//
|
||||
@@ -59,7 +53,6 @@ export const SAVE_DIMENSIONS = 'app/saveDimensions';
|
||||
export const SET_VERSION = 'app/setVersion';
|
||||
export const SET_APP_VALUE = 'app/setAppValue';
|
||||
export const SET_IS_SIDEBAR_VISIBLE = 'app/setIsSidebarVisible';
|
||||
export const FETCH_TRANSLATIONS = 'app/fetchTranslations';
|
||||
|
||||
export const PING_SERVER = 'app/pingServer';
|
||||
|
||||
@@ -73,7 +66,6 @@ export const setAppValue = createAction(SET_APP_VALUE);
|
||||
export const showMessage = createAction(SHOW_MESSAGE);
|
||||
export const hideMessage = createAction(HIDE_MESSAGE);
|
||||
export const pingServer = createThunk(PING_SERVER);
|
||||
export const fetchTranslations = createThunk(FETCH_TRANSLATIONS);
|
||||
|
||||
//
|
||||
// Helpers
|
||||
@@ -135,17 +127,6 @@ function pingServerAfterTimeout(getState, dispatch) {
|
||||
export const actionHandlers = handleThunks({
|
||||
[PING_SERVER]: function(getState, payload, dispatch) {
|
||||
pingServerAfterTimeout(getState, dispatch);
|
||||
},
|
||||
[FETCH_TRANSLATIONS]: async function(getState, payload, dispatch) {
|
||||
const isFetchingComplete = await fetchAppTranslations();
|
||||
|
||||
dispatch(setAppValue({
|
||||
translations: {
|
||||
isFetching: false,
|
||||
isPopulated: isFetchingComplete,
|
||||
error: isFetchingComplete ? null : 'Failed to load translations from API'
|
||||
}
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -24,12 +24,12 @@ export const section = 'books';
|
||||
export const filters = [
|
||||
{
|
||||
key: 'all',
|
||||
label: () => translate('All'),
|
||||
label: translate('All'),
|
||||
filters: []
|
||||
},
|
||||
{
|
||||
key: 'monitored',
|
||||
label: () => translate('Monitored'),
|
||||
label: translate('Monitored'),
|
||||
filters: [
|
||||
{
|
||||
key: 'monitored',
|
||||
@@ -40,7 +40,7 @@ export const filters = [
|
||||
},
|
||||
{
|
||||
key: 'unmonitored',
|
||||
label: () => translate('Unmonitored'),
|
||||
label: translate('Unmonitored'),
|
||||
filters: [
|
||||
{
|
||||
key: 'monitored',
|
||||
@@ -51,7 +51,7 @@ export const filters = [
|
||||
},
|
||||
{
|
||||
key: 'missing',
|
||||
label: () => translate('Missing'),
|
||||
label: translate('Missing'),
|
||||
filters: [
|
||||
{
|
||||
key: 'monitored',
|
||||
@@ -67,7 +67,7 @@ export const filters = [
|
||||
},
|
||||
{
|
||||
key: 'wanted',
|
||||
label: () => translate('Wanted'),
|
||||
label: translate('Wanted'),
|
||||
filters: [
|
||||
{
|
||||
key: 'monitored',
|
||||
|
||||
@@ -60,32 +60,32 @@ export const defaultState = {
|
||||
columns: [
|
||||
{
|
||||
name: 'status',
|
||||
columnLabel: () => translate('Status'),
|
||||
columnLabel: translate('Status'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
},
|
||||
{
|
||||
name: 'authorMetadata.sortName',
|
||||
label: () => translate('Author'),
|
||||
label: translate('Author'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'books.title',
|
||||
label: () => translate('BookTitle'),
|
||||
label: translate('BookTitle'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'books.releaseDate',
|
||||
label: () => translate('ReleaseDate'),
|
||||
label: translate('ReleaseDate'),
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'quality',
|
||||
label: () => translate('Quality'),
|
||||
label: translate('Quality'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
@@ -97,64 +97,64 @@ export const defaultState = {
|
||||
},
|
||||
{
|
||||
name: 'customFormatScore',
|
||||
columnLabel: () => translate('CustomFormatScore'),
|
||||
columnLabel: translate('CustomFormatScore'),
|
||||
label: React.createElement(Icon, {
|
||||
name: icons.SCORE,
|
||||
title: () => translate('CustomFormatScore')
|
||||
title: translate('CustomFormatScore')
|
||||
}),
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'protocol',
|
||||
label: () => translate('Protocol'),
|
||||
label: translate('Protocol'),
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'indexer',
|
||||
label: () => translate('Indexer'),
|
||||
label: translate('Indexer'),
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'downloadClient',
|
||||
label: () => translate('DownloadClient'),
|
||||
label: translate('DownloadClient'),
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'title',
|
||||
label: () => translate('ReleaseTitle'),
|
||||
label: translate('ReleaseTitle'),
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'size',
|
||||
label: () => translate('Size'),
|
||||
label: translate('Size'),
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'outputPath',
|
||||
label: () => translate('OutputPath'),
|
||||
label: translate('OutputPath'),
|
||||
isSortable: false,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'estimatedCompletionTime',
|
||||
label: () => translate('TimeLeft'),
|
||||
label: translate('TimeLeft'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'progress',
|
||||
label: () => translate('Progress'),
|
||||
label: translate('Progress'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
columnLabel: () => translate('Actions'),
|
||||
columnLabel: translate('Actions'),
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ export const defaultState = {
|
||||
},
|
||||
{
|
||||
name: 'customFormatScore',
|
||||
label: () => translate('CustomFormatScore'),
|
||||
label: translate('CustomFormatScore'),
|
||||
type: filterBuilderTypes.NUMBER
|
||||
},
|
||||
{
|
||||
|
||||
@@ -82,34 +82,34 @@ export const defaultState = {
|
||||
columns: [
|
||||
{
|
||||
name: 'level',
|
||||
columnLabel: () => translate('Level'),
|
||||
columnLabel: translate('Level'),
|
||||
isSortable: false,
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
},
|
||||
{
|
||||
name: 'time',
|
||||
label: () => translate('Time'),
|
||||
label: translate('Time'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
},
|
||||
{
|
||||
name: 'logger',
|
||||
label: () => translate('Component'),
|
||||
label: translate('Component'),
|
||||
isSortable: false,
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
},
|
||||
{
|
||||
name: 'message',
|
||||
label: () => translate('Message'),
|
||||
label: translate('Message'),
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
columnLabel: () => translate('Actions'),
|
||||
columnLabel: translate('Actions'),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
isModifiable: false
|
||||
|
||||
@@ -36,17 +36,10 @@ function mergeColumns(path, initialState, persistedState, computedState) {
|
||||
const column = initialColumns.find((i) => i.name === persistedColumn.name);
|
||||
|
||||
if (column) {
|
||||
const newColumn = {};
|
||||
|
||||
// We can't use a spread operator or Object.assign to clone the column
|
||||
// or any accessors are lost and can break translations.
|
||||
for (const prop of Object.keys(column)) {
|
||||
Object.defineProperty(newColumn, prop, Object.getOwnPropertyDescriptor(column, prop));
|
||||
}
|
||||
|
||||
newColumn.isVisible = persistedColumn.isVisible;
|
||||
|
||||
columns.push(newColumn);
|
||||
columns.push({
|
||||
...column,
|
||||
isVisible: persistedColumn.isVisible
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -21,17 +21,17 @@ const columns = [
|
||||
},
|
||||
{
|
||||
name: 'name',
|
||||
label: () => translate('Name'),
|
||||
label: 'Name',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'size',
|
||||
label: () => translate('Size'),
|
||||
label: 'Size',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'time',
|
||||
label: () => translate('Time'),
|
||||
label: 'Time',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
|
||||
@@ -19,12 +19,12 @@ import LogFilesTableRow from './LogFilesTableRow';
|
||||
const columns = [
|
||||
{
|
||||
name: 'filename',
|
||||
label: () => translate('Filename'),
|
||||
label: 'Filename',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'lastWriteTime',
|
||||
label: () => translate('LastWriteTime'),
|
||||
label: 'Last Write Time',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
|
||||
@@ -15,17 +15,17 @@ import styles from './DiskSpace.css';
|
||||
const columns = [
|
||||
{
|
||||
name: 'path',
|
||||
label: () => translate('Location'),
|
||||
label: 'Location',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'freeSpace',
|
||||
label: () => translate('FreeSpace'),
|
||||
label: 'Free Space',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'totalSpace',
|
||||
label: () => translate('TotalSpace'),
|
||||
label: 'Total Space',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
|
||||
@@ -95,12 +95,12 @@ const columns = [
|
||||
},
|
||||
{
|
||||
name: 'message',
|
||||
label: () => translate('Message'),
|
||||
label: 'Message',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
label: () => translate('Actions'),
|
||||
label: 'Actions',
|
||||
isVisible: true
|
||||
}
|
||||
];
|
||||
|
||||
@@ -15,27 +15,27 @@ const columns = [
|
||||
},
|
||||
{
|
||||
name: 'commandName',
|
||||
label: () => translate('Name'),
|
||||
label: translate('Name'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'queued',
|
||||
label: () => translate('Queued'),
|
||||
label: translate('Queued'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'started',
|
||||
label: () => translate('Started'),
|
||||
label: translate('Started'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'ended',
|
||||
label: () => translate('Ended'),
|
||||
label: translate('Ended'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'duration',
|
||||
label: () => translate('Duration'),
|
||||
label: translate('Duration'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
|
||||
@@ -10,27 +10,27 @@ import ScheduledTaskRowConnector from './ScheduledTaskRowConnector';
|
||||
const columns = [
|
||||
{
|
||||
name: 'name',
|
||||
label: () => translate('Name'),
|
||||
label: 'Name',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'interval',
|
||||
label: () => translate('Interval'),
|
||||
label: 'Interval',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'lastExecution',
|
||||
label: () => translate('LastExecution'),
|
||||
label: 'Last Execution',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'lastDuration',
|
||||
label: () => translate('LastDuration'),
|
||||
label: 'Last Duration',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'nextExecution',
|
||||
label: () => translate('NextExecution'),
|
||||
label: 'Next Execution',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
|
||||
@@ -4,14 +4,14 @@ function getTranslations() {
|
||||
return createAjaxRequest({
|
||||
global: false,
|
||||
dataType: 'json',
|
||||
url: '/localization',
|
||||
url: '/localization'
|
||||
}).request;
|
||||
}
|
||||
|
||||
let translations: Record<string, string> = {};
|
||||
let translations = {};
|
||||
|
||||
export async function fetchTranslations(): Promise<boolean> {
|
||||
return new Promise(async (resolve) => {
|
||||
export function fetchTranslations() {
|
||||
return new Promise(async(resolve) => {
|
||||
try {
|
||||
const data = await getTranslations();
|
||||
translations = data.Strings;
|
||||
@@ -23,19 +23,12 @@ export async function fetchTranslations(): Promise<boolean> {
|
||||
});
|
||||
}
|
||||
|
||||
export default function translate(
|
||||
key: string,
|
||||
args?: (string | number | boolean)[]
|
||||
) {
|
||||
if (!(key in translations)) {
|
||||
console.debug(key);
|
||||
}
|
||||
|
||||
export default function translate(key, args = []) {
|
||||
const translation = translations[key] || key;
|
||||
|
||||
if (args) {
|
||||
return translation.replace(/\{(\d+)\}/g, (match, index) => {
|
||||
return String(args[index]) ?? match;
|
||||
return args[index];
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
import { createBrowserHistory } from 'history';
|
||||
import React from 'react';
|
||||
import { render } from 'react-dom';
|
||||
import createAppStore from 'Store/createAppStore';
|
||||
import App from './App/App';
|
||||
|
||||
export async function bootstrap() {
|
||||
const history = createBrowserHistory();
|
||||
const store = createAppStore(history);
|
||||
|
||||
render(
|
||||
<App store={store} history={history} />,
|
||||
document.getElementById('root')
|
||||
);
|
||||
}
|
||||
@@ -48,15 +48,7 @@
|
||||
/>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/Content/Fonts/fonts.css">
|
||||
|
||||
<script>
|
||||
window.Readarr = {
|
||||
urlBase: '__URL_BASE__'
|
||||
};
|
||||
</script>
|
||||
|
||||
<% for (key in htmlWebpackPlugin.files.js) { %><script type="text/javascript" src="<%= htmlWebpackPlugin.files.js[key] %>" data-no-hash></script><% } %>
|
||||
<% for (key in htmlWebpackPlugin.files.css) { %><link href="<%= htmlWebpackPlugin.files.css[key] %>" rel="stylesheet"></link><% } %>
|
||||
<!-- webpack bundles head -->
|
||||
|
||||
<title>Readarr</title>
|
||||
|
||||
@@ -85,4 +77,7 @@
|
||||
<div id="portal-root"></div>
|
||||
<div id="root" class="root"></div>
|
||||
</body>
|
||||
|
||||
<script src="/initialize.js" data-no-hash></script>
|
||||
<!-- webpack bundles body -->
|
||||
</html>
|
||||
|
||||
26
frontend/src/index.js
Normal file
26
frontend/src/index.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import { createBrowserHistory } from 'history';
|
||||
import React from 'react';
|
||||
import { render } from 'react-dom';
|
||||
import { fetchTranslations } from 'Utilities/String/translate';
|
||||
|
||||
import './preload';
|
||||
import './polyfills';
|
||||
import 'Styles/globals.css';
|
||||
import './index.css';
|
||||
|
||||
const history = createBrowserHistory();
|
||||
const hasTranslationsError = !await fetchTranslations();
|
||||
|
||||
const { default: createAppStore } = await import('Store/createAppStore');
|
||||
const { default: App } = await import('./App/App');
|
||||
|
||||
const store = createAppStore(history);
|
||||
|
||||
render(
|
||||
<App
|
||||
store={store}
|
||||
history={history}
|
||||
hasTranslationsError={hasTranslationsError}
|
||||
/>,
|
||||
document.getElementById('root')
|
||||
);
|
||||
@@ -1,19 +0,0 @@
|
||||
import './polyfills';
|
||||
import 'Styles/globals.css';
|
||||
import './index.css';
|
||||
|
||||
const initializeUrl = `${
|
||||
window.Readarr.urlBase
|
||||
}/initialize.json?t=${Date.now()}`;
|
||||
const response = await fetch(initializeUrl);
|
||||
|
||||
window.Readarr = await response.json();
|
||||
|
||||
/* eslint-disable no-undef, @typescript-eslint/ban-ts-comment */
|
||||
// @ts-ignore 2304
|
||||
__webpack_public_path__ = `${window.Readarr.urlBase}/`;
|
||||
/* eslint-enable no-undef, @typescript-eslint/ban-ts-comment */
|
||||
|
||||
const { bootstrap } = await import('./bootstrap');
|
||||
|
||||
await bootstrap();
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "esnext",
|
||||
"target": "es6",
|
||||
"allowJs": true,
|
||||
"checkJs": false,
|
||||
"baseUrl": "src",
|
||||
"jsx": "react",
|
||||
"module": "esnext",
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
"author": "Team Readarr",
|
||||
"license": "GPL-3.0",
|
||||
"readmeFilename": "readme.md",
|
||||
"main": "index.ts",
|
||||
"main": "index.js",
|
||||
"browserslist": [
|
||||
"defaults"
|
||||
],
|
||||
@@ -97,7 +97,6 @@
|
||||
"@babel/preset-env": "7.22.9",
|
||||
"@babel/preset-react": "7.22.5",
|
||||
"@babel/preset-typescript": "7.22.5",
|
||||
"@types/lodash": "4.14.197",
|
||||
"@types/redux-actions": "2.6.2",
|
||||
"@typescript-eslint/eslint-plugin": "6.0.0",
|
||||
"@typescript-eslint/parser": "6.0.0",
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace NzbDrone.Automation.Test
|
||||
|
||||
_runner = new NzbDroneRunner(LogManager.GetCurrentClassLogger(), null);
|
||||
_runner.KillAll();
|
||||
_runner.Start();
|
||||
_runner.Start(true);
|
||||
|
||||
driver.Url = "http://localhost:8787";
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace NzbDrone.Core.Authentication
|
||||
{
|
||||
public enum AuthenticationRequiredType
|
||||
{
|
||||
Enabled = 0,
|
||||
DisabledForLocalAddresses = 1
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,10 @@
|
||||
namespace NzbDrone.Core.Authentication
|
||||
namespace NzbDrone.Core.Authentication
|
||||
{
|
||||
public enum AuthenticationType
|
||||
{
|
||||
None = 0,
|
||||
Basic = 1,
|
||||
Forms = 2
|
||||
Forms = 2,
|
||||
External = 3
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace NzbDrone.Core.Configuration
|
||||
bool EnableSsl { get; }
|
||||
bool LaunchBrowser { get; }
|
||||
AuthenticationType AuthenticationMethod { get; }
|
||||
AuthenticationRequiredType AuthenticationRequired { get; }
|
||||
bool AnalyticsEnabled { get; }
|
||||
string LogLevel { get; }
|
||||
string ConsoleLogLevel { get; }
|
||||
@@ -190,6 +191,8 @@ namespace NzbDrone.Core.Configuration
|
||||
}
|
||||
}
|
||||
|
||||
public AuthenticationRequiredType AuthenticationRequired => GetValueEnum("AuthenticationRequired", AuthenticationRequiredType.Enabled);
|
||||
|
||||
public bool AnalyticsEnabled => GetValueBoolean("AnalyticsEnabled", true, persist: false);
|
||||
|
||||
// TODO: Change back to "master" for the first stable release
|
||||
|
||||
@@ -74,19 +74,10 @@ namespace NzbDrone.Core.Download
|
||||
{
|
||||
var result = base.Test(definition);
|
||||
|
||||
if (definition.Id == 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if (result == null || result.IsValid)
|
||||
if ((result == null || result.IsValid) && definition.Id != 0)
|
||||
{
|
||||
_downloadClientStatusService.RecordSuccess(definition.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
_downloadClientStatusService.RecordFailure(definition.Id);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -12,10 +12,5 @@ namespace NzbDrone.Core.Extras.Files
|
||||
public DateTime Added { get; set; }
|
||||
public DateTime LastUpdated { get; set; }
|
||||
public string Extension { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"[{Id}] {RelativePath}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,8 +81,6 @@ namespace NzbDrone.Core.Extras.Files
|
||||
|
||||
protected TExtraFile MoveFile(Author author, BookFile bookFile, TExtraFile extraFile, string fileNameSuffix = null)
|
||||
{
|
||||
_logger.Trace("Renaming extra file: {0}", extraFile);
|
||||
|
||||
var newFolder = Path.GetDirectoryName(bookFile.Path);
|
||||
var filenameBuilder = new StringBuilder(Path.GetFileNameWithoutExtension(bookFile.Path));
|
||||
|
||||
@@ -100,13 +98,9 @@ namespace NzbDrone.Core.Extras.Files
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.Trace("Renaming extra file: {0} to {1}", extraFile, newFileName);
|
||||
|
||||
_diskProvider.MoveFile(existingFileName, newFileName);
|
||||
extraFile.RelativePath = author.Path.GetRelativePath(newFileName);
|
||||
|
||||
_logger.Trace("Renamed extra file from: {0}", extraFile);
|
||||
|
||||
return extraFile;
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -75,19 +75,10 @@ namespace NzbDrone.Core.ImportLists
|
||||
{
|
||||
var result = base.Test(definition);
|
||||
|
||||
if (definition.Id == 0)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if (result == null || result.IsValid)
|
||||
if ((result == null || result.IsValid) && definition.Id != 0)
|
||||
{
|
||||
_importListStatusService.RecordSuccess(definition.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
_importListStatusService.RecordFailure(definition.Id);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -441,6 +441,7 @@
|
||||
"SslPortHelpTextWarning": "يتطلب إعادة التشغيل ليصبح ساري المفعول",
|
||||
"DownloadClientCheckDownloadingToRoot": "يقوم برنامج التنزيل {0} بوضع التنزيلات في المجلد الجذر {1}. يجب ألا تقوم بالتنزيل إلى مجلد جذر.",
|
||||
"Progress": "التقدم",
|
||||
"UI": "واجهة المستخدم",
|
||||
"ReplaceIllegalCharactersHelpText": "استبدل الأحرف غير القانونية. إذا لم يتم تحديده ، فسوف يقوم Radarr بإزالتها بدلاً من ذلك",
|
||||
"ReleaseTitle": "عنوان الإصدار",
|
||||
"Actions": "أجراءات",
|
||||
|
||||
@@ -441,6 +441,7 @@
|
||||
"SslCertPathHelpTextWarning": "Изисква рестартиране, за да влезе в сила",
|
||||
"DownloadClientCheckDownloadingToRoot": "Клиентът за изтегляне {0} поставя изтеглянията в основната папка {1}. Не трябва да изтегляте в основна папка.",
|
||||
"ReplaceIllegalCharactersHelpText": "Заменете незаконните символи. Ако не е отметнато, Radarr ще ги премахне вместо това",
|
||||
"UI": "Потребителски интерфейс",
|
||||
"Actions": "Действия",
|
||||
"Tomorrow": "Утре",
|
||||
"Today": "Днес",
|
||||
|
||||
@@ -299,6 +299,7 @@
|
||||
"StartupDirectory": "Directori d'inici",
|
||||
"Test": "Prova",
|
||||
"ThisCannotBeCancelled": "No es pot cancel·lar un cop iniciat sense desactivar tots els vostres indexadors.",
|
||||
"UI": "Interfície",
|
||||
"UISettings": "Configuració de la interfície",
|
||||
"UISettingsSummary": "Opcions de calendari, data i color alternats",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "No es pot afegir un nou client de descàrrega, torneu-ho a provar.",
|
||||
|
||||
@@ -440,6 +440,7 @@
|
||||
"Year": "Rok",
|
||||
"YesCancel": "Ano, zrušit",
|
||||
"DownloadClientCheckDownloadingToRoot": "Stahovací klient {0} umístí stažené soubory do kořenové složky {1}. Neměli byste stahovat do kořenové složky.",
|
||||
"UI": "UI",
|
||||
"ReplaceIllegalCharactersHelpText": "Nahraďte nepovolené znaky. Pokud není zaškrtnuto, radarr je místo toho odstraní",
|
||||
"OutputPath": "Výstupní cesta",
|
||||
"Actions": "Akce",
|
||||
|
||||
@@ -443,6 +443,7 @@
|
||||
"ReplaceIllegalCharactersHelpText": "Udskift ulovlige tegn. Hvis det ikke er markeret, fjerner Radarr dem i stedet",
|
||||
"ReleaseTitle": "Udgiv titel",
|
||||
"Actions": "Handlinger",
|
||||
"UI": "UI",
|
||||
"Tomorrow": "I morgen",
|
||||
"Today": "I dag",
|
||||
"Progress": "Fremskridt",
|
||||
|
||||
@@ -489,6 +489,7 @@
|
||||
"PortHelpText": "Calibre-Content-Server",
|
||||
"Progress": "Fortschritt",
|
||||
"ReleaseTitle": "Release Titel",
|
||||
"UI": "Oberfläche",
|
||||
"Actions": "Aktionen",
|
||||
"Today": "Heute",
|
||||
"Tomorrow": "Morgen",
|
||||
|
||||
@@ -441,6 +441,7 @@
|
||||
"UnableToLoadMetadataProfiles": "Δεν είναι δυνατή η φόρτωση των Καθυστέρησης προφίλ",
|
||||
"DownloadClientCheckDownloadingToRoot": "Λήψη προγράμματος-πελάτη {0} τοποθετεί λήψεις στον ριζικό φάκελο {1}. Δεν πρέπει να κάνετε λήψη σε έναν ριζικό φάκελο.",
|
||||
"ReplaceIllegalCharactersHelpText": "Αντικαταστήστε τους παράνομους χαρακτήρες. Εάν δεν είναι επιλεγμένο, το Radarr θα τα καταργήσει",
|
||||
"UI": "Διεπαφή χρήστη",
|
||||
"Tomorrow": "Αύριο",
|
||||
"Today": "Σήμερα",
|
||||
"Actions": "Ενέργειες",
|
||||
|
||||
@@ -6,12 +6,10 @@
|
||||
"ASIN": "ASIN",
|
||||
"About": "About",
|
||||
"Actions": "Actions",
|
||||
"Activity": "Activity",
|
||||
"AddImportListExclusionHelpText": "Prevent book from being added to Readarr by Import Lists or Author Refresh",
|
||||
"AddList": "Add List",
|
||||
"AddListExclusion": "Add List Exclusion",
|
||||
"AddMissing": "Add missing",
|
||||
"AddNew": "Add New",
|
||||
"AddNewItem": "Add New Item",
|
||||
"AddedAuthorSettings": "Added Author Settings",
|
||||
"AddingTag": "Adding tag",
|
||||
@@ -63,7 +61,6 @@
|
||||
"Automatic": "Automatic",
|
||||
"AutomaticAdd": "Automatic Add",
|
||||
"AutomaticallySwitchEdition": "Automatically Switch Edition",
|
||||
"Backup": "Backup",
|
||||
"BackupFolderHelpText": "Relative paths will be under Readarr's AppData directory",
|
||||
"BackupIntervalHelpText": "Interval to backup the Readarr DB and settings",
|
||||
"BackupNow": "Backup Now",
|
||||
@@ -92,7 +89,6 @@
|
||||
"BookTitle": "Book Title",
|
||||
"Books": "Books",
|
||||
"BooksTotal": "Books ({0})",
|
||||
"Bookshelf": "Bookshelf",
|
||||
"Branch": "Branch",
|
||||
"BypassIfAboveCustomFormatScore": "Bypass if Above Custom Format Score",
|
||||
"BypassIfAboveCustomFormatScoreHelpText": "Enable bypass when release has a score higher than the configured minimum custom format score",
|
||||
@@ -300,7 +296,6 @@
|
||||
"EntityName": "Entity Name",
|
||||
"ErrorLoadingContents": "Error loading contents",
|
||||
"ErrorLoadingPreviews": "Error loading previews",
|
||||
"Events": "Events",
|
||||
"Exception": "Exception",
|
||||
"ExistingBooks": "Existing Books",
|
||||
"ExistingItems": "Existing Items",
|
||||
@@ -336,7 +331,6 @@
|
||||
"ForeignId": "Foreign ID",
|
||||
"ForeignIdHelpText": "The Musicbrainz Id of the author/book to exclude",
|
||||
"Formats": "Formats",
|
||||
"FreeSpace": "Free Space",
|
||||
"FutureBooks": "Future Books",
|
||||
"FutureDays": "Future Days",
|
||||
"FutureDaysHelpText": "Days for iCal feed to look into the future",
|
||||
@@ -437,14 +431,9 @@
|
||||
"ItsEasyToAddANewAuthorOrBookJustStartTypingTheNameOfTheItemYouWantToAdd": "It's easy to add a New Author or Book just start typing the name of the item you want to add",
|
||||
"Label": "Label",
|
||||
"Language": "Language",
|
||||
"Large": "Large",
|
||||
"LastDuration": "Last Duration",
|
||||
"LastExecution": "Last Execution",
|
||||
"LastWriteTime": "Last Write Time",
|
||||
"LatestBook": "Latest Book",
|
||||
"LaunchBrowserHelpText": " Open a web browser and navigate to Readarr homepage on app start.",
|
||||
"Level": "Level",
|
||||
"Library": "Library",
|
||||
"LibraryHelpText": "Calibre content server library name. Leave blank for default.",
|
||||
"ListRefreshInterval": "List Refresh Interval",
|
||||
"ListWillRefreshEveryInterp": "List will refresh every {0}",
|
||||
@@ -455,7 +444,6 @@
|
||||
"LoadingBooksFailed": "Loading books failed",
|
||||
"LoadingEditionsFailed": "Loading editions failed",
|
||||
"Local": "Local",
|
||||
"Location": "Location",
|
||||
"LogFiles": "Log Files",
|
||||
"LogLevel": "Log Level",
|
||||
"LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "Trace logging should only be enabled temporarily",
|
||||
@@ -488,7 +476,6 @@
|
||||
"MediaManagement": "Media Management",
|
||||
"MediaManagementSettings": "Media Management Settings",
|
||||
"MediaManagementSettingsSummary": "Naming, file management settings and root folders",
|
||||
"Medium": "Medium",
|
||||
"Message": "Message",
|
||||
"Metadata": "Metadata",
|
||||
"MetadataConsumers": "Metadata Consumers",
|
||||
@@ -554,7 +541,6 @@
|
||||
"Negated": "Negated",
|
||||
"New": "New",
|
||||
"NewBooks": "New Books",
|
||||
"NextExecution": "Next Execution",
|
||||
"No": "No",
|
||||
"NoBackupsAreAvailable": "No backups are available",
|
||||
"NoChange": "No Change",
|
||||
@@ -842,7 +828,6 @@
|
||||
"SkipRedownload": "Skip Redownload",
|
||||
"SkipRedownloadHelpText": "Prevents Readarr from trying download alternative releases for the removed items",
|
||||
"SkipSecondarySeriesBooks": "Skip secondary series books",
|
||||
"Small": "Small",
|
||||
"SmartReplace": "Smart Replace",
|
||||
"SorryThatAuthorCannotBeFound": "Sorry, that author cannot be found.",
|
||||
"SorryThatBookCannotBeFound": "Sorry, that book cannot be found.",
|
||||
@@ -869,7 +854,6 @@
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "Search is not supported with this indexer",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Will be used when automatic searches are performed via the UI or by Readarr",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Will be used when interactive search is used",
|
||||
"System": "System",
|
||||
"SystemTimeCheckMessage": "System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Tag is not used and can be deleted",
|
||||
"Tags": "Tags",
|
||||
@@ -902,16 +886,15 @@
|
||||
"Torrents": "Torrents",
|
||||
"TotalBookCountBooksTotalBookFileCountBooksWithFilesInterp": "{0} books total. {1} books with files.",
|
||||
"TotalFileSize": "Total File Size",
|
||||
"TotalSpace": "Total Space",
|
||||
"TrackNumber": "Track Number",
|
||||
"TrackTitle": "Track Title",
|
||||
"UI": "UI",
|
||||
"UILanguage": "UI Language",
|
||||
"UILanguageHelpText": "Language that Readarr will use for UI",
|
||||
"UILanguageHelpTextWarning": "Browser Reload Required",
|
||||
"UISettings": "UI Settings",
|
||||
"UISettingsSummary": "Calendar, date and color impaired options",
|
||||
"URLBase": "URL Base",
|
||||
"Ui": "UI",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Unable to add a new download client, please try again.",
|
||||
"UnableToAddANewImportListExclusionPleaseTryAgain": "Unable to add a new import list exclusion, please try again.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Unable to add a new indexer, please try again.",
|
||||
@@ -949,7 +932,7 @@
|
||||
"UnableToLoadTheCalendar": "Unable to load the calendar",
|
||||
"UnableToLoadUISettings": "Unable to load UI settings",
|
||||
"Ungroup": "Ungroup",
|
||||
"UnmappedFiles": "Unmapped Files",
|
||||
"UnmappedFiles": "UnmappedFiles",
|
||||
"Unmonitored": "Unmonitored",
|
||||
"UnmonitoredHelpText": "Include unmonitored books in the iCal feed",
|
||||
"UnselectAll": "Unselect All",
|
||||
|
||||
@@ -446,6 +446,7 @@
|
||||
"Today": "Hoy",
|
||||
"ReleaseTitle": "Título del Estreno",
|
||||
"Progress": "Progreso",
|
||||
"UI": "UI",
|
||||
"Tomorrow": "mañana",
|
||||
"OutputPath": "Ruta de Output",
|
||||
"BookAvailableButMissing": "Película Disponible pero Ausente",
|
||||
|
||||
@@ -443,6 +443,7 @@
|
||||
"ReplaceIllegalCharactersHelpText": "Korvaa laittomat merkit. Jos ei käytössä, laittomat merkit poistetaan.",
|
||||
"OutputPath": "Tallennussijainti",
|
||||
"Progress": "Edistyminen",
|
||||
"UI": "Käyttöliittymä",
|
||||
"Actions": "Toiminnot",
|
||||
"ReleaseTitle": "Julkaisun otsikko",
|
||||
"Today": "Tänään",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"60MinutesSixty": "60 Minutes: {0}",
|
||||
"APIKey": "Clé API",
|
||||
"About": "À propos",
|
||||
"AddListExclusion": "Ajouter une liste d'exclusion",
|
||||
"AddListExclusion": "Ajouter une exclusion de liste",
|
||||
"BindAddressHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"ApiKeyHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"Branch": "Branche",
|
||||
@@ -25,9 +25,9 @@
|
||||
"UnableToLoadMetadataProfiles": "Impossible de charger les profils de délai",
|
||||
"AddingTag": "Ajouter un tag",
|
||||
"AgeWhenGrabbed": "Age (au moment du téléchargement)",
|
||||
"AlreadyInYourLibrary": "Déjà disponible dans votre librairie",
|
||||
"AlreadyInYourLibrary": "Déjà présent dans votre collection",
|
||||
"AlternateTitles": "Titre alternatif",
|
||||
"Analytics": "Statistiques",
|
||||
"Analytics": "Analytique",
|
||||
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Readarr. Cela inclut des informations sur votre navigateur, quelle page de l'interface web Readarr vous utilisez, les rapports d'erreur ainsi que le SE et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.",
|
||||
"AnalyticsEnabledHelpTextWarning": "Nécessite un redémarrage pour prendre effet",
|
||||
"AppDataDirectory": "Dossier AppData",
|
||||
@@ -43,7 +43,7 @@
|
||||
"BackupRetentionHelpText": "Les sauvegardes automatiques plus anciennes que la période de conservation seront automatiquement effacées",
|
||||
"Backups": "Sauvegardes",
|
||||
"BindAddress": "Adresse d'attache",
|
||||
"BindAddressHelpText": "Adresse IP valide, localhost ou '*' pour toutes les interfaces",
|
||||
"BindAddressHelpText": "Adresse IPv4 valide, localhost ou '*' pour toutes les interfaces",
|
||||
"BookIsDownloading": "Le livre est en cours de téléchargement",
|
||||
"BookIsDownloadingInterp": "Le livre est en cours de téléchargement - {0}% {1}",
|
||||
"BypassProxyForLocalAddresses": "Contourner le proxy pour les adresses locales",
|
||||
@@ -63,8 +63,8 @@
|
||||
"Clear": "Effacer",
|
||||
"ClickToChangeQuality": "Cliquer pour changer la qualité",
|
||||
"ClientPriority": "Priorité du client",
|
||||
"CloneIndexer": "Dupliqué l'indexeur",
|
||||
"CloneProfile": "Dupliqué le profil",
|
||||
"CloneIndexer": "Cloner l'indexeur",
|
||||
"CloneProfile": "Cloner le profil",
|
||||
"Close": "Fermer",
|
||||
"Columns": "Colonnes",
|
||||
"CompletedDownloadHandling": "Gestion des téléchargements terminés",
|
||||
@@ -462,6 +462,7 @@
|
||||
"ShowReleaseDate": "Afficher la date de sortie",
|
||||
"ShowTitle": "Afficher le titre",
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "Le dossier '{0}' et son contenu vont être supprimés.",
|
||||
"UI": "UI",
|
||||
"ReplaceIllegalCharactersHelpText": "Remplacer les caractères illégaux. Si non cochée, Readarr les supprimera à la place",
|
||||
"Level": "Niveau",
|
||||
"Publisher": "Éditeur",
|
||||
@@ -472,7 +473,7 @@
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "La branche {0} n'est pas une branche de version Readarr valide, vous ne recevrez pas de mises à jour",
|
||||
"Time": "Heure",
|
||||
"Blocklist": "Liste noire",
|
||||
"BlocklistRelease": "Version sur liste noire",
|
||||
"BlocklistRelease": "Mettre cette release sur la liste noire",
|
||||
"RescanAfterRefreshHelpText": "Réanalyser le dossier de l'auteur après avoir actualisé l'auteur",
|
||||
"ShowUnknownAuthorItems": "Afficher les éléments avec auteur inconnu",
|
||||
"SelectAll": "Tout sélectionner",
|
||||
@@ -483,7 +484,7 @@
|
||||
"All": "Tout",
|
||||
"Wanted": "Recherché",
|
||||
"CreateEmptyAuthorFolders": "Créer des dossiers auteurs vides",
|
||||
"AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible afin empêcher la suppression de AppData lors de la mise à jour",
|
||||
"AppDataLocationHealthCheckMessage": "La mise à jour ne sera pas possible pour empêcher la suppression de AppData lors de la mise à jour",
|
||||
"IndexerPriorityHelpText": "Priorité de l'indexeur de 1 (la plus élevée) à 50 (la plus basse). Par défaut : 25. Utilisé pour départager les versions lors des téléchargements. Readarr continuera d'utiliser tous les indexeurs activés pour les synchro RSS et les recherches.",
|
||||
"Duration": "Durée",
|
||||
"RemotePathMappingCheckBadDockerPath": "Vous utilisez docker ; le client de téléchargement {0} enregistre les téléchargements dans {1} mais ce n'est pas un chemin valide. Vérifiez vos paramètres de dossier distant et les paramètres de votre client de téléchargement.",
|
||||
@@ -663,7 +664,7 @@
|
||||
"MetadataProfile": "profil de métadonnées",
|
||||
"StatusEndedContinuing": "Continuant",
|
||||
"Database": "Base de données",
|
||||
"ApplicationUrlHelpText": "URL externe de cette application, y compris http(s)://, le port ainsi que la base de URL",
|
||||
"ApplicationUrlHelpText": "URL externe de cette application, y compris http(s)://, le port et l'URL de base",
|
||||
"ApplicationURL": "URL de l'application",
|
||||
"ImportListExclusions": "Supprimer les exclusions de liste d'imports",
|
||||
"ChooseImportMethod": "Choisir une méthode d'importation",
|
||||
@@ -680,7 +681,7 @@
|
||||
"Theme": "Thème",
|
||||
"ThemeHelpText": "Changez le thème de l'interface de l'application. Le thème \"Auto\" utilisera celui de votre système d'exploitation pour définir le mode clair ou foncé. Inspiré par Theme.Park",
|
||||
"EnableRssHelpText": "Sera utilisé lorsque Readarr recherche périodiquement des sorties via la synchronisation RSS",
|
||||
"CloneCustomFormat": "Dupliqué le format personnalisé",
|
||||
"CloneCustomFormat": "Cloner le format personnalisé",
|
||||
"Conditions": "Conditions",
|
||||
"CopyToClipboard": "Copier dans le presse-papier",
|
||||
"CustomFormat": "Format Personnalisé",
|
||||
@@ -734,7 +735,7 @@
|
||||
"ResetQualityDefinitions": "Réinitialiser les définitions de qualité",
|
||||
"ResetQualityDefinitionsMessageText": "Êtes-vous sûr de vouloir réinitialiser les définitions de qualité ?",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Comment appliquer des étiquettes aux indexeurs sélectionnés",
|
||||
"ApplyTagsHelpTextRemove": "Suprimer : Suprime les étiquettes renseignées",
|
||||
"ApplyTagsHelpTextRemove": "Retirer : Retire les étiquettes renseignées",
|
||||
"AutomaticAdd": "Ajout automatique",
|
||||
"BlocklistReleaseHelpText": "Empêche Lidarr de récupérer automatiquement cette version",
|
||||
"NoChange": "Pas de changement",
|
||||
@@ -746,9 +747,9 @@
|
||||
"RemoveFailed": "Echec de la suppression",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Comment appliquer des tags au film sélectionné",
|
||||
"ApplyChanges": "Appliquer les modifications",
|
||||
"ApplyTagsHelpTextAdd": "Ajouter : Ajouter les tags à la liste de tags existantes",
|
||||
"ApplyTagsHelpTextAdd": "Ajouter : Ajouter les étiquettes à la liste des étiquettes existantes",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Comment appliquer des tags au film sélectionné",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des tags aux indexeurs sélectionnés",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Comment appliquer des étiquettes aux indexeurs sélectionnés",
|
||||
"ApplyTagsHelpTextReplace": "Remplacer : Remplace les tags par les tags renseignés (ne pas renseigner de tags pour effacer tous les tags)",
|
||||
"CountIndexersSelected": "{0} indexeur(s) sélectionné(s)",
|
||||
"DeleteSelectedDownloadClients": "Supprimer le client de téléchargement",
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
"IncludeHealthWarningsHelpText": "כלול אזהרות בריאות",
|
||||
"IncludeUnknownAuthorItemsHelpText": "הצג פריטים ללא סרט בתור. זה יכול לכלול סרטים שהוסרו או כל דבר אחר בקטגוריה של Radarr",
|
||||
"IncludeUnmonitored": "כלול ללא פיקוח",
|
||||
"Indexer": "אינדקסר",
|
||||
"Indexer": "מַפתְחָן",
|
||||
"IndexerSettings": "הגדרות אינדקס",
|
||||
"Indexers": "אינדקסים",
|
||||
"Interval": "הַפסָקָה",
|
||||
@@ -440,6 +440,7 @@
|
||||
"SslCertPasswordHelpTextWarning": "נדרש הפעלה מחדש כדי להיכנס לתוקף",
|
||||
"UnableToLoadMetadataProfiles": "לא ניתן לטעון פרופילי עיכוב",
|
||||
"DownloadClientCheckDownloadingToRoot": "הורד לקוח {0} ממקם הורדות בתיקיית הבסיס {1}. אתה לא צריך להוריד לתיקיית שורש.",
|
||||
"UI": "ממשק משתמש",
|
||||
"ReleaseTitle": "שחרר את הכותרת",
|
||||
"NotAvailable": "לא זמין",
|
||||
"Progress": "התקדמות",
|
||||
|
||||
@@ -452,6 +452,7 @@
|
||||
"ShowReleaseDate": "रिलीज की तारीख दिखाएँ",
|
||||
"ShowTitle": "शीर्षक दिखाओ",
|
||||
"Tomorrow": "आने वाला कल",
|
||||
"UI": "यूआई",
|
||||
"OutputPath": "उत्पादन के पथ",
|
||||
"RemoveFromBlocklist": "ब्लैकलिस्ट से निकालें",
|
||||
"UnableToLoadBlocklist": "ब्लैकलिस्ट लोड करने में असमर्थ",
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
"Theme": "Tema",
|
||||
"Title": "Naslov",
|
||||
"Torrents": "Torrenti",
|
||||
"UI": "Korisničko sučelje",
|
||||
"URLBase": "URL Base",
|
||||
"Usenet": "Usenet",
|
||||
"Analytics": "Analitika",
|
||||
|
||||
@@ -657,6 +657,7 @@
|
||||
"WriteAudioTagsScrub": "Meglévő címkék törlése",
|
||||
"WriteAudioTags": "Audiófájlok címkézése metaadatokkal",
|
||||
"AudioFileMetadata": "Metaadatok írása az Audió fájl(ok)ba",
|
||||
"UI": "Felület",
|
||||
"Tomorrow": "Holnap",
|
||||
"Today": "Ma",
|
||||
"ReleaseTitle": "Kiadás címe",
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
"ShowTitle": "Sýna titil",
|
||||
"Today": "Í dag",
|
||||
"Tomorrow": "Á morgun",
|
||||
"UI": "HÍ",
|
||||
"Level": "Stig",
|
||||
"RemoveFromBlocklist": "Fjarlægja af svörtum lista",
|
||||
"UnableToLoadBlocklist": "Ekki er hægt að hlaða svartan lista",
|
||||
|
||||
@@ -454,6 +454,7 @@
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "La cartella del film \"{0}\" e tutto il suo contenuto verranno eliminati.",
|
||||
"Today": "Oggi",
|
||||
"Tomorrow": "Domani",
|
||||
"UI": "Interfaccia",
|
||||
"CloneIndexer": "Clona Indicizzatore",
|
||||
"RemoveFromBlocklist": "Rimuovi della blacklist",
|
||||
"Time": "Ora",
|
||||
@@ -472,7 +473,7 @@
|
||||
"ShowUnknownAuthorItems": "Mostra film sconosciuti",
|
||||
"SelectAll": "Seleziona Tutto",
|
||||
"SelectedCountBooksSelectedInterp": "{0} Film selezionato(i)",
|
||||
"ThisCannotBeCancelled": "Questo non può essere annullato una volta avviato senza disabilitare tutti i tuoi indexers.",
|
||||
"ThisCannotBeCancelled": "Questo non può essere annullato una volta avviato senza riavviare Radarr.",
|
||||
"UnselectAll": "Deseleziona Tutto",
|
||||
"UpdateSelected": "Aggiorna i Film Selezionati",
|
||||
"Wanted": "Ricercato",
|
||||
@@ -659,7 +660,7 @@
|
||||
"CustomFormats": "Formati Personalizzati",
|
||||
"CutoffFormatScoreHelpText": "Una volta raggiunto questo formato personalizzato, Radarr non scaricherà più i film",
|
||||
"DeleteCustomFormat": "Cancella Formato Personalizzato",
|
||||
"DeleteCustomFormatMessageText": "Sei sicuro di voler eliminare il formato personalizzato '{0}'?",
|
||||
"DeleteCustomFormatMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?",
|
||||
"DeleteFormatMessageText": "Sei sicuro di voler cancellare il formato etichetta {0} ?",
|
||||
"ExportCustomFormat": "Esporta formato personalizzato",
|
||||
"Formats": "Formati",
|
||||
@@ -685,7 +686,7 @@
|
||||
"RemoveSelectedItem": "Rimuovi elemento selezionato",
|
||||
"ApplyTagsHelpTextReplace": "Sostituire: Sostituisce le etichette con quelle inserite (non inserire nessuna etichette per eliminarle tutte)",
|
||||
"ApplyTagsHelpTextHowToApplyAuthors": "Come applicare etichette agli indicizzatori selezionati",
|
||||
"CountIndexersSelected": "{0} indicizzatore(i) selezionato(i)",
|
||||
"CountIndexersSelected": "{0} Indicizzatore(i) Selezionato(i)",
|
||||
"No": "No",
|
||||
"NoChange": "Nessuna Modifica",
|
||||
"RemoveCompleted": "Rimuovi completati",
|
||||
@@ -704,8 +705,8 @@
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Come applicare etichette agli indicizzatori selezionati",
|
||||
"ApplyTagsHelpTextRemove": "Rimuovi: Rimuove le etichette inserite",
|
||||
"BlocklistReleaseHelpText": "Impedisci a Lidarr di re-acquisire automaticamente questa versione",
|
||||
"DeleteRemotePathMapping": "Elimina la Mappatura dei Percorsi Remoti",
|
||||
"DeleteSelectedDownloadClients": "Cancella i Client di Download",
|
||||
"DeleteRemotePathMapping": "Modifica la Mappatura dei Percorsi Remoti",
|
||||
"DeleteSelectedDownloadClients": "Cancella il Client di Download",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?",
|
||||
"DeleteSelectedImportLists": "Cancella la lista di importazione",
|
||||
"DeleteSelectedImportListsMessageText": "Sei sicuro di voler eliminare l'indexer '{0}'?",
|
||||
|
||||
@@ -440,6 +440,7 @@
|
||||
"Year": "年",
|
||||
"YesCancel": "はい、キャンセル",
|
||||
"DownloadClientCheckDownloadingToRoot": "ダウンロードクライアント{0}は、ダウンロードをルートフォルダ{1}に配置します。ルートフォルダにダウンロードしないでください。",
|
||||
"UI": "UI",
|
||||
"Tomorrow": "明日",
|
||||
"Today": "今日",
|
||||
"Actions": "行動",
|
||||
|
||||
@@ -443,6 +443,7 @@
|
||||
"ReplaceIllegalCharactersHelpText": "잘못된 문자를 바꿉니다. 선택하지 않으면 Radarr가 대신 제거합니다.",
|
||||
"ReleaseTitle": "릴리스 제목",
|
||||
"Actions": "행위",
|
||||
"UI": "UI",
|
||||
"Tomorrow": "내일",
|
||||
"Today": "오늘",
|
||||
"Progress": "진행",
|
||||
|
||||
@@ -119,6 +119,7 @@
|
||||
"SettingsRemotePathMappingLocalPath": "Lokal sti",
|
||||
"Title": "Tittel",
|
||||
"Torrents": "Torrents",
|
||||
"UI": "Grensesnitt",
|
||||
"UpdateMechanismHelpText": "Bruk Prowlarrs innebygde oppdaterer eller et skript",
|
||||
"URLBase": "URL Base",
|
||||
"Username": "Brukernavn",
|
||||
|
||||
@@ -442,6 +442,7 @@
|
||||
"DownloadClientCheckDownloadingToRoot": "Downloadclient {0} plaatst downloads in de hoofdmap {1}. U mag niet naar een hoofdmap downloaden.",
|
||||
"MaintenanceRelease": "Onderhoudsuitgave",
|
||||
"Actions": "Acties",
|
||||
"UI": "Gebruikersinterface",
|
||||
"Tomorrow": "Morgen",
|
||||
"ReplaceIllegalCharactersHelpText": "Vervang illegale karakters. Indien niet aangevinkt, zal Radarr ze in de plaats daarvan verwijderen",
|
||||
"Progress": "Voortgang",
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
"AnalyticsEnabledHelpText": "Wysyłaj anonimowe informacje o użytkowaniu i błędach do serwerów Radarr. Obejmuje to informacje o Twojej przeglądarce, z których stron Radarr WebUI używasz, raportowanie błędów, a także wersję systemu operacyjnego i środowiska wykonawczego. Wykorzystamy te informacje, aby nadać priorytet funkcjom i poprawkom błędów.",
|
||||
"AppDataDirectory": "Katalog AppData",
|
||||
"ApplyTags": "Zastosuj tagi",
|
||||
"Authentication": "Autoryzacja",
|
||||
"Authentication": "Poświadczenie",
|
||||
"AuthenticationMethodHelpText": "Wymagaj nazwy użytkownika i hasła, aby uzyskać dostęp do Radarr",
|
||||
"AuthorClickToChangeBook": "Kliknij, aby zmienić film",
|
||||
"AutoRedownloadFailedHelpText": "Automatycznie wyszukuj i próbuj pobrać inną wersję",
|
||||
@@ -452,6 +452,7 @@
|
||||
"ShowTitle": "Pokaż Tytuł",
|
||||
"Today": "Dzisiaj",
|
||||
"Tomorrow": "Jutro",
|
||||
"UI": "UI",
|
||||
"ShowBookTitleHelpText": "Pokaż tytuł filmu pod plakatem",
|
||||
"Time": "Czas",
|
||||
"UnableToLoadBlocklist": "Nie można załadować listy blokowania",
|
||||
@@ -467,7 +468,7 @@
|
||||
"Level": "Poziom",
|
||||
"Wanted": "Chciał",
|
||||
"Blocklist": "Czarna lista",
|
||||
"BlocklistRelease": "Dodaj wersję do czarnej listy",
|
||||
"BlocklistRelease": "Wydanie czarnej listy",
|
||||
"AppDataLocationHealthCheckMessage": "Aktualizacja nie będzie możliwa w celu uniknięcia usunięcia danych aplikacji",
|
||||
"SearchFiltered": "Szukaj przefiltrowane",
|
||||
"Disabled": "Wyłączone",
|
||||
@@ -573,7 +574,7 @@
|
||||
"ImportListExclusions": "Usuń wykluczenie listy importu",
|
||||
"ManualImportSelectEdition": "Import ręczny - wybierz film",
|
||||
"ApplicationURL": "Link do aplikacji",
|
||||
"ApplicationUrlHelpText": "Zewnętrzny URL tej aplikacji zawierający http(s)://, port i adres URL",
|
||||
"ApplicationUrlHelpText": "Zewnętrzny URL tej aplikacji zawiera http(s)://, port i adres URL",
|
||||
"Database": "Baza danych",
|
||||
"ChooseImportMethod": "Wybierz tryb importu",
|
||||
"ClickToChangeReleaseGroup": "Kliknij, by zmienić grupę wydającą",
|
||||
@@ -615,7 +616,7 @@
|
||||
"ReplaceWithSpaceDashSpace": "Zastąp spacją Dash Space",
|
||||
"DeleteRemotePathMapping": "Edytuj zdalne mapowanie ścieżki",
|
||||
"DeleteRemotePathMappingMessageText": "Czy na pewno chcesz usunąć to mapowanie zdalnej ścieżki?",
|
||||
"BlocklistReleases": "Dodaj wersje do czarnej listy",
|
||||
"BlocklistReleases": "Wydanie czarnej listy",
|
||||
"DeleteConditionMessageText": "Czy na pewno chcesz usunąć tag „{0}”?",
|
||||
"Negated": "Zanegowane",
|
||||
"RemoveSelectedItem": "Usuń wybrane",
|
||||
@@ -636,9 +637,9 @@
|
||||
"RemovingTag": "Usuwanie tagu",
|
||||
"SetTags": "Ustaw tagi",
|
||||
"ApplyTagsHelpTextAdd": "Dodaj: dodaj tagi do istniejącej listy tagów",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak zastosować tagi do wybranych list",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych indeksatorów",
|
||||
"ApplyTagsHelpTextHowToApplyDownloadClients": "Jak zastosować tagi do wybranych filmów",
|
||||
"ApplyTagsHelpTextHowToApplyImportLists": "Jak zastosować tagi do wybranych filmów",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak zastosować tagi do wybranych filmów",
|
||||
"ApplyTagsHelpTextRemove": "Usuń: usuń wprowadzone tagi",
|
||||
"RedownloadFailed": "Pobieranie nie udane",
|
||||
"DeleteSelectedDownloadClients": "Usuń klienta pobierania",
|
||||
@@ -648,7 +649,5 @@
|
||||
"NoChange": "Bez zmiany",
|
||||
"RemoveCompleted": "Usuń zakończone",
|
||||
"RemoveFailed": "Usuń nieudane",
|
||||
"Yes": "tak",
|
||||
"ApplyChanges": "Zastosuj zmiany",
|
||||
"ApiKeyValidationHealthCheckMessage": "Zaktualizuj swój klucz API aby był długi na co najmniej {0} znaków. Możesz to zrobić poprzez ustawienia lub plik konfiguracyjny"
|
||||
"Yes": "tak"
|
||||
}
|
||||
|
||||
@@ -654,6 +654,7 @@
|
||||
"Progress": "Progresso",
|
||||
"UnableToLoadMetadataProviderSettings": "Não foi possível carregar as definições do fornecedor de metadados",
|
||||
"Today": "Hoje",
|
||||
"UI": "IU",
|
||||
"Tomorrow": "Amanhã",
|
||||
"UnmappedFiles": "Ficheiros não mapeados",
|
||||
"UpdateCovers": "Atualizar capas",
|
||||
|
||||
@@ -17,23 +17,23 @@
|
||||
"AgeWhenGrabbed": "Tempo de vida (quando obtido)",
|
||||
"ApiKeyHelpTextWarning": "Requer reinício para ter efeito",
|
||||
"LoadingBooksFailed": "Falha ao carregar livros",
|
||||
"Logs": "Registros",
|
||||
"MustContain": "Deve Conter",
|
||||
"ProxyPasswordHelpText": "Você só precisa digitar um nome de usuário e senha se for necessário. Caso contrário, deixe-os em branco.",
|
||||
"Logs": "Logs",
|
||||
"MustContain": "Deve conter",
|
||||
"ProxyPasswordHelpText": "Você só precisa inserir um nome de usuário e uma senha se solicitado. Caso contrário, deixe em branco.",
|
||||
"SslCertPathHelpTextWarning": "Requer reinício para ter efeito",
|
||||
"UnableToLoadMetadataProfiles": "Não foi possível carregar os perfis de metadados",
|
||||
"AddListExclusion": "Adicionar exclusão à lista",
|
||||
"AddingTag": "Adicionar tag",
|
||||
"AlreadyInYourLibrary": "Já está na sua biblioteca",
|
||||
"AlternateTitles": "Títulos alternativos",
|
||||
"Analytics": "Analítica",
|
||||
"Analytics": "Análises",
|
||||
"AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do Readarr. Isso inclui informações sobre seu navegador, quais páginas da interface Web do Readarr você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.",
|
||||
"AppDataDirectory": "Diretório AppData",
|
||||
"ApplyTags": "Aplicar Tags",
|
||||
"Authentication": "Autenticação",
|
||||
"AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar o Readarr",
|
||||
"AuthorClickToChangeBook": "Clique para alterar o livro",
|
||||
"AutoRedownloadFailedHelpText": "Procurar automaticamente e tente baixar uma versão diferente",
|
||||
"AutoRedownloadFailedHelpText": "Procure automaticamente e tente fazer o download de uma versão diferente",
|
||||
"AutoUnmonitorPreviouslyDownloadedBooksHelpText": "Livros excluídos do disco deixam de ser monitorados no Readarr automaticamente",
|
||||
"Automatic": "Automático",
|
||||
"BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do Readarr",
|
||||
@@ -47,7 +47,7 @@
|
||||
"DiskSpace": "Espaço em Disco",
|
||||
"Docker": "Docker",
|
||||
"DownloadClient": "Cliente de Download",
|
||||
"DownloadClientSettings": "Configurações do Cliente de Download",
|
||||
"DownloadClientSettings": "Configurações do cliente de download",
|
||||
"DownloadClients": "Clientes de download",
|
||||
"DownloadFailedCheckDownloadClientForMoreDetails": "Falha no download: verifique o cliente de download para saber mais",
|
||||
"DownloadFailedInterp": "Falha no download: {0}",
|
||||
@@ -65,35 +65,35 @@
|
||||
"HasPendingChangesSaveChanges": "Salvar alterações",
|
||||
"History": "Histórico",
|
||||
"Host": "Host",
|
||||
"Hostname": "Hostname",
|
||||
"Hostname": "Nome do host",
|
||||
"ICalFeed": "Feed do iCal",
|
||||
"ICalHttpUrlHelpText": "Copie este URL em seu(s) cliente(s) ou clique para se inscrever se o seu navegador é compatível com webcal",
|
||||
"ICalLink": "Link do iCal",
|
||||
"BookIsDownloadingInterp": "O livro está baixando - {0}% {1}",
|
||||
"Branch": "Ramificação",
|
||||
"Branch": "Ramo",
|
||||
"BypassProxyForLocalAddresses": "Ignorar proxy para endereços locais",
|
||||
"Calendar": "Calendário",
|
||||
"CalendarWeekColumnHeaderHelpText": "Mostrar acima de cada coluna quando a semana está na exibição ativa",
|
||||
"Cancel": "Cancelar",
|
||||
"CancelMessageText": "Tem certeza que deseja cancelar esta tarefa pendente?",
|
||||
"CertificateValidation": "Validação de Certificado",
|
||||
"CertificateValidationHelpText": "Altere a rigidez da validação da certificação HTTPS. Não mude a menos que você entenda os riscos.",
|
||||
"ChangeFileDate": "Alterar Data do Arquivo",
|
||||
"CertificateValidation": "Validação do Certificado",
|
||||
"CertificateValidationHelpText": "Mudar o quão rigorosa é a validação de certificação HTTPS. Não mude a menos que você entenda os riscos.",
|
||||
"ChangeFileDate": "Mudar Data do Arquivo",
|
||||
"ChangeHasNotBeenSavedYet": "Mudar o que não foi salvo ainda",
|
||||
"ChmodFolder": "chmod Pasta",
|
||||
"ChmodFolderHelpText": "Octal, aplicado durante a importação/renomeação de pastas e arquivos de mídia (sem bits de execução)",
|
||||
"ChmodFolder": "Pasta chmod",
|
||||
"ChmodFolderHelpText": "Octal, aplicado durante a importação/renomeação a pastas e arquivos de mídia (sem executar bits)",
|
||||
"ChmodFolderHelpTextWarning": "Isso só funciona se o usuário que está executando o Readarr for o proprietário do arquivo. É melhor garantir que o cliente de download defina as permissões corretamente.",
|
||||
"ChownGroupHelpText": "Nome do grupo ou gid. Use gid para sistemas de arquivos remotos.",
|
||||
"ChownGroupHelpText": "Nome ou ID do grupo. Use a ID para sistemas de arquivos remotos.",
|
||||
"ChownGroupHelpTextWarning": "Isso só funciona se o usuário que está executando o Readarr for o proprietário do arquivo. É melhor garantir que o cliente de download use o mesmo grupo que o Readarr.",
|
||||
"Clear": "Limpar",
|
||||
"ClickToChangeQuality": "Clique para alterar a qualidade",
|
||||
"ClientPriority": "Prioridade do Cliente",
|
||||
"CloneIndexer": "Clonar Indexador",
|
||||
"CloneProfile": "Clonar Perfil",
|
||||
"ClientPriority": "Prioridade do cliente",
|
||||
"CloneIndexer": "Clonar indexador",
|
||||
"CloneProfile": "Clonar perfil",
|
||||
"Close": "Fechar",
|
||||
"Columns": "Colunas",
|
||||
"CompletedDownloadHandling": "Gerenciamento de Downloads Completos",
|
||||
"ConnectSettings": "Configurações de Conexão",
|
||||
"CompletedDownloadHandling": "Gerenciamento de download concluído",
|
||||
"ConnectSettings": "Configurações de conexão",
|
||||
"Connections": "Conexões",
|
||||
"CopyUsingHardlinksHelpText": "Os hardlinks permitem que o Readarr importe torrents para a pasta da série sem ocupar espaço extra em disco ou copiar todo o conteúdo do arquivo. Os hardlinks só funcionarão se a origem e o destino estiverem no mesmo volume",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, os bloqueios de arquivo podem impedir a renomeação de arquivos que estão sendo semeados. Você pode desabilitar temporariamente a semeadura e usar a função de renomeação do Readarr como uma solução alternativa.",
|
||||
@@ -103,27 +103,27 @@
|
||||
"CutoffUnmet": "Corte não alcançado",
|
||||
"DBMigration": "Migração de banco de dados",
|
||||
"Dates": "Datas",
|
||||
"DelayProfile": "Perfil de Atraso",
|
||||
"DelayProfiles": "Perfis de Atraso",
|
||||
"DelayProfile": "Perfil de atraso",
|
||||
"DelayProfiles": "Perfis de atraso",
|
||||
"DelayingDownloadUntilInterp": "Atrasando o download até {0} às {1}",
|
||||
"Delete": "Excluir",
|
||||
"DeleteBackup": "Excluir Backup",
|
||||
"DeleteBackupMessageText": "Tem certeza que deseja excluir o backup \"{0}\"?",
|
||||
"DeleteDelayProfile": "Excluir Perfil de Atraso",
|
||||
"DeleteDelayProfile": "Excluir perfil de atraso",
|
||||
"DeleteDelayProfileMessageText": "Tem certeza de que deseja excluir este perfil de atraso?",
|
||||
"DeleteDownloadClient": "Excluir Cliente de Download",
|
||||
"DeleteDownloadClient": "Excluir cliente de download",
|
||||
"DeleteDownloadClientMessageText": "Tem certeza que deseja excluir o cliente de download \"{0}\"?",
|
||||
"DeleteEmptyFolders": "Excluir pastas vazias",
|
||||
"DeleteEmptyFoldersHelpText": "Excluir pastas de autor vazias durante a verificação do disco e quando os arquivos de livros forem excluídos",
|
||||
"DeleteImportListExclusion": "Excluir Exclusão da Lista de Importação",
|
||||
"DeleteImportListExclusion": "Remover exclusão da lista de importação",
|
||||
"DeleteImportListExclusionMessageText": "Tem certeza de que deseja excluir esta exclusão da lista de importação?",
|
||||
"DeleteImportListMessageText": "Tem certeza de que deseja excluir a lista \"{0}\"?",
|
||||
"DeleteIndexer": "Excluir Indexador",
|
||||
"DeleteIndexer": "Excluir indexador",
|
||||
"DeleteIndexerMessageText": "Tem certeza de que deseja excluir o indexador \"{0}\"?",
|
||||
"DeleteMetadataProfileMessageText": "Tem certeza que deseja excluir o perfil de metadados \"{0}\"?",
|
||||
"DeleteNotification": "Excluir Notificação",
|
||||
"DeleteNotification": "Excluir notificação",
|
||||
"DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação \"{0}\"?",
|
||||
"DeleteQualityProfile": "Excluir Perfil de Qualidade",
|
||||
"DeleteQualityProfile": "Excluir perfil de qualidade",
|
||||
"DeleteQualityProfileMessageText": "Tem certeza que deseja excluir o perfil de qualidade \"{0}\"?",
|
||||
"DeleteReleaseProfile": "Excluir Perfil de Lançamento",
|
||||
"DeleteReleaseProfileMessageText": "Tem certeza de que deseja excluir este Perfil de Lançamento?",
|
||||
@@ -134,12 +134,12 @@
|
||||
"DeleteTagMessageText": "Tem certeza de que deseja excluir a tag \"{0}\"?",
|
||||
"DestinationPath": "Caminho de destino",
|
||||
"DetailedProgressBarHelpText": "Mostrar texto em barra de progresso",
|
||||
"EnableAutomaticAdd": "Habilitar Adição Automática",
|
||||
"EnableAutomaticAdd": "Habilitar adição automática",
|
||||
"EnableAutomaticSearch": "Ativar pesquisa automática",
|
||||
"EnableColorImpairedMode": "Habilitar Modo para Deficientes Visuais",
|
||||
"EnableColorImpairedModeHelpText": "Estilo alterado para permitir que usuários com deficiência de cor distingam melhor as informações codificadas por cores",
|
||||
"EnableColorImpairedMode": "Habilitar modo para daltonismo",
|
||||
"EnableColorImpairedModeHelpText": "Estilo alterado para permitir que usuários com daltonismo distingam melhor as informações codificadas por cores",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Importar automaticamente downloads concluídos do cliente de download",
|
||||
"EnableHelpText": "Habilitar criação de arquivo de metadados para este tipo de metadados",
|
||||
"EnableHelpText": "Habilitar a criação de um arquivo de metadados para este tipo de metadados",
|
||||
"EnableInteractiveSearch": "Ativar pesquisa interativa",
|
||||
"EnableRSS": "Habilitar RSS",
|
||||
"EnableSSL": "Habilitar SSL",
|
||||
@@ -152,11 +152,11 @@
|
||||
"ExtraFileExtensionsHelpTexts2": "Exemplos: \".sub, .nfo\" ou \"sub,nfo\"",
|
||||
"FailedDownloadHandling": "Falha no gerenciamento de download",
|
||||
"FileDateHelpText": "Alterar a data do arquivo ao importar/verificar novamente",
|
||||
"FileManagement": "Gerenciamento de Arquivo",
|
||||
"FileNames": "Nomes de Arquivo",
|
||||
"FileManagement": "Gerenciamento de arquivo",
|
||||
"FileNames": "Nomes dos arquivos",
|
||||
"Filename": "Nome do arquivo",
|
||||
"Files": "Arquivos",
|
||||
"FirstDayOfWeek": "Primeiro Dia da Semana",
|
||||
"FirstDayOfWeek": "Primeiro dia da semana",
|
||||
"Fixed": "Corrigido",
|
||||
"Folder": "Pasta",
|
||||
"Folders": "Pastas",
|
||||
@@ -170,11 +170,11 @@
|
||||
"GrabID": "Obter ID",
|
||||
"IconForCutoffUnmet": "Ícone para Limite não atingido",
|
||||
"IconTooltip": "Agendado",
|
||||
"IgnoredAddresses": "Endereços Ignorados",
|
||||
"IgnoredAddresses": "Endereços ignorados",
|
||||
"IgnoredHelpText": "O lançamento será rejeitado se contiver um ou mais desses termos (não diferencia maiúsculas de minúsculas)",
|
||||
"IgnoredPlaceHolder": "Adicionar nova restrição",
|
||||
"IllRestartLater": "Reiniciarei mais tarde",
|
||||
"ImportExtraFiles": "Importar Arquivos Extras",
|
||||
"ImportExtraFiles": "Importar arquivos adicionais",
|
||||
"Missing": "Ausente",
|
||||
"Mode": "Modo",
|
||||
"ImportExtraFilesHelpText": "Importar arquivos adicionais correspondentes (legendas, nfo, etc.) após importar um arquivo de livro",
|
||||
@@ -185,8 +185,8 @@
|
||||
"IncludeUnknownAuthorItemsHelpText": "Mostrar itens sem autor na fila, isso pode incluir autores removidos, livros ou qualquer outra coisa na categoria de Readarr",
|
||||
"IncludeUnmonitored": "Incluir não monitorado",
|
||||
"Indexer": "Indexador",
|
||||
"IndexerPriority": "Prioridade do Indexador",
|
||||
"IndexerSettings": "Configurações do Indexador",
|
||||
"IndexerPriority": "Prioridade do indexador",
|
||||
"IndexerSettings": "Configurações do indexador",
|
||||
"Indexers": "Indexadores",
|
||||
"Interval": "Intervalo",
|
||||
"IsCutoffCutoff": "Limite",
|
||||
@@ -197,31 +197,31 @@
|
||||
"LoadingBookFilesFailed": "Falha ao carregar arquivos do livro",
|
||||
"Local": "Local",
|
||||
"LogFiles": "Arquivos de registro",
|
||||
"LogLevel": "Nível de Registro",
|
||||
"LogLevel": "Nível do log",
|
||||
"LogLevelvalueTraceTraceLoggingShouldOnlyBeEnabledTemporarily": "O registro de rastreamento deve ser ativado apenas temporariamente",
|
||||
"Logging": "Registrando",
|
||||
"LongDateFormat": "Formato de Data Longa",
|
||||
"Logging": "Registro em log",
|
||||
"LongDateFormat": "Formato longo da data",
|
||||
"MIA": "Desaparecidos",
|
||||
"ManualImport": "Importação manual",
|
||||
"MarkAsFailed": "Marcar como falhado",
|
||||
"MarkAsFailedMessageText": "Tem certeza que deseja marcar \"{0}\" como falhado?",
|
||||
"MaximumLimits": "Limites Máximos",
|
||||
"MaximumSize": "Tamanho Máximo",
|
||||
"MaximumLimits": "Limites máximos",
|
||||
"MaximumSize": "Tamanho máximo",
|
||||
"MaximumSizeHelpText": "Tamanho máximo para um lançamento a ser obtido, em MB. Digite zero para definir como Ilimitado.",
|
||||
"Mechanism": "Mecanismo",
|
||||
"MediaInfo": "Informações da mídia",
|
||||
"MediaManagementSettings": "Configurações de Gerenciamento de Mídia",
|
||||
"MediaManagementSettings": "Configurações de gerenciamento de mídia",
|
||||
"Message": "Mensagem",
|
||||
"MetadataSettings": "Configurações de Metadados",
|
||||
"MinimumAge": "Idade Miníma",
|
||||
"MinimumAgeHelpText": "Somente Usenet: Idade mínima em minutos dos NZBs antes de serem capturados. Use isso para dar aos novos lançamentos tempo para se propagar para seu provedor usenet.",
|
||||
"MinimumFreeSpace": "Espaço Livre Mínimo",
|
||||
"MetadataSettings": "Configurações de metadados",
|
||||
"MinimumAge": "Tempo de vida mínimo",
|
||||
"MinimumAgeHelpText": "Somente Usenet: tempo de vida mínimo, em minutos, dos NZBs, para que sejam capturados. Use isto para dar às novas versões tempo de propagar-se em seu fornecedor de Usenet.",
|
||||
"MinimumFreeSpace": "Mínimo de espaço livre",
|
||||
"MinimumFreeSpaceWhenImportingHelpText": "Impedir a importação se deixar menos do que esta quantidade de espaço em disco disponível",
|
||||
"MinimumLimits": "Limites Mínimos",
|
||||
"MinimumLimits": "Limites mínimos",
|
||||
"MoreInfo": "Mais informações",
|
||||
"MustNotContain": "Não Deve Conter",
|
||||
"MustNotContain": "Não deve conter",
|
||||
"Name": "Nome",
|
||||
"NamingSettings": "Configurações de Nomes",
|
||||
"NamingSettings": "Configurações de nomenclatura",
|
||||
"New": "Novo",
|
||||
"NoBackupsAreAvailable": "Não há backups disponíveis",
|
||||
"NoHistory": "Sem histórico.",
|
||||
@@ -230,8 +230,8 @@
|
||||
"NoLogFiles": "Nenhum arquivo de log",
|
||||
"NoMinimumForAnyRuntime": "Sem mínimo para qualquer tempo de execução",
|
||||
"NoUpdatesAreAvailable": "Nenhuma atualização está disponível",
|
||||
"None": "Vazio",
|
||||
"NotificationTriggers": "Gatilhos de Notificação",
|
||||
"None": "Nenhum",
|
||||
"NotificationTriggers": "Acionadores da notificação",
|
||||
"OnGrabHelpText": "Ao obter",
|
||||
"OnHealthIssueHelpText": "Ao ter problema de integridade",
|
||||
"OnRenameHelpText": "Ao renomear",
|
||||
@@ -248,24 +248,24 @@
|
||||
"Permissions": "Permissões",
|
||||
"Port": "Porta",
|
||||
"PortHelpTextWarning": "Requer reinício para ter efeito",
|
||||
"PortNumber": "Número da Porta",
|
||||
"PortNumber": "Número da porta",
|
||||
"PosterSize": "Tamanho do pôster",
|
||||
"PreviewRename": "Visualizar renomeação",
|
||||
"Profiles": "Perfis",
|
||||
"Proper": "Proper",
|
||||
"PropersAndRepacks": "Propers e repacks",
|
||||
"Protocol": "Protocolo",
|
||||
"ProtocolHelpText": "Escolha qual(is) protocolo(s) usar e qual é o preferido ao escolher entre laçamentos iguais",
|
||||
"ProtocolHelpText": "Escolha que protocolo(s) utilizar e qual o preferido ao escolher entre versões iguais",
|
||||
"Proxy": "Proxy",
|
||||
"ProxyBypassFilterHelpText": "Use ',' como separador e '*.' como curinga para subdomínios",
|
||||
"ProxyType": "Tipo de Proxy",
|
||||
"ProxyUsernameHelpText": "Você só precisa digitar um nome de usuário e senha se for necessário. Caso contrário, deixe-os em branco.",
|
||||
"ProxyBypassFilterHelpText": "Usar \",\" como separador e \"*.\" como curinga para subdomínios",
|
||||
"ProxyType": "Tipo de proxy",
|
||||
"ProxyUsernameHelpText": "Você só precisa inserir um nome de usuário e uma senha se solicitado. Caso contrário, deixe em branco.",
|
||||
"PublishedDate": "Data de publicação",
|
||||
"Quality": "Qualidade",
|
||||
"QualityDefinitions": "Definições de Qualidade",
|
||||
"QualityDefinitions": "Definições de qualidade",
|
||||
"QualityProfile": "Perfil de Qualidade",
|
||||
"QualityProfiles": "Perfis de Qualidade",
|
||||
"QualitySettings": "Configurações de Qualidade",
|
||||
"QualityProfiles": "Perfis de qualidade",
|
||||
"QualitySettings": "Configurações de qualidade",
|
||||
"Queue": "Fila",
|
||||
"RSSSync": "Sincronização RSS",
|
||||
"RSSSyncInterval": "Intervalo da sincronização RSS",
|
||||
@@ -278,7 +278,7 @@
|
||||
"RecycleBinCleanupDaysHelpTextWarning": "Os arquivos na lixeira mais antigos do que o número de dias selecionado serão limpos automaticamente",
|
||||
"RecycleBinHelpText": "Arquivos de livros vêm para cá quando excluídos, em vez de serem apagados permanentemente",
|
||||
"RecyclingBin": "Lixeira",
|
||||
"RecyclingBinCleanup": "Esvaziar Lixeira",
|
||||
"RecyclingBinCleanup": "Esvaziar lixeira",
|
||||
"Redownload": "Baixar novamente",
|
||||
"Refresh": "Atualizar",
|
||||
"RefreshInformationAndScanDisk": "Atualizar as informações e verificar o disco",
|
||||
@@ -287,10 +287,10 @@
|
||||
"ReleaseRejected": "Versão rejeitada",
|
||||
"ReleaseWillBeProcessedInterp": "A versão será processada {0}",
|
||||
"Reload": "Recarregar",
|
||||
"RemotePathMappings": "Mapeamentos de Caminho Remoto",
|
||||
"RemotePathMappings": "Mapeamentos de caminho remoto",
|
||||
"Remove": "Remover",
|
||||
"RemoveCompletedDownloadsHelpText": "Remover downloads importados do histórico do cliente de download",
|
||||
"RemoveFailedDownloadsHelpText": "Remova downloads com falha do histórico do cliente de download",
|
||||
"RemoveFailedDownloadsHelpText": "Remover downloads com falha do histórico do cliente de download",
|
||||
"RemoveFilter": "Remover filtro",
|
||||
"RemoveFromDownloadClient": "Remover Do Cliente de Download",
|
||||
"RemoveFromQueue": "Remover da fila",
|
||||
@@ -300,43 +300,43 @@
|
||||
"RemoveTagRemovingTag": "Removendo tag",
|
||||
"RemovedFromTaskQueue": "Removido da fila de tarefas",
|
||||
"RenameBooksHelpText": "O Readarr usará o nome de arquivo existente se a renomeação estiver desativada",
|
||||
"Reorder": "Reordenar",
|
||||
"ReplaceIllegalCharacters": "Substituir Caracteres Ilegais",
|
||||
"Reorder": "Reorganizar",
|
||||
"ReplaceIllegalCharacters": "Substituir caracteres ilegais",
|
||||
"RequiredHelpText": "Essa condição {0} deve corresponder para que o formato personalizado seja aplicado. Caso contrário, uma única partida {0} é suficiente.",
|
||||
"RequiredPlaceHolder": "Adicionar nova restrição",
|
||||
"RescanAfterRefreshHelpTextWarning": "O Readarr não detectará automaticamente as alterações nos arquivos se não estiver definido como \"Sempre\"",
|
||||
"RescanAuthorFolderAfterRefresh": "Reescanear a pasta do autor após a atualização",
|
||||
"Reset": "Redefinir",
|
||||
"ResetAPIKey": "Redefinir chave de API",
|
||||
"ResetAPIKey": "Redefinir chave da API",
|
||||
"ResetAPIKeyMessageText": "Tem certeza de que deseja redefinir sua chave de API?",
|
||||
"Restart": "Reiniciar",
|
||||
"RestartNow": "Reiniciar Agora",
|
||||
"RestartNow": "Reiniciar agora",
|
||||
"RestartReadarr": "Reiniciar o Readarr",
|
||||
"Restore": "Restaurar",
|
||||
"RestoreBackup": "Restaurar backup",
|
||||
"Result": "Resultado",
|
||||
"Retention": "Retenção",
|
||||
"RetentionHelpText": "Somente Usenet: defina como zero para definir a retenção ilimitada",
|
||||
"RetentionHelpText": "Apenas Usenet: use 0 para definir para retenção ilimitada",
|
||||
"RetryingDownloadInterp": "Tentando novamente o download {0} em {1}",
|
||||
"RootFolder": "Pasta Raiz",
|
||||
"RootFolders": "Pastas Raiz",
|
||||
"RssSyncIntervalHelpText": "Intervalo em minutos. Defina como zero para desativar (isso interromperá todas as capturas de lançamentos automáticas)",
|
||||
"RssSyncIntervalHelpText": "Intervalo em minutos. Defina como zero para desabilitar (isso interromperá todos os downloads automáticos de lançamentos)",
|
||||
"SSLCertPassword": "Senha do certificado SSL",
|
||||
"SSLCertPath": "Caminho do certificado SSL",
|
||||
"SSLPort": "Porta SSL",
|
||||
"Scheduled": "Agendado",
|
||||
"ScriptPath": "Caminho do Script",
|
||||
"ScriptPath": "Caminho do script",
|
||||
"Search": "Pesquisar",
|
||||
"SearchAll": "Pesquisar tudo",
|
||||
"SearchForMissing": "Pesquisar ausentes",
|
||||
"SearchSelected": "Pesquisar selecionado(s)",
|
||||
"Security": "Segurança",
|
||||
"SendAnonymousUsageData": "Enviar dados de uso anônimos",
|
||||
"SetPermissions": "Definir Permissões",
|
||||
"SetPermissions": "Definir permissões",
|
||||
"SetPermissionsLinuxHelpText": "O chmod deve ser executado quando os arquivos são importados/renomeados?",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Se você não tiver certeza do que essas configurações fazem, não as altere.",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Se você não tem certeza do que essas configurações fazem, não as altere.",
|
||||
"Settings": "Configurações",
|
||||
"ShortDateFormat": "Formato de Data Curta",
|
||||
"ShortDateFormat": "Formato curto da data",
|
||||
"ShowCutoffUnmetIconHelpText": "Mostrar ícone para arquivos quando o limite não foi atingindo",
|
||||
"ShowDateAdded": "Mostrar data de adição",
|
||||
"ShowMonitored": "Mostrar monitorado(s)",
|
||||
@@ -344,8 +344,8 @@
|
||||
"ShowPath": "Mostrar caminho",
|
||||
"ShowQualityProfile": "Mostrar perfil de qualidade",
|
||||
"ShowQualityProfileHelpText": "Mostrar perfil de qualidade sob o pôster",
|
||||
"ShowRelativeDates": "Mostrar Datas Relativas",
|
||||
"ShowRelativeDatesHelpText": "Mostrar datas relativas (Hoje/Ontem/etc) ou absolutas",
|
||||
"ShowRelativeDates": "Mostrar datas relativas",
|
||||
"ShowRelativeDatesHelpText": "Mostrar datas absolutas ou relativas (Hoje, Ontem, etc.)",
|
||||
"ShowSearch": "Mostrar pesquisa",
|
||||
"ShowSearchActionHelpText": "Mostrar botão de pesquisa ao passar o mouse",
|
||||
"ShowSizeOnDisk": "Mostrar tamanho no disco",
|
||||
@@ -372,7 +372,7 @@
|
||||
"SupportsSearchvalueSearchIsNotSupportedWithThisIndexer": "A pesquisa não é compatível com este indexador",
|
||||
"SupportsSearchvalueWillBeUsedWhenAutomaticSearchesArePerformedViaTheUIOrByReadarr": "Será usado quando pesquisas automáticas forem realizadas pela interface ou pelo Readarr",
|
||||
"SupportsSearchvalueWillBeUsedWhenInteractiveSearchIsUsed": "Será usado com a pesquisa interativa",
|
||||
"TagIsNotUsedAndCanBeDeleted": "A tag não é usada e pode ser excluída",
|
||||
"TagIsNotUsedAndCanBeDeleted": "A tag não está em uso e pode ser excluída",
|
||||
"Tags": "Tags",
|
||||
"Tasks": "Tarefas",
|
||||
"TestAll": "Testar Tudo",
|
||||
@@ -380,10 +380,10 @@
|
||||
"TestAllIndexers": "Testar todos os indexadores",
|
||||
"TestAllLists": "Testar todas as listas",
|
||||
"ThisWillApplyToAllIndexersPleaseFollowTheRulesSetForthByThem": "Isso se aplicará a todos os indexadores, siga as regras estabelecidas por eles",
|
||||
"TimeFormat": "Formato da Hora",
|
||||
"TimeFormat": "Formato de hora",
|
||||
"Title": "Título",
|
||||
"TorrentDelay": "Atraso do Torrent",
|
||||
"TorrentDelayHelpText": "Demora em minutos para esperar antes de pegar um torrent",
|
||||
"TorrentDelay": "Atraso do torrent",
|
||||
"TorrentDelayHelpText": "Atraso, em minutos, para aguardar antes de obter um torrent",
|
||||
"Torrents": "Torrents",
|
||||
"TotalFileSize": "Tamanho total do arquivo",
|
||||
"UILanguage": "Idioma da interface",
|
||||
@@ -418,23 +418,23 @@
|
||||
"Unmonitored": "Não monitorado",
|
||||
"UnmonitoredHelpText": "Incluir livros não monitorados no feed do iCal",
|
||||
"UpdateAll": "Atualizar tudo",
|
||||
"UpdateAutomaticallyHelpText": "Baixe e instale atualizações automaticamente. Você ainda poderá instalar a partir do Sistema: Atualizações",
|
||||
"UpdateAutomaticallyHelpText": "Baixar e instalar atualizações automaticamente. Você ainda poderá instalar a partir de Sistema: Atualizações",
|
||||
"UpdateMechanismHelpText": "Use o atualizador integrado do Readarr ou um script",
|
||||
"UpdateScriptPathHelpText": "Caminho para um script personalizado que usa um pacote de atualização extraído e lida com o restante do processo de atualização",
|
||||
"Updates": "Atualizações",
|
||||
"UpgradeAllowedHelpText": "Se desabilitada, as qualidades não serão atualizadas",
|
||||
"Uptime": "Tempo de atividade",
|
||||
"UrlBaseHelpTextWarning": "Requer reinício para ter efeito",
|
||||
"UseHardlinksInsteadOfCopy": "Usar links rígidos ao invés de Copiar",
|
||||
"UseProxy": "Usar Proxy",
|
||||
"UseHardlinksInsteadOfCopy": "Usar Vínculos reais em vez de Copiar",
|
||||
"UseProxy": "Usar proxy",
|
||||
"Usenet": "Usenet",
|
||||
"UsenetDelay": "Atraso da Usenet",
|
||||
"UsenetDelayHelpText": "Atraso em minutos para esperar antes de pegar um lançamento da Usenet",
|
||||
"Username": "Nome do usuário",
|
||||
"UsenetDelayHelpText": "Tempo, em minutos, para aguardar antes de capturar uma versão de Usenet",
|
||||
"Username": "Nome de usuário",
|
||||
"UsingExternalUpdateMechanismBranchToUseToUpdateReadarr": "Ramificação para atualizar o Readarr",
|
||||
"UsingExternalUpdateMechanismBranchUsedByExternalUpdateMechanism": "Ramificação usada pelo mecanismo de atualização externo",
|
||||
"Version": "Versão",
|
||||
"WeekColumnHeader": "Cabeçalho da Coluna da Semana",
|
||||
"WeekColumnHeader": "Cabeçalho da coluna da semana",
|
||||
"Year": "Ano",
|
||||
"YesCancel": "Sim, Cancelar",
|
||||
"BookFileCountBookCountTotalTotalBookCountInterp": "{0}/{1} (Total: {2})",
|
||||
@@ -488,7 +488,7 @@
|
||||
"RescanAfterRefreshHelpText": "Verificar novamente a pasta de autor após atualizar o autor",
|
||||
"ReplaceIllegalCharactersHelpText": "Substituir caracteres ilegais. Se desmarcada, o Readarr irá removê-los",
|
||||
"RenameBooks": "Renomear livros",
|
||||
"ReleaseProfiles": "Perfis de Lançamento",
|
||||
"ReleaseProfiles": "Perfis de lançamento",
|
||||
"RefreshInformation": "Atualizar informações",
|
||||
"RefreshAuthor": "Atualizar autor",
|
||||
"ReadarrSupportsMultipleListsForImportingBooksAndAuthorsIntoTheDatabase": "O Readarr oferece suporte a várias listas para importar livros e autores para o banco de dados.",
|
||||
@@ -502,7 +502,7 @@
|
||||
"PastDaysHelpText": "Dias anteriores a exibir no feed do iCal",
|
||||
"PasswordHelpText": "Senha do servidor de conteúdo do Calibre",
|
||||
"OutputFormatHelpText": "Opcionalmente, peça que o Calibre converta para outros formatos ao importar. Lista separada por vírgulas.",
|
||||
"Other": "Outro",
|
||||
"Other": "Outros",
|
||||
"OnReleaseImportHelpText": "Ao importar lançamento",
|
||||
"OnImportFailureHelpText": "Ao ocorrer falha na importação",
|
||||
"OnDownloadFailureHelpText": "Ao ocorrer falha no download",
|
||||
@@ -515,7 +515,7 @@
|
||||
"MusicBrainzRecordingID": "ID da gravação no MusicBrainz",
|
||||
"MusicBrainzBookID": "ID do livro no MusicBrainz",
|
||||
"MusicBrainzAuthorID": "ID do autor no MusicBrainz",
|
||||
"MonitoringOptions": "Opções de Monitoramento",
|
||||
"MonitoringOptions": "Opções de monitoramento",
|
||||
"MonitoredHelpText": "O Readarr pesquisará e baixará o livro",
|
||||
"MonitoredAuthorIsUnmonitored": "O autor não está sendo monitorado",
|
||||
"MonitoredAuthorIsMonitored": "O autor está sendo monitorado",
|
||||
@@ -554,7 +554,7 @@
|
||||
"IndexerIdHelpText": "Especificar a qual indexador o perfil se aplica",
|
||||
"ImportLists": "Listas de importação",
|
||||
"ImportListSettings": "Configurações Gerais da Lista de Importação",
|
||||
"ImportListExclusions": "Importar Lista de Exclusões",
|
||||
"ImportListExclusions": "Exclusões da lista de importação",
|
||||
"ImportFailures": "Falhas na importação",
|
||||
"IgnoreDeletedBooks": "Ignorar livros excluídos",
|
||||
"IfYouDontAddAnImportListExclusionAndTheAuthorHasAMetadataProfileOtherThanNoneThenThisBookMayBeReaddedDuringTheNextAuthorRefresh": "Se você não adicionar uma exclusão à lista de importação e o autor tiver um perfil de metadados diferente de \"Nenhum\", este livro poderá ser adicionado novamente durante a próxima atualização do autor.",
|
||||
@@ -576,7 +576,7 @@
|
||||
"EntityName": "Nome da entidade",
|
||||
"EndedAllBooksDownloaded": "Terminado (todos os livros baixados)",
|
||||
"EnabledHelpText": "Marque para habilitar o perfil de lançamento",
|
||||
"EnableProfile": "Habilitar Perfil",
|
||||
"EnableProfile": "Habilitar perfil",
|
||||
"EnableAutomaticAddHelpText": "Adicionar autor/livros ao Readarr ao sincronizar pela interface ou pelo Readarr",
|
||||
"EmbedMetadataInBookFiles": "Incorporar metadados nos arquivos do livro",
|
||||
"EmbedMetadataHelpText": "Pedir ao Calibre para gravar metadados no arquivo do livro",
|
||||
@@ -590,7 +590,7 @@
|
||||
"Development": "Desenvolvimento",
|
||||
"DeleteRootFolder": "Excluir Pasta Raiz",
|
||||
"DeleteMetadataProfile": "Excluir perfil de metadados",
|
||||
"DeleteImportList": "Excluir Lista de Importação",
|
||||
"DeleteImportList": "Excluir lista de importação",
|
||||
"DeleteFilesHelpText": "Excluir arquivos do livro e pasta do autor",
|
||||
"DeleteBookFileMessageText": "Tem certeza que deseja excluir {0}?",
|
||||
"DeleteBookFile": "Excluir arquivo de livro",
|
||||
@@ -608,7 +608,7 @@
|
||||
"ConsoleLogLevel": "Nível de log do console",
|
||||
"CollapseMultipleBooksHelpText": "Recolher vários livros lançados no mesmo dia",
|
||||
"CollapseMultipleBooks": "Recolher vários livros",
|
||||
"ChownGroup": "chown Grupo",
|
||||
"ChownGroup": "Grupo chown",
|
||||
"CatalogNumber": "Número do Catálogo",
|
||||
"CalibreUsername": "Nome de usuário do Calibre",
|
||||
"CalibreUrlBase": "URL base do Calibre",
|
||||
@@ -664,6 +664,7 @@
|
||||
"OutputPath": "Caminho de saída",
|
||||
"Progress": "Progresso",
|
||||
"ReleaseTitle": "Título do Lançamento",
|
||||
"UI": "UI",
|
||||
"Actions": "Ações",
|
||||
"FilterAuthor": "Filtro de Autor",
|
||||
"NameFirstLast": "Primeiro Nome Último Nome",
|
||||
@@ -734,17 +735,17 @@
|
||||
"OnBookFileDeleteHelpText": "Ao Excluir um Arquivo de Livro",
|
||||
"OnBookTagUpdate": "Ao Atualizar Etiqueta de um Livro",
|
||||
"OnDownloadFailure": "Na Falha do Download",
|
||||
"OnGrab": "Ao Baixar",
|
||||
"OnHealthIssue": "Ao Problema de Saúde",
|
||||
"OnGrab": "Ao obter",
|
||||
"OnHealthIssue": "Em Problema de Saúde",
|
||||
"OnImportFailure": "Em uma Falha de Importação",
|
||||
"OnReleaseImport": "Ao Importar Lançamento",
|
||||
"OnRename": "Ao Renomear",
|
||||
"OnUpgrade": "Ao Atualizar",
|
||||
"AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Nenhum indexador disponível com a Pesquisa Interativa habilitada, o Readarr não fornecerá nenhum resultado de pesquisa interativa",
|
||||
"IndexerSearchCheckNoInteractiveMessage": "Nenhum indexador disponível com a Pesquisa interativa habilitada, o Readarr não fornecerá nenhum resultado de pesquisa interativa",
|
||||
"ConnectSettingsSummary": "Notificações, conexões com servidores/tocadores de mídia e scripts personalizados",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Todos os clientes de download estão indisponíveis devido a falhas",
|
||||
"DownloadClientsSettingsSummary": "Clientes de download, gerenciamento de download e mapeamentos de caminhos remotos",
|
||||
"DownloadClientsSettingsSummary": "Clientes de download, gerenciamento do download e mapeamento remoto de caminhos",
|
||||
"Yesterday": "Ontem",
|
||||
"Connect": "Conectar",
|
||||
"CouldntFindAnyResultsForTerm": "Não foi possível encontrar nenhum resultado para '{0}'",
|
||||
@@ -784,7 +785,7 @@
|
||||
"IndexerStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a falhas: {0}",
|
||||
"Lists": "Listas",
|
||||
"MediaManagement": "Gerenciamento de Mídia",
|
||||
"MediaManagementSettingsSummary": "Nomenclatura, configurações de gerenciamento de arquivos e pastas raiz",
|
||||
"MediaManagementSettingsSummary": "Nomeação, configurações de gerenciamento de arquivo e pastas raízes",
|
||||
"Metadata": "Metadados",
|
||||
"MissingFromDisk": "Readarr não conseguiu encontrar o arquivo no disco, então o arquivo foi desvinculado do livro no banco de dados",
|
||||
"Monitor": "Monitorar",
|
||||
@@ -823,14 +824,14 @@
|
||||
"SettingsRemotePathMappingLocalPath": "Caminho local",
|
||||
"SettingsRemotePathMappingRemotePath": "Caminho Remoto",
|
||||
"SettingsRemotePathMappingRemotePathHelpText": "Caminho raiz para o diretório que o Cliente de Download acessa",
|
||||
"SizeLimit": "Limite de Tamanho",
|
||||
"SizeLimit": "Tamanho limite",
|
||||
"SystemTimeCheckMessage": "A hora do sistema está desligada por mais de 1 dia. Tarefas agendadas podem não ser executadas corretamente até que o horário seja corrigido",
|
||||
"TimeLeft": "Tempo Restante",
|
||||
"UISettingsSummary": "Opções de calendário, data e cores prejudicadas",
|
||||
"UpdateCheckStartupNotWritableMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' não pode ser gravada pelo usuário '{1}'.",
|
||||
"UpdateCheckStartupTranslocationMessage": "Não é possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de translocação de aplicativo.",
|
||||
"TagsSettingsSummary": "Gerenciar etiquetas de autor, perfil, restrição e notificação",
|
||||
"InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog",
|
||||
"InstanceNameHelpText": "Nome da instância na guia e para o nome do aplicativo do Syslog",
|
||||
"AddList": "Adicionar Lista",
|
||||
"DataExistingBooks": "Monitorar livros que você tem arquivos ou que não foram lançados ainda",
|
||||
"DataListMonitorAll": "Monitorar autores e todos os livros para cada autor incluído na lista de importação",
|
||||
@@ -841,8 +842,8 @@
|
||||
"RenameFiles": "Renomear Arquivos",
|
||||
"Test": "Testar",
|
||||
"WriteMetadataTags": "Salvar tags de metadados",
|
||||
"RestartRequiredHelpTextWarning": "Requer reinicialização para entrar em vigor",
|
||||
"InstanceName": "Nome da Instância",
|
||||
"RestartRequiredHelpTextWarning": "Requer reinicialização para ter efeito",
|
||||
"InstanceName": "Nome da instância",
|
||||
"ConvertToFormat": "Converter para o Formato",
|
||||
"DataAllBooks": "Monitorar todos os livros",
|
||||
"DataFirstBook": "Monitorar o primeiro livro. Todos os outros livros serão ignorados",
|
||||
@@ -864,7 +865,7 @@
|
||||
"EnableRssHelpText": "Será usado quando o Readarr procurar periodicamente lançamentos via RSS Sync",
|
||||
"HardlinkCopyFiles": "Vínculo real/Copiar arquivos",
|
||||
"MoveFiles": "Mover arquivos",
|
||||
"OnApplicationUpdate": "Na Atualização do Aplicativo",
|
||||
"OnApplicationUpdate": "Ao atualizar o aplicativo",
|
||||
"OnApplicationUpdateHelpText": "Ao atualizar o aplicativo",
|
||||
"ChooseImportMethod": "Escolha o método de importação",
|
||||
"ClickToChangeReleaseGroup": "Clique para alterar o grupo do lançamento",
|
||||
@@ -873,7 +874,7 @@
|
||||
"BypassIfHighestQuality": "Ignorar se a qualidade mais alta",
|
||||
"BypassIfHighestQualityHelpText": "Ignorar o atraso quando o lançamento tiver a qualidade habilitada mais alta no perfil de qualidade",
|
||||
"CustomFormatScore": "Pontuação do formato personalizado",
|
||||
"MinimumCustomFormatScore": "Pontuação Mínima de Formato Personalizado",
|
||||
"MinimumCustomFormatScore": "Pontuação mínima de formato personalizado",
|
||||
"MinimumCustomFormatScoreHelpText": "Pontuação mínima de formato personalizado necessária para ignorar o atraso do protocolo preferido",
|
||||
"ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {0} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração",
|
||||
"DeleteFormat": "Excluir Formato",
|
||||
@@ -902,7 +903,7 @@
|
||||
"DeleteCustomFormatMessageText": "Tem certeza de que deseja excluir o formato personalizado '{0}'?",
|
||||
"ImportListMissingRoot": "Pasta raiz ausente para lista(s) de importação: {0}",
|
||||
"ImportListMultipleMissingRoots": "Várias pastas raiz estão ausentes para listas de importação: {0}",
|
||||
"IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para baixar deste indexador",
|
||||
"IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para capturas deste indexador",
|
||||
"ListRefreshInterval": "Intervalo de atualização da lista",
|
||||
"ListWillRefreshEveryInterp": "A lista será atualizada a cada {0}",
|
||||
"ResetDefinitionTitlesHelpText": "Redefinir títulos de definição, bem como valores",
|
||||
@@ -913,12 +914,12 @@
|
||||
"HideAdvanced": "Ocultar Avançado",
|
||||
"ShowAdvanced": "Mostrar Avançado",
|
||||
"ShownClickToHide": "Mostrado, clique para ocultar",
|
||||
"ColonReplacement": "Substituto para dois-pontos",
|
||||
"ColonReplacement": "Substituição de Dois Pontos",
|
||||
"DashOrSpaceDashDependingOnName": "Traço ou Traço e Espaço dependendo do nome",
|
||||
"ReplaceWithDash": "Substituir por Traço",
|
||||
"ReplaceWithSpaceDash": "Substituir por Espaço e Traço",
|
||||
"ReplaceWithDash": "Substituir por traço",
|
||||
"ReplaceWithSpaceDash": "Substituir com Espaço e Traço",
|
||||
"SmartReplace": "Substituição Inteligente",
|
||||
"ReplaceWithSpaceDashSpace": "Substituir com Espaço, Traço e Espaço",
|
||||
"ReplaceWithSpaceDashSpace": "Substituir com Espaço e Traço e Espaço",
|
||||
"DeleteRemotePathMapping": "Excluir Mapeamento de Caminho Remoto",
|
||||
"BlocklistReleases": "Lançamentos na lista de bloqueio",
|
||||
"CloneCondition": "Condição de clone",
|
||||
@@ -951,7 +952,7 @@
|
||||
"NoDownloadClientsFound": "Nenhum cliente de download encontrado",
|
||||
"NoImportListsFound": "Nenhuma lista de importação encontrada",
|
||||
"NoIndexersFound": "Nenhum indexador encontrado",
|
||||
"RedownloadFailed": "Redownload falhou",
|
||||
"RedownloadFailed": "Baixar Novamente Falhou",
|
||||
"RemoveFailedDownloads": "Remover downloads com falha",
|
||||
"RemoveDownloadsAlert": "As configurações de remoção foram movidas para as configurações individuais do cliente de download na tabela acima.",
|
||||
"RemoveFailed": "Falha na remoção",
|
||||
@@ -982,6 +983,5 @@
|
||||
"No": "Não",
|
||||
"RemoveCompletedDownloads": "Remover downloads concluídos",
|
||||
"RemovingTag": "Removendo etiqueta",
|
||||
"SkipRedownloadHelpText": "Impede Readarr de tentar baixar versões alternativas para os itens removidos",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {0}."
|
||||
"SkipRedownloadHelpText": "Impede Readarr de tentar baixar versões alternativas para os itens removidos"
|
||||
}
|
||||
|
||||
@@ -94,6 +94,7 @@
|
||||
"AgeWhenGrabbed": "Vârsta (când a fost apucat)",
|
||||
"AlreadyInYourLibrary": "Deja în biblioteca dvs.",
|
||||
"AlternateTitles": "Titlu alternativ",
|
||||
"Authentication": "Autentificare",
|
||||
"AuthenticationMethodHelpText": "Solicitați numele de utilizator și parola pentru a accesa Radarr",
|
||||
"AuthorClickToChangeBook": "Faceți clic pentru a schimba filmul",
|
||||
"AutoRedownloadFailedHelpText": "Căutați automat și încercați să descărcați o versiune diferită",
|
||||
@@ -449,6 +450,7 @@
|
||||
"ReplaceIllegalCharactersHelpText": "Înlocuiți personajele ilegale. Dacă nu este bifat, Radarr le va elimina în schimb",
|
||||
"ShowReleaseDate": "Afișează data lansării",
|
||||
"ShowTitle": "Arata titlul",
|
||||
"UI": "Interfață Grafica",
|
||||
"OutputPath": "Calea pentru Output",
|
||||
"Progress": "Progres",
|
||||
"ShowBookTitleHelpText": "Afișați titlul filmului sub afiș",
|
||||
|
||||
@@ -450,6 +450,7 @@
|
||||
"ShowBookTitleHelpText": "Показать название фильма под постером",
|
||||
"ShowReleaseDate": "Показать дату выпуска",
|
||||
"ShowTitle": "Показать название",
|
||||
"UI": "Пользовательский интерфейс",
|
||||
"Actions": "Действия",
|
||||
"Progress": "Прогресс",
|
||||
"ReleaseTitle": "Название релиза",
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
"MetadataProfiles": "profil metadát",
|
||||
"RecyclingBin": "Kôš",
|
||||
"Search": "Hľadať",
|
||||
"UI": "UI",
|
||||
"UpdateMechanismHelpText": "Použiť vstavaný Prowlarr aktualizátor alebo skript",
|
||||
"Updates": "Aktualizovať",
|
||||
"URLBase": "Základ URL",
|
||||
|
||||
@@ -450,6 +450,7 @@
|
||||
"ShowReleaseDate": "Visa släppdatum",
|
||||
"ShowTitle": "Visa titel",
|
||||
"Today": "Idag",
|
||||
"UI": "Användargränssnitt",
|
||||
"Actions": "Åtgärder",
|
||||
"BookAvailableButMissing": "Film Tillgänglig, men Saknas",
|
||||
"NotAvailable": "Inte tillgänglig",
|
||||
|
||||
@@ -441,6 +441,7 @@
|
||||
"YesCancel": "ใช่ยกเลิก",
|
||||
"DownloadClientCheckDownloadingToRoot": "ดาวน์โหลดไคลเอนต์ {0} จะทำการดาวน์โหลดในโฟลเดอร์รูท {1} คุณไม่ควรดาวน์โหลดไปยังโฟลเดอร์รูท",
|
||||
"ReplaceIllegalCharactersHelpText": "แทนที่อักขระที่ผิดกฎหมาย หากไม่เลือก Radarr จะลบออกแทน",
|
||||
"UI": "UI",
|
||||
"Progress": "ความคืบหน้า",
|
||||
"NotAvailable": "ไม่สามารถใช้ได้",
|
||||
"NotMonitored": "ไม่ได้รับการตรวจสอบ",
|
||||
|
||||
@@ -452,6 +452,7 @@
|
||||
"ShowTitle": "Başlığı göster",
|
||||
"Today": "Bugün",
|
||||
"Tomorrow": "Yarın",
|
||||
"UI": "UI",
|
||||
"Actions": "Etkiler",
|
||||
"Component": "Bileşen",
|
||||
"Level": "Seviye",
|
||||
|
||||
@@ -448,6 +448,7 @@
|
||||
"MetadataSettings": "Налаштування метаданих",
|
||||
"Monitor": "Контрольований",
|
||||
"Monitored": "Відстежується",
|
||||
"UI": "Інтерфейс користувача",
|
||||
"Usenet": "Usenet",
|
||||
"Logging": "Журналування",
|
||||
"MaintenanceRelease": "Випуск для обслуговування: виправлення помилок та інші покращення. Щоб отримати докладнішу інформацію, перегляньте історію фіксації Github",
|
||||
|
||||
@@ -443,6 +443,7 @@
|
||||
"ReleaseTitle": "Tiêu đề phát hành",
|
||||
"Actions": "Hành động",
|
||||
"ReplaceIllegalCharactersHelpText": "Thay thế các ký tự bất hợp pháp. Nếu không được chọn, Radarr sẽ xóa chúng thay thế",
|
||||
"UI": "Giao diện người dùng",
|
||||
"Tomorrow": "Ngày mai",
|
||||
"Today": "Hôm nay",
|
||||
"Progress": "Phát triển",
|
||||
|
||||
@@ -458,6 +458,7 @@
|
||||
"TheAuthorFolderAndAllOfItsContentWillBeDeleted": "电影目录 '{0}' 及所有内容都会被删除。",
|
||||
"Today": "今天",
|
||||
"Tomorrow": "明天",
|
||||
"UI": "UI界面",
|
||||
"UnableToLoadMetadataProfiles": "无法加载元数据配置",
|
||||
"Label": "标签",
|
||||
"Component": "组件",
|
||||
|
||||
@@ -171,6 +171,8 @@ namespace NzbDrone.Host
|
||||
.PersistKeysToFileSystem(new DirectoryInfo(Configuration["dataProtectionFolder"]));
|
||||
|
||||
services.AddSingleton<IAuthorizationPolicyProvider, UiAuthorizationPolicyProvider>();
|
||||
services.AddSingleton<IAuthorizationHandler, UiAuthorizationHandler>();
|
||||
|
||||
services.AddAuthorization(options =>
|
||||
{
|
||||
options.AddPolicy("SignalR", policy =>
|
||||
|
||||
@@ -38,12 +38,12 @@ namespace NzbDrone.Test.Common
|
||||
Port = port;
|
||||
}
|
||||
|
||||
public void Start()
|
||||
public void Start(bool enableAuth = false)
|
||||
{
|
||||
AppData = Path.Combine(TestContext.CurrentContext.TestDirectory, "_intg_" + TestBase.GetUID());
|
||||
Directory.CreateDirectory(AppData);
|
||||
|
||||
GenerateConfigFile();
|
||||
GenerateConfigFile(enableAuth);
|
||||
|
||||
string readarrConsoleExe;
|
||||
if (OsInfo.IsWindows)
|
||||
@@ -178,7 +178,7 @@ namespace NzbDrone.Test.Common
|
||||
}
|
||||
}
|
||||
|
||||
private void GenerateConfigFile()
|
||||
private void GenerateConfigFile(bool enableAuth)
|
||||
{
|
||||
var configFile = Path.Combine(AppData, "config.xml");
|
||||
|
||||
@@ -191,6 +191,8 @@ namespace NzbDrone.Test.Common
|
||||
new XElement(nameof(ConfigFileProvider.ApiKey), apiKey),
|
||||
new XElement(nameof(ConfigFileProvider.LogLevel), "trace"),
|
||||
new XElement(nameof(ConfigFileProvider.AnalyticsEnabled), false),
|
||||
new XElement(nameof(ConfigFileProvider.AuthenticationMethod), enableAuth ? "Forms" : "None"),
|
||||
new XElement(nameof(ConfigFileProvider.AuthenticationRequired), "DisabledForLocalAddresses"),
|
||||
new XElement(nameof(ConfigFileProvider.Port), Port)));
|
||||
|
||||
var data = xDoc.ToString();
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace Readarr.Api.V1.Config
|
||||
public bool EnableSsl { get; set; }
|
||||
public bool LaunchBrowser { get; set; }
|
||||
public AuthenticationType AuthenticationMethod { get; set; }
|
||||
public AuthenticationRequiredType AuthenticationRequired { get; set; }
|
||||
public bool AnalyticsEnabled { get; set; }
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
@@ -57,6 +58,7 @@ namespace Readarr.Api.V1.Config
|
||||
EnableSsl = model.EnableSsl,
|
||||
LaunchBrowser = model.LaunchBrowser,
|
||||
AuthenticationMethod = model.AuthenticationMethod,
|
||||
AuthenticationRequired = model.AuthenticationRequired,
|
||||
AnalyticsEnabled = model.AnalyticsEnabled,
|
||||
|
||||
//Username
|
||||
|
||||
@@ -4119,6 +4119,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"/initialize.js": {
|
||||
"get": {
|
||||
"tags": [
|
||||
"InitializeJs"
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Success"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/v1/language": {
|
||||
"get": {
|
||||
"tags": [
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Readarr.Http.Authentication
|
||||
public class ApiKeyAuthenticationOptions : AuthenticationSchemeOptions
|
||||
{
|
||||
public const string DefaultScheme = "API Key";
|
||||
|
||||
public string Scheme => DefaultScheme;
|
||||
public string AuthenticationType = DefaultScheme;
|
||||
|
||||
|
||||
@@ -22,10 +22,16 @@ namespace Readarr.Http.Authentication
|
||||
return authenticationBuilder.AddScheme<AuthenticationSchemeOptions, NoAuthenticationHandler>(name, options => { });
|
||||
}
|
||||
|
||||
public static AuthenticationBuilder AddExternal(this AuthenticationBuilder authenticationBuilder, string name)
|
||||
{
|
||||
return authenticationBuilder.AddScheme<AuthenticationSchemeOptions, NoAuthenticationHandler>(name, options => { });
|
||||
}
|
||||
|
||||
public static AuthenticationBuilder AddAppAuthentication(this IServiceCollection services)
|
||||
{
|
||||
return services.AddAuthentication()
|
||||
.AddNone(AuthenticationType.None.ToString())
|
||||
.AddExternal(AuthenticationType.External.ToString())
|
||||
.AddBasic(AuthenticationType.Basic.ToString())
|
||||
.AddCookie(AuthenticationType.Forms.ToString(), options =>
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user