New: More translations for columns

This commit is contained in:
Bogdan 2023-07-29 04:39:06 +03:00 committed by GitHub
parent cda9cf726a
commit aee8579d18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 269 additions and 196 deletions

View File

@ -206,9 +206,11 @@ class FilterBuilderRow extends Component {
const selectedFilterBuilderProp = this.selectedFilterBuilderProp; const selectedFilterBuilderProp = this.selectedFilterBuilderProp;
const keyOptions = filterBuilderProps.map((availablePropFilter) => { const keyOptions = filterBuilderProps.map((availablePropFilter) => {
const { name, label } = availablePropFilter;
return { return {
key: availablePropFilter.name, key: name,
value: availablePropFilter.label value: typeof label === 'function' ? label() : label
}; };
}).sort((a, b) => a.value.localeCompare(b.value)); }).sort((a, b) => a.value.localeCompare(b.value));

View File

@ -61,7 +61,7 @@ class SelectInput extends Component {
value={key} value={key}
{...otherOptionProps} {...otherOptionProps}
> >
{optionValue} {typeof optionValue === 'function' ? optionValue() : optionValue}
</option> </option>
); );
}) })
@ -75,7 +75,7 @@ SelectInput.propTypes = {
className: PropTypes.string, className: PropTypes.string,
disabledClassName: PropTypes.string, disabledClassName: PropTypes.string,
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired, value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.func]).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired, values: PropTypes.arrayOf(PropTypes.object).isRequired,
isDisabled: PropTypes.bool, isDisabled: PropTypes.bool,
hasError: PropTypes.bool, hasError: PropTypes.bool,

View File

@ -32,7 +32,7 @@ class FilterMenuContent extends Component {
selectedFilterKey={selectedFilterKey} selectedFilterKey={selectedFilterKey}
onPress={onFilterSelect} onPress={onFilterSelect}
> >
{filter.label} {typeof filter.label === 'function' ? filter.label() : filter.label}
</FilterMenuItem> </FilterMenuItem>
); );
}) })

View File

@ -1,8 +1,10 @@
import React from 'react'; import React from 'react';
type PropertyFunction<T> = () => T;
interface Column { interface Column {
name: string; name: string;
label: string | React.ReactNode; label: string | PropertyFunction<string> | React.ReactNode;
columnLabel?: string; columnLabel?: string;
isSortable?: boolean; isSortable?: boolean;
isVisible: boolean; isVisible: boolean;

View File

@ -107,7 +107,7 @@ function Table(props) {
{...getTableHeaderCellProps(otherProps)} {...getTableHeaderCellProps(otherProps)}
{...column} {...column}
> >
{column.label} {typeof column.label === 'function' ? column.label() : column.label}
</TableHeaderCell> </TableHeaderCell>
); );
}) })

View File

@ -30,6 +30,7 @@ class TableHeaderCell extends Component {
const { const {
className, className,
name, name,
label,
columnLabel, columnLabel,
isSortable, isSortable,
isVisible, isVisible,
@ -53,7 +54,8 @@ class TableHeaderCell extends Component {
{...otherProps} {...otherProps}
component="th" component="th"
className={className} className={className}
title={columnLabel} label={typeof label === 'function' ? label() : label}
title={typeof columnLabel === 'function' ? columnLabel() : columnLabel}
onPress={this.onPress} onPress={this.onPress}
> >
{children} {children}
@ -77,7 +79,8 @@ class TableHeaderCell extends Component {
TableHeaderCell.propTypes = { TableHeaderCell.propTypes = {
className: PropTypes.string, className: PropTypes.string,
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
columnLabel: PropTypes.string, label: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.node]),
columnLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
isSortable: PropTypes.bool, isSortable: PropTypes.bool,
isVisible: PropTypes.bool, isVisible: PropTypes.bool,
isModifiable: PropTypes.bool, isModifiable: PropTypes.bool,

View File

@ -35,7 +35,7 @@ function TableOptionsColumn(props) {
isDisabled={isModifiable === false} isDisabled={isModifiable === false}
onChange={onVisibleChange} onChange={onVisibleChange}
/> />
{label} {typeof label === 'function' ? label() : label}
</label> </label>
{ {
@ -56,7 +56,7 @@ function TableOptionsColumn(props) {
TableOptionsColumn.propTypes = { TableOptionsColumn.propTypes = {
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
label: PropTypes.string.isRequired, label: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
isVisible: PropTypes.bool.isRequired, isVisible: PropTypes.bool.isRequired,
isModifiable: PropTypes.bool.isRequired, isModifiable: PropTypes.bool.isRequired,
index: PropTypes.number.isRequired, index: PropTypes.number.isRequired,

View File

@ -112,7 +112,7 @@ class TableOptionsColumnDragSource extends Component {
<TableOptionsColumn <TableOptionsColumn
name={name} name={name}
label={label} label={typeof label === 'function' ? label() : label}
isVisible={isVisible} isVisible={isVisible}
isModifiable={isModifiable} isModifiable={isModifiable}
index={index} index={index}
@ -138,7 +138,7 @@ class TableOptionsColumnDragSource extends Component {
TableOptionsColumnDragSource.propTypes = { TableOptionsColumnDragSource.propTypes = {
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
label: PropTypes.string.isRequired, label: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
isVisible: PropTypes.bool.isRequired, isVisible: PropTypes.bool.isRequired,
isModifiable: PropTypes.bool.isRequired, isModifiable: PropTypes.bool.isRequired,
index: PropTypes.number.isRequired, index: PropTypes.number.isRequired,

View File

@ -110,7 +110,7 @@ function SeriesIndexTableHeader(props: SeriesIndexTableHeaderProps) {
isSortable={isSortable} isSortable={isSortable}
onSortPress={onSortPress} onSortPress={onSortPress}
> >
{label} {typeof label === 'function' ? label() : label}
</VirtualTableHeaderCell> </VirtualTableHeaderCell>
); );
})} })}

View File

@ -4,6 +4,7 @@ import { sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import { set, updateItem } from './baseActions'; import { set, updateItem } from './baseActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createRemoveItemHandler from './Creators/createRemoveItemHandler'; import createRemoveItemHandler from './Creators/createRemoveItemHandler';
@ -32,47 +33,47 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'series.sortTitle', name: 'series.sortTitle',
label: 'Series Title', label: () => translate('SeriesTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'sourceTitle', name: 'sourceTitle',
label: 'Source Title', label: () => translate('SourceTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'languages', name: 'languages',
label: 'Languages', label: () => translate('Languages'),
isVisible: false isVisible: false
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: () => translate('Quality'),
isVisible: true isVisible: true
}, },
{ {
name: 'customFormats', name: 'customFormats',
label: 'Formats', label: () => translate('Formats'),
isSortable: false, isSortable: false,
isVisible: true isVisible: true
}, },
{ {
name: 'date', name: 'date',
label: 'Date', label: () => translate('Date'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'indexer', name: 'indexer',
label: 'Indexer', label: () => translate('Indexer'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: () => translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

View File

@ -8,6 +8,7 @@ import { filterBuilderTypes, filterBuilderValueTypes, filterTypes } from 'Helper
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import findSelectedFilters from 'Utilities/Filter/findSelectedFilters'; import findSelectedFilters from 'Utilities/Filter/findSelectedFilters';
import translate from 'Utilities/String/translate';
import { set, update } from './baseActions'; import { set, update } from './baseActions';
import { executeCommandHelper } from './commandActions'; import { executeCommandHelper } from './commandActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -56,7 +57,7 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: () => translate('All'),
filters: [ filters: [
{ {
key: 'unmonitored', key: 'unmonitored',
@ -67,7 +68,7 @@ export const defaultState = {
}, },
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored Only', label: () => translate('MonitoredOnly'),
filters: [ filters: [
{ {
key: 'unmonitored', key: 'unmonitored',
@ -81,13 +82,13 @@ export const defaultState = {
filterBuilderProps: [ filterBuilderProps: [
{ {
name: 'unmonitored', name: 'unmonitored',
label: 'Include Unmonitored', label: () => translate('IncludeUnmonitored'),
type: filterBuilderTypes.EQUAL, type: filterBuilderTypes.EQUAL,
valueType: filterBuilderValueTypes.BOOL valueType: filterBuilderValueTypes.BOOL
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: () => translate('Tags'),
type: filterBuilderTypes.CONTAINS, type: filterBuilderTypes.CONTAINS,
valueType: filterBuilderValueTypes.TAG valueType: filterBuilderValueTypes.TAG
} }

View File

@ -33,7 +33,7 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'monitored', name: 'monitored',
columnLabel: 'Monitored', columnLabel: () => translate('Monitored'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
@ -44,94 +44,91 @@ export const defaultState = {
}, },
{ {
name: 'title', name: 'title',
label: 'Title', label: () => translate('Title'),
isVisible: true isVisible: true
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: () => translate('Path'),
isVisible: false isVisible: false
}, },
{ {
name: 'relativePath', name: 'relativePath',
label: 'Relative Path', label: () => translate('RelativePath'),
isVisible: false isVisible: false
}, },
{ {
name: 'airDateUtc', name: 'airDateUtc',
label: 'Air Date', label: () => translate('AirDate'),
isVisible: true isVisible: true
}, },
{ {
name: 'runtime', name: 'runtime',
label: 'Runtime', label: () => translate('Runtime'),
isVisible: false isVisible: false
}, },
{ {
name: 'languages', name: 'languages',
label: 'Languages', label: () => translate('Languages'),
isVisible: false isVisible: false
}, },
{ {
name: 'audioInfo', name: 'audioInfo',
label: 'Audio Info', label: () => translate('AudioInfo'),
isVisible: false isVisible: false
}, },
{ {
name: 'videoCodec', name: 'videoCodec',
label: 'Video Codec', label: () => translate('VideoCodec'),
isVisible: false isVisible: false
}, },
{ {
name: 'videoDynamicRangeType', name: 'videoDynamicRangeType',
label: 'Video Dynamic Range', label: () => translate('VideoDynamicRange'),
isVisible: false isVisible: false
}, },
{ {
name: 'audioLanguages', name: 'audioLanguages',
label: 'Audio Languages', label: () => translate('AudioLanguages'),
isVisible: false isVisible: false
}, },
{ {
name: 'subtitleLanguages', name: 'subtitleLanguages',
label: 'Subtitle Languages', label: () => translate('SubtitleLanguages'),
isVisible: false isVisible: false
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: () => translate('Size'),
isVisible: false isVisible: false
}, },
{ {
name: 'releaseGroup', name: 'releaseGroup',
label: 'Release Group', label: () => translate('ReleaseGroup'),
isVisible: false isVisible: false
}, },
{ {
name: 'customFormats', name: 'customFormats',
label: 'Formats', label: () => translate('Formats'),
isVisible: false isVisible: false
}, },
{ {
name: 'customFormatScore', name: 'customFormatScore',
get columnLabel() { columnLabel: () => translate('CustomFormatScore'),
return translate('CustomFormatScore');
},
label: React.createElement(Icon, { label: React.createElement(Icon, {
name: icons.SCORE, name: icons.SCORE,
title: () => translate('CustomFormatScore') title: () => translate('CustomFormatScore')
}), }),
isVisible: false isVisible: false
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: () => translate('Status'),
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: () => translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

View File

@ -5,6 +5,7 @@ import { filterTypes, icons, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import { updateItem } from './baseActions'; import { updateItem } from './baseActions';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers'; import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers';
@ -31,80 +32,80 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'eventType', name: 'eventType',
columnLabel: 'Event Type', columnLabel: () => translate('EventType'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'series.sortTitle', name: 'series.sortTitle',
label: 'Series', label: () => translate('Series'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'episode', name: 'episode',
label: 'Episode', label: () => translate('Episode'),
isVisible: true isVisible: true
}, },
{ {
name: 'episodes.title', name: 'episodes.title',
label: 'Episode Title', label: () => translate('EpisodeTitle'),
isVisible: true isVisible: true
}, },
{ {
name: 'languages', name: 'languages',
label: 'Languages', label: () => translate('Languages'),
isVisible: false isVisible: false
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: () => translate('Quality'),
isVisible: true isVisible: true
}, },
{ {
name: 'customFormats', name: 'customFormats',
label: 'Formats', label: () => translate('Formats'),
isSortable: false, isSortable: false,
isVisible: true isVisible: true
}, },
{ {
name: 'date', name: 'date',
label: 'Date', label: () => translate('Date'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'downloadClient', name: 'downloadClient',
label: 'Download Client', label: () => translate('DownloadClient'),
isVisible: false isVisible: false
}, },
{ {
name: 'indexer', name: 'indexer',
label: 'Indexer', label: () => translate('Indexer'),
isVisible: false isVisible: false
}, },
{ {
name: 'releaseGroup', name: 'releaseGroup',
label: 'Release Group', label: () => translate('ReleaseGroup'),
isVisible: false isVisible: false
}, },
{ {
name: 'sourceTitle', name: 'sourceTitle',
label: 'Source Title', label: () => translate('SourceTitle'),
isVisible: false isVisible: false
}, },
{ {
name: 'customFormatScore', name: 'customFormatScore',
columnLabel: 'Custom Format Score', columnLabel: () => translate('CustomFormatScore'),
label: React.createElement(Icon, { label: React.createElement(Icon, {
name: icons.SCORE, name: icons.SCORE,
title: 'Custom format score' title: () => translate('CustomFormatScore')
}), }),
isVisible: false isVisible: false
}, },
{ {
name: 'details', name: 'details',
columnLabel: 'Details', columnLabel: () => translate('Details'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }
@ -115,12 +116,12 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: () => translate('All'),
filters: [] filters: []
}, },
{ {
key: 'grabbed', key: 'grabbed',
label: 'Grabbed', label: () => translate('Grabbed'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -131,7 +132,7 @@ export const defaultState = {
}, },
{ {
key: 'imported', key: 'imported',
label: 'Imported', label: () => translate('Imported'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -142,7 +143,7 @@ export const defaultState = {
}, },
{ {
key: 'failed', key: 'failed',
label: 'Failed', label: () => translate('Failed'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -153,7 +154,7 @@ export const defaultState = {
}, },
{ {
key: 'deleted', key: 'deleted',
label: 'Deleted', label: () => translate('Deleted'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -164,7 +165,7 @@ export const defaultState = {
}, },
{ {
key: 'renamed', key: 'renamed',
label: 'Renamed', label: () => translate('Renamed'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',
@ -175,7 +176,7 @@ export const defaultState = {
}, },
{ {
key: 'ignored', key: 'ignored',
label: 'Ignored', label: () => translate('Ignored'),
filters: [ filters: [
{ {
key: 'eventType', key: 'eventType',

View File

@ -7,6 +7,7 @@ import { icons, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import { set, updateItem } from './baseActions'; import { set, updateItem } from './baseActions';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -59,113 +60,113 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'status', name: 'status',
columnLabel: 'Status', columnLabel: () => translate('Status'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'series.sortTitle', name: 'series.sortTitle',
label: 'Series', label: () => translate('Series'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'episode', name: 'episode',
label: 'Episode', label: () => translate('Episode'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'episodes.title', name: 'episodes.title',
label: 'Episode Title', label: () => translate('EpisodeTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'episodes.airDateUtc', name: 'episodes.airDateUtc',
label: 'Episode Air Date', label: () => translate('EpisodeAirDate'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'languages', name: 'languages',
label: 'Languages', label: () => translate('Languages'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: () => translate('Quality'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'customFormats', name: 'customFormats',
label: 'Formats', label: () => translate('Formats'),
isSortable: false, isSortable: false,
isVisible: true isVisible: true
}, },
{ {
name: 'customFormatScore', name: 'customFormatScore',
columnLabel: 'Custom Format Score', columnLabel: () => translate('CustomFormatScore'),
label: React.createElement(Icon, { label: React.createElement(Icon, {
name: icons.SCORE, name: icons.SCORE,
title: 'Custom format score' title: () => translate('CustomFormatScore')
}), }),
isVisible: false isVisible: false
}, },
{ {
name: 'protocol', name: 'protocol',
label: 'Protocol', label: () => translate('Protocol'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'indexer', name: 'indexer',
label: 'Indexer', label: () => translate('Indexer'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'downloadClient', name: 'downloadClient',
label: 'Download Client', label: () => translate('DownloadClient'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'title', name: 'title',
label: 'Release Title', label: () => translate('ReleaseTitle'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: () => translate('Size'),
isSortable: true, isSortable: true,
isVisibile: false isVisibile: false
}, },
{ {
name: 'outputPath', name: 'outputPath',
label: 'Output Path', label: () => translate('OutputPath'),
isSortable: false, isSortable: false,
isVisible: false isVisible: false
}, },
{ {
name: 'estimatedCompletionTime', name: 'estimatedCompletionTime',
label: 'Time Left', label: () => translate('TimeLeft'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'progress', name: 'progress',
label: 'Progress', label: () => translate('Progress'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: () => translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

View File

@ -3,6 +3,7 @@ import { filterBuilderTypes, filterBuilderValueTypes, filterTypePredicates, filt
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import sortByName from 'Utilities/Array/sortByName'; import sortByName from 'Utilities/Array/sortByName';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import translate from 'Utilities/String/translate';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer'; import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer';
@ -62,12 +63,12 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: () => translate('All'),
filters: [] filters: []
}, },
{ {
key: 'season-pack', key: 'season-pack',
label: 'Season Pack', label: () => translate('SeasonPack'),
filters: [ filters: [
{ {
key: 'fullSeason', key: 'fullSeason',
@ -78,7 +79,7 @@ export const defaultState = {
}, },
{ {
key: 'not-season-pack', key: 'not-season-pack',
label: 'Not Season Pack', label: () => translate('NotSeasonPack'),
filters: [ filters: [
{ {
key: 'fullSeason', key: 'fullSeason',
@ -173,51 +174,51 @@ export const defaultState = {
filterBuilderProps: [ filterBuilderProps: [
{ {
name: 'title', name: 'title',
label: 'Title', label: () => translate('Title'),
type: filterBuilderTypes.STRING type: filterBuilderTypes.STRING
}, },
{ {
name: 'age', name: 'age',
label: 'Age', label: () => translate('Age'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'protocol', name: 'protocol',
label: 'Protocol', label: () => translate('Protocol'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.PROTOCOL valueType: filterBuilderValueTypes.PROTOCOL
}, },
{ {
name: 'indexerId', name: 'indexerId',
label: 'Indexer', label: () => translate('Indexer'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.INDEXER valueType: filterBuilderValueTypes.INDEXER
}, },
{ {
name: 'size', name: 'size',
label: 'Size', label: () => translate('Size'),
type: filterBuilderTypes.NUMBER, type: filterBuilderTypes.NUMBER,
valueType: filterBuilderValueTypes.BYTES valueType: filterBuilderValueTypes.BYTES
}, },
{ {
name: 'seeders', name: 'seeders',
label: 'Seeders', label: () => translate('Seeders'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'peers', name: 'peers',
label: 'Peers', label: () => translate('Peers'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'quality', name: 'quality',
label: 'Quality', label: () => translate('Quality'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.QUALITY valueType: filterBuilderValueTypes.QUALITY
}, },
{ {
name: 'languages', name: 'languages',
label: 'Languages', label: () => translate('Languages'),
type: filterBuilderTypes.ARRAY, type: filterBuilderTypes.ARRAY,
optionsSelector: function(items) { optionsSelector: function(items) {
const genreList = items.reduce((acc, release) => { const genreList = items.reduce((acc, release) => {
@ -236,17 +237,17 @@ export const defaultState = {
}, },
{ {
name: 'customFormatScore', name: 'customFormatScore',
label: 'Custom Format Score', label: () => translate('CustomFormatScore'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'rejectionCount', name: 'rejectionCount',
label: 'Rejection Count', label: () => translate('RejectionCount'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'fullSeason', name: 'fullSeason',
label: 'Season Pack', label: () => translate('SeasonPack'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL valueType: filterBuilderValueTypes.BOOL
} }

View File

@ -6,6 +6,7 @@ import { createThunk, handleThunks } from 'Store/thunks';
import sortByName from 'Utilities/Array/sortByName'; import sortByName from 'Utilities/Array/sortByName';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import dateFilterPredicate from 'Utilities/Date/dateFilterPredicate'; import dateFilterPredicate from 'Utilities/Date/dateFilterPredicate';
import translate from 'Utilities/String/translate';
import { set, updateItem } from './baseActions'; import { set, updateItem } from './baseActions';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
@ -29,12 +30,12 @@ export const section = 'series';
export const filters = [ export const filters = [
{ {
key: 'all', key: 'all',
label: 'All', label: () => translate('All'),
filters: [] filters: []
}, },
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored Only', label: () => translate('MonitoredOnly'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -45,7 +46,7 @@ export const filters = [
}, },
{ {
key: 'unmonitored', key: 'unmonitored',
label: 'Unmonitored Only', label: () => translate('UnmonitoredOnly'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -56,7 +57,7 @@ export const filters = [
}, },
{ {
key: 'continuing', key: 'continuing',
label: 'Continuing Only', label: () => translate('ContinuingOnly'),
filters: [ filters: [
{ {
key: 'status', key: 'status',
@ -67,7 +68,7 @@ export const filters = [
}, },
{ {
key: 'ended', key: 'ended',
label: 'Ended Only', label: () => translate('EndedOnly'),
filters: [ filters: [
{ {
key: 'status', key: 'status',
@ -78,7 +79,7 @@ export const filters = [
}, },
{ {
key: 'missing', key: 'missing',
label: 'Missing Episodes', label: () => translate('MissingEpisodes'),
filters: [ filters: [
{ {
key: 'missing', key: 'missing',
@ -194,25 +195,25 @@ export const filterPredicates = {
export const filterBuilderProps = [ export const filterBuilderProps = [
{ {
name: 'monitored', name: 'monitored',
label: 'Monitored', label: () => translate('Monitored'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.BOOL valueType: filterBuilderValueTypes.BOOL
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: () => translate('Status'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.SERIES_STATUS valueType: filterBuilderValueTypes.SERIES_STATUS
}, },
{ {
name: 'seriesType', name: 'seriesType',
label: 'Type', label: () => translate('Type'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.SERIES_TYPES valueType: filterBuilderValueTypes.SERIES_TYPES
}, },
{ {
name: 'network', name: 'network',
label: 'Network', label: () => translate('Network'),
type: filterBuilderTypes.STRING, type: filterBuilderTypes.STRING,
optionsSelector: function(items) { optionsSelector: function(items) {
const tagList = items.reduce((acc, series) => { const tagList = items.reduce((acc, series) => {
@ -231,57 +232,57 @@ export const filterBuilderProps = [
}, },
{ {
name: 'qualityProfileId', name: 'qualityProfileId',
label: 'Quality Profile', label: () => translate('QualityProfile'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
valueType: filterBuilderValueTypes.QUALITY_PROFILE valueType: filterBuilderValueTypes.QUALITY_PROFILE
}, },
{ {
name: 'nextAiring', name: 'nextAiring',
label: 'Next Airing', label: () => translate('NextAiring'),
type: filterBuilderTypes.DATE, type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE valueType: filterBuilderValueTypes.DATE
}, },
{ {
name: 'previousAiring', name: 'previousAiring',
label: 'Previous Airing', label: () => translate('PreviousAiring'),
type: filterBuilderTypes.DATE, type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE valueType: filterBuilderValueTypes.DATE
}, },
{ {
name: 'added', name: 'added',
label: 'Added', label: () => translate('Added'),
type: filterBuilderTypes.DATE, type: filterBuilderTypes.DATE,
valueType: filterBuilderValueTypes.DATE valueType: filterBuilderValueTypes.DATE
}, },
{ {
name: 'seasonCount', name: 'seasonCount',
label: 'Season Count', label: () => translate('SeasonCount'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'episodeProgress', name: 'episodeProgress',
label: 'Episode Progress', label: () => translate('EpisodeProgress'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: () => translate('Path'),
type: filterBuilderTypes.STRING type: filterBuilderTypes.STRING
}, },
{ {
name: 'rootFolderPath', name: 'rootFolderPath',
label: 'Root Folder Path', label: () => translate('RootFolderPath'),
type: filterBuilderTypes.EXACT type: filterBuilderTypes.EXACT
}, },
{ {
name: 'sizeOnDisk', name: 'sizeOnDisk',
label: 'Size on Disk', label: () => translate('SizeOnDisk'),
type: filterBuilderTypes.NUMBER, type: filterBuilderTypes.NUMBER,
valueType: filterBuilderValueTypes.BYTES valueType: filterBuilderValueTypes.BYTES
}, },
{ {
name: 'genres', name: 'genres',
label: 'Genres', label: () => translate('Genres'),
type: filterBuilderTypes.ARRAY, type: filterBuilderTypes.ARRAY,
optionsSelector: function(items) { optionsSelector: function(items) {
const tagList = items.reduce((acc, series) => { const tagList = items.reduce((acc, series) => {
@ -300,7 +301,7 @@ export const filterBuilderProps = [
}, },
{ {
name: 'originalLanguage', name: 'originalLanguage',
label: 'Original Language', label: () => translate('OriginalLanguage'),
type: filterBuilderTypes.EXACT, type: filterBuilderTypes.EXACT,
optionsSelector: function(items) { optionsSelector: function(items) {
const languageList = items.reduce((acc, series) => { const languageList = items.reduce((acc, series) => {
@ -319,33 +320,33 @@ export const filterBuilderProps = [
}, },
{ {
name: 'releaseGroups', name: 'releaseGroups',
label: 'Release Groups', label: () => translate('ReleaseGroups'),
type: filterBuilderTypes.ARRAY type: filterBuilderTypes.ARRAY
}, },
{ {
name: 'ratings', name: 'ratings',
label: 'Rating', label: () => translate('Rating'),
type: filterBuilderTypes.NUMBER type: filterBuilderTypes.NUMBER
}, },
{ {
name: 'certification', name: 'certification',
label: 'Certification', label: () => translate('Certification'),
type: filterBuilderTypes.EXACT type: filterBuilderTypes.EXACT
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: () => translate('Tags'),
type: filterBuilderTypes.ARRAY, type: filterBuilderTypes.ARRAY,
valueType: filterBuilderValueTypes.TAG valueType: filterBuilderValueTypes.TAG
}, },
{ {
name: 'useSceneNumbering', name: 'useSceneNumbering',
label: 'Scene Numbering', label: () => translate('SceneNumbering'),
type: filterBuilderTypes.EXACT type: filterBuilderTypes.EXACT
}, },
{ {
name: 'hasMissingSeason', name: 'hasMissingSeason',
label: 'Has Missing Season', label: () => translate('HasMissingSeason'),
type: filterBuilderTypes.EXACT type: filterBuilderTypes.EXACT
} }
]; ];

View File

@ -1,6 +1,7 @@
import moment from 'moment'; import moment from 'moment';
import { createAction } from 'redux-actions'; import { createAction } from 'redux-actions';
import { sortDirections } from 'Helpers/Props'; import { sortDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer'; import createSetClientSideCollectionFilterReducer from './Creators/Reducers/createSetClientSideCollectionFilterReducer';
import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer'; import createSetClientSideCollectionSortReducer from './Creators/Reducers/createSetClientSideCollectionSortReducer';
@ -53,147 +54,147 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'status', name: 'status',
columnLabel: 'Status', columnLabel: () => translate('Status'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'sortTitle', name: 'sortTitle',
label: 'Series Title', label: () => translate('SeriesTitle'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'seriesType', name: 'seriesType',
label: 'Type', label: () => translate('Type'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'network', name: 'network',
label: 'Network', label: () => translate('Network'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'qualityProfileId', name: 'qualityProfileId',
label: 'Quality Profile', label: () => translate('QualityProfile'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'nextAiring', name: 'nextAiring',
label: 'Next Airing', label: () => translate('NextAiring'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'previousAiring', name: 'previousAiring',
label: 'Previous Airing', label: () => translate('PreviousAiring'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'originalLanguage', name: 'originalLanguage',
label: 'Original Language', label: () => translate('OriginalLanguage'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'added', name: 'added',
label: 'Added', label: () => translate('Added'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'seasonCount', name: 'seasonCount',
label: 'Seasons', label: () => translate('Seasons'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'seasonFolder', name: 'seasonFolder',
label: 'Season Folder', label: () => translate('SeasonFolder'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'episodeProgress', name: 'episodeProgress',
label: 'Episodes', label: () => translate('Episodes'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'episodeCount', name: 'episodeCount',
label: 'Episode Count', label: () => translate('EpisodeCount'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'latestSeason', name: 'latestSeason',
label: 'Latest Season', label: () => translate('LatestSeason'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'year', name: 'year',
label: 'Year', label: () => translate('Year'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'path', name: 'path',
label: 'Path', label: () => translate('Path'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'sizeOnDisk', name: 'sizeOnDisk',
label: 'Size on Disk', label: () => translate('SizeOnDisk'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'genres', name: 'genres',
label: 'Genres', label: () => translate('Genres'),
isSortable: false, isSortable: false,
isVisible: false isVisible: false
}, },
{ {
name: 'ratings', name: 'ratings',
label: 'Rating', label: () => translate('Rating'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'certification', name: 'certification',
label: 'Certification', label: () => translate('Certification'),
isSortable: false, isSortable: false,
isVisible: false isVisible: false
}, },
{ {
name: 'releaseGroups', name: 'releaseGroups',
label: 'Release Groups', label: () => translate('ReleaseGroups'),
isSortable: false, isSortable: false,
isVisible: false isVisible: false
}, },
{ {
name: 'tags', name: 'tags',
label: 'Tags', label: () => translate('Tags'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'useSceneNumbering', name: 'useSceneNumbering',
label: 'Scene Numbering', label: () => translate('SceneNumbering'),
isSortable: true, isSortable: true,
isVisible: false isVisible: false
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: () => translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }

View File

@ -4,6 +4,7 @@ import { setAppValue } from 'Store/Actions/appActions';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import createAjaxRequest from 'Utilities/createAjaxRequest'; import createAjaxRequest from 'Utilities/createAjaxRequest';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import { pingServer } from './appActions'; import { pingServer } from './appActions';
import { set } from './baseActions'; import { set } from './baseActions';
import createFetchHandler from './Creators/createFetchHandler'; import createFetchHandler from './Creators/createFetchHandler';
@ -81,34 +82,34 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'level', name: 'level',
columnLabel: 'Level', columnLabel: () => translate('Level'),
isSortable: false, isSortable: false,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'time', name: 'time',
label: 'Time', label: () => translate('Time'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'logger', name: 'logger',
label: 'Component', label: () => translate('Component'),
isSortable: false, isSortable: false,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'message', name: 'message',
label: 'Message', label: () => translate('Message'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: () => translate('Actions'),
isSortable: true, isSortable: true,
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
@ -120,12 +121,12 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'all', key: 'all',
label: 'All', label: () => translate('All'),
filters: [] filters: []
}, },
{ {
key: 'info', key: 'info',
label: 'Info', label: () => translate('Info'),
filters: [ filters: [
{ {
key: 'level', key: 'level',
@ -136,7 +137,7 @@ export const defaultState = {
}, },
{ {
key: 'warn', key: 'warn',
label: 'Warn', label: () => translate('Warn'),
filters: [ filters: [
{ {
key: 'level', key: 'level',
@ -147,7 +148,7 @@ export const defaultState = {
}, },
{ {
key: 'error', key: 'error',
label: 'Error', label: () => translate('Error'),
filters: [ filters: [
{ {
key: 'level', key: 'level',

View File

@ -2,6 +2,7 @@ import { createAction } from 'redux-actions';
import { filterTypes, sortDirections } from 'Helpers/Props'; import { filterTypes, sortDirections } from 'Helpers/Props';
import { createThunk, handleThunks } from 'Store/thunks'; import { createThunk, handleThunks } from 'Store/thunks';
import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers'; import serverSideCollectionHandlers from 'Utilities/serverSideCollectionHandlers';
import translate from 'Utilities/String/translate';
import createBatchToggleEpisodeMonitoredHandler from './Creators/createBatchToggleEpisodeMonitoredHandler'; import createBatchToggleEpisodeMonitoredHandler from './Creators/createBatchToggleEpisodeMonitoredHandler';
import createHandleActions from './Creators/createHandleActions'; import createHandleActions from './Creators/createHandleActions';
import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers'; import createServerSideCollectionHandlers from './Creators/createServerSideCollectionHandlers';
@ -29,34 +30,34 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'series.sortTitle', name: 'series.sortTitle',
label: 'Series Title', label: () => translate('SeriesTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'episode', name: 'episode',
label: 'Episode', label: () => translate('Episode'),
isVisible: true isVisible: true
}, },
{ {
name: 'episodes.title', name: 'episodes.title',
label: 'Episode Title', label: () => translate('EpisodeTitle'),
isVisible: true isVisible: true
}, },
{ {
name: 'episodes.airDateUtc', name: 'episodes.airDateUtc',
label: 'Air Date', label: () => translate('AirDate'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: () => translate('Status'),
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: () => translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }
@ -67,7 +68,7 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored', label: () => translate('Monitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -78,7 +79,7 @@ export const defaultState = {
}, },
{ {
key: 'unmonitored', key: 'unmonitored',
label: 'Unmonitored', label: () => translate('Unmonitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -101,39 +102,39 @@ export const defaultState = {
columns: [ columns: [
{ {
name: 'series.sortTitle', name: 'series.sortTitle',
label: 'Series Title', label: () => translate('SeriesTitle'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'episode', name: 'episode',
label: 'Episode', label: () => translate('Episode'),
isVisible: true isVisible: true
}, },
{ {
name: 'episodes.title', name: 'episodes.title',
label: 'Episode Title', label: () => translate('EpisodeTitle'),
isVisible: true isVisible: true
}, },
{ {
name: 'episodes.airDateUtc', name: 'episodes.airDateUtc',
label: 'Air Date', label: () => translate('AirDate'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{ {
name: 'languages', name: 'languages',
label: 'Languages', label: () => translate('Languages'),
isVisible: false isVisible: false
}, },
{ {
name: 'status', name: 'status',
label: 'Status', label: () => translate('Status'),
isVisible: true isVisible: true
}, },
{ {
name: 'actions', name: 'actions',
columnLabel: 'Actions', columnLabel: () => translate('Actions'),
isVisible: true, isVisible: true,
isModifiable: false isModifiable: false
} }
@ -144,7 +145,7 @@ export const defaultState = {
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
label: 'Monitored', label: () => translate('Monitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',
@ -155,7 +156,7 @@ export const defaultState = {
}, },
{ {
key: 'unmonitored', key: 'unmonitored',
label: 'Unmonitored', label: () => translate('Unmonitored'),
filters: [ filters: [
{ {
key: 'monitored', key: 'monitored',

View File

@ -4,10 +4,12 @@
"Actions": "Actions", "Actions": "Actions",
"Activity": "Activity", "Activity": "Activity",
"Add": "Add", "Add": "Add",
"AddNew": "Add New",
"Added": "Added", "Added": "Added",
"AddingTag": "Adding tag", "AddingTag": "Adding tag",
"AddNew": "Add New", "Age": "Age",
"AirDate": "Air Date", "AirDate": "Air Date",
"All": "All",
"AllTitles": "All Titles", "AllTitles": "All Titles",
"ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file", "ApiKeyValidationHealthCheckMessage": "Please update your API key to be at least {0} characters long. You can do this via settings or the config file",
"AppDataDirectory": "AppData directory", "AppDataDirectory": "AppData directory",
@ -24,6 +26,8 @@
"ApplyTagsHelpTextRemove": "Remove: Remove the entered tags", "ApplyTagsHelpTextRemove": "Remove: Remove the entered tags",
"ApplyTagsHelpTextReplace": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)", "ApplyTagsHelpTextReplace": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)",
"AptUpdater": "Use apt to install the update", "AptUpdater": "Use apt to install the update",
"AudioInfo": "Audio Info",
"AudioLanguages": "Audio Languages",
"AutoAdd": "Auto Add", "AutoAdd": "Auto Add",
"AutomaticAdd": "Automatic Add", "AutomaticAdd": "Automatic Add",
"Backup": "Backup", "Backup": "Backup",
@ -38,20 +42,24 @@
"Calendar": "Calendar", "Calendar": "Calendar",
"Cancel": "Cancel", "Cancel": "Cancel",
"CancelPendingTask": "Are you sure you want to cancel this pending task?", "CancelPendingTask": "Are you sure you want to cancel this pending task?",
"Certification": "Certification",
"Clear": "Clear", "Clear": "Clear",
"CloneCondition": "Clone Condition", "CloneCondition": "Clone Condition",
"CloneCustomFormat": "Clone Custom Format", "CloneCustomFormat": "Clone Custom Format",
"Close": "Close", "Close": "Close",
"Component": "Component",
"Connect": "Connect", "Connect": "Connect",
"ContinuingOnly": "Continuing Only",
"CountDownloadClientsSelected": "{count} download client(s) selected", "CountDownloadClientsSelected": "{count} download client(s) selected",
"CountImportListsSelected": "{count} import list(s) selected", "CountImportListsSelected": "{count} import list(s) selected",
"CountIndexersSelected": "{count} indexer(s) selected", "CountIndexersSelected": "{count} indexer(s) selected",
"CountSeasons": "{count} seasons", "CountSeasons": "{count} seasons",
"CurrentlyInstalled": "Currently Installed", "CurrentlyInstalled": "Currently Installed",
"CustomFormats": "Custom Formats",
"CustomFormatScore": "Custom Format Score", "CustomFormatScore": "Custom Format Score",
"CustomFormats": "Custom Formats",
"CutoffUnmet": "Cutoff Unmet", "CutoffUnmet": "Cutoff Unmet",
"Daily": "Daily", "Daily": "Daily",
"Date": "Date",
"Delete": "Delete", "Delete": "Delete",
"DeleteBackup": "Delete Backup", "DeleteBackup": "Delete Backup",
"DeleteBackupMessageText": "Are you sure you want to delete the backup '{name}'?", "DeleteBackupMessageText": "Are you sure you want to delete the backup '{name}'?",
@ -65,6 +73,7 @@
"DeleteSelectedImportListsMessageText": "Are you sure you want to delete {count} selected import list(s)?", "DeleteSelectedImportListsMessageText": "Are you sure you want to delete {count} selected import list(s)?",
"DeleteSelectedIndexers": "Delete Indexer(s)", "DeleteSelectedIndexers": "Delete Indexer(s)",
"DeleteSelectedIndexersMessageText": "Are you sure you want to delete {count} selected indexer(s)?", "DeleteSelectedIndexersMessageText": "Are you sure you want to delete {count} selected indexer(s)?",
"Deleted": "Deleted",
"Details": "Details", "Details": "Details",
"Disabled": "Disabled", "Disabled": "Disabled",
"Discord": "Discord", "Discord": "Discord",
@ -74,13 +83,14 @@
"Donations": "Donations", "Donations": "Donations",
"DotNetVersion": ".NET", "DotNetVersion": ".NET",
"Download": "Download", "Download": "Download",
"DownloadClient": "Download Client",
"DownloadClientCheckNoneAvailableHealthCheckMessage": "No download client is available", "DownloadClientCheckNoneAvailableHealthCheckMessage": "No download client is available",
"DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Unable to communicate with {0}.", "DownloadClientCheckUnableToCommunicateWithHealthCheckMessage": "Unable to communicate with {0}.",
"DownloadClientRootFolderHealthCheckMessage": "Download client {0} places downloads in the root folder {1}. You should not download to a root folder.", "DownloadClientRootFolderHealthCheckMessage": "Download client {0} places downloads in the root folder {1}. You should not download to a root folder.",
"DownloadClients": "Download Clients",
"DownloadClientSortingHealthCheckMessage": "Download client {0} has {1} sorting enabled for Sonarr's category. You should disable sorting in your download client to avoid import issues.", "DownloadClientSortingHealthCheckMessage": "Download client {0} has {1} sorting enabled for Sonarr's category. You should disable sorting in your download client to avoid import issues.",
"DownloadClientStatusAllClientHealthCheckMessage": "All download clients are unavailable due to failures", "DownloadClientStatusAllClientHealthCheckMessage": "All download clients are unavailable due to failures",
"DownloadClientStatusSingleClientHealthCheckMessage": "Download clients unavailable due to failures: {0}", "DownloadClientStatusSingleClientHealthCheckMessage": "Download clients unavailable due to failures: {0}",
"DownloadClients": "Download Clients",
"Duration": "Duration", "Duration": "Duration",
"Edit": "Edit", "Edit": "Edit",
"EditSelectedDownloadClients": "Edit Selected Download Clients", "EditSelectedDownloadClients": "Edit Selected Download Clients",
@ -88,64 +98,84 @@
"EditSelectedIndexers": "Edit Selected Indexers", "EditSelectedIndexers": "Edit Selected Indexers",
"EditSeries": "Edit Series", "EditSeries": "Edit Series",
"EnableAutomaticSearch": "Enable Automatic Search", "EnableAutomaticSearch": "Enable Automatic Search",
"Enabled": "Enabled",
"EnableInteractiveSearch": "Enable Interactive Search", "EnableInteractiveSearch": "Enable Interactive Search",
"EnableRSS": "Enable RSS", "EnableRSS": "Enable RSS",
"Enabled": "Enabled",
"Ended": "Ended", "Ended": "Ended",
"EndedOnly": "Ended Only",
"Episode": "Episode",
"EpisodeAirDate": "Episode Air Date",
"EpisodeCount": "Episode Count",
"EpisodeInfo": "Episode Info", "EpisodeInfo": "Episode Info",
"EpisodeNumbers": "Episode Number(s)", "EpisodeNumbers": "Episode Number(s)",
"EpisodeProgress": "Episode Progress",
"EpisodeTitle": "Episode Title",
"Episodes": "Episodes",
"Error": "Error",
"ErrorRestoringBackup": "Error restoring backup", "ErrorRestoringBackup": "Error restoring backup",
"EventType": "Event Type",
"Events": "Events", "Events": "Events",
"Exception": "Exception", "Exception": "Exception",
"ExistingTag": "Existing tag", "ExistingTag": "Existing tag",
"ExportCustomFormat": "Export Custom Format", "ExportCustomFormat": "Export Custom Format",
"ExternalUpdater": "Sonarr is configured to use an external update mechanism", "ExternalUpdater": "Sonarr is configured to use an external update mechanism",
"Failed": "Failed",
"FailedToFetchUpdates": "Failed to fetch updates", "FailedToFetchUpdates": "Failed to fetch updates",
"FailedToUpdateSettings": "Failed to update settings", "FailedToUpdateSettings": "Failed to update settings",
"FeatureRequests": "Feature Requests", "FeatureRequests": "Feature Requests",
"Filename": "Filename", "Filename": "Filename",
"Fixed": "Fixed", "Fixed": "Fixed",
"Formats": "Formats",
"Forums": "Forums", "Forums": "Forums",
"FreeSpace": "Free Space", "FreeSpace": "Free Space",
"From": "From", "From": "From",
"FullSeason": "Full Season", "FullSeason": "Full Season",
"General": "General", "General": "General",
"GeneralSettings": "General Settings", "GeneralSettings": "General Settings",
"Genres": "Genres",
"Grabbed": "Grabbed",
"HasMissingSeason": "Has Missing Season",
"Health": "Health", "Health": "Health",
"HiddenClickToShow": "Hidden, click to show", "HiddenClickToShow": "Hidden, click to show",
"HideAdvanced": "Hide Advanced", "HideAdvanced": "Hide Advanced",
"History": "History", "History": "History",
"HomePage": "Home Page", "HomePage": "Home Page",
"IRC": "IRC",
"IRCLinkText": "#sonarr on Libera",
"Ignored": "Ignored",
"Implementation": "Implementation", "Implementation": "Implementation",
"ImportListRootFolderMissingRootHealthCheckMessage": "Missing root folder for import list(s): {0}", "ImportListRootFolderMissingRootHealthCheckMessage": "Missing root folder for import list(s): {0}",
"ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Multiple root folders are missing for import lists: {0}", "ImportListRootFolderMultipleMissingRootsHealthCheckMessage": "Multiple root folders are missing for import lists: {0}",
"ImportLists": "Import Lists",
"ImportListStatusAllUnavailableHealthCheckMessage": "All lists are unavailable due to failures", "ImportListStatusAllUnavailableHealthCheckMessage": "All lists are unavailable due to failures",
"ImportListStatusUnavailableHealthCheckMessage": "Lists unavailable due to failures: {0}", "ImportListStatusUnavailableHealthCheckMessage": "Lists unavailable due to failures: {0}",
"ImportLists": "Import Lists",
"ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Enable Completed Download Handling if possible", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleHealthCheckMessage": "Enable Completed Download Handling if possible",
"ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "Enable Completed Download Handling if possible (Multi-Computer unsupported)", "ImportMechanismEnableCompletedDownloadHandlingIfPossibleMultiComputerHealthCheckMessage": "Enable Completed Download Handling if possible (Multi-Computer unsupported)",
"ImportMechanismHandlingDisabledHealthCheckMessage": "Enable Completed Download Handling", "ImportMechanismHandlingDisabledHealthCheckMessage": "Enable Completed Download Handling",
"Imported": "Imported",
"IncludeUnmonitored": "Include Unmonitored",
"Indexer": "Indexer",
"IndexerJackettAllHealthCheckMessage": "Indexers using the unsupported Jackett 'all' endpoint: {0}", "IndexerJackettAllHealthCheckMessage": "Indexers using the unsupported Jackett 'all' endpoint: {0}",
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures for more than 6 hours", "IndexerLongTermStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures for more than 6 hours",
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures for more than 6 hours: {0}", "IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures for more than 6 hours: {0}",
"IndexerRssNoIndexersAvailableHealthCheckMessage": "All rss-capable indexers are temporarily unavailable due to recent indexer errors", "IndexerRssNoIndexersAvailableHealthCheckMessage": "All rss-capable indexers are temporarily unavailable due to recent indexer errors",
"IndexerRssNoIndexersEnabledHealthCheckMessage": "No indexers available with RSS sync enabled, Sonarr will not grab new releases automatically", "IndexerRssNoIndexersEnabledHealthCheckMessage": "No indexers available with RSS sync enabled, Sonarr will not grab new releases automatically",
"Indexers": "Indexers",
"IndexerSearchNoAutomaticHealthCheckMessage": "No indexers available with Automatic Search enabled, Sonarr will not provide any automatic search results", "IndexerSearchNoAutomaticHealthCheckMessage": "No indexers available with Automatic Search enabled, Sonarr will not provide any automatic search results",
"IndexerSearchNoAvailableIndexersHealthCheckMessage": "All search-capable indexers are temporarily unavailable due to recent indexer errors", "IndexerSearchNoAvailableIndexersHealthCheckMessage": "All search-capable indexers are temporarily unavailable due to recent indexer errors",
"IndexerSearchNoInteractiveHealthCheckMessage": "No indexers available with Interactive Search enabled, Sonarr will not provide any interactive search results", "IndexerSearchNoInteractiveHealthCheckMessage": "No indexers available with Interactive Search enabled, Sonarr will not provide any interactive search results",
"IndexerStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures", "IndexerStatusAllUnavailableHealthCheckMessage": "All indexers are unavailable due to failures",
"IndexerStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures: {0}", "IndexerStatusUnavailableHealthCheckMessage": "Indexers unavailable due to failures: {0}",
"Indexers": "Indexers",
"Info": "Info",
"InstallLatest": "Install Latest", "InstallLatest": "Install Latest",
"Interval": "Interval", "Interval": "Interval",
"IRC": "IRC",
"IRCLinkText": "#sonarr on Libera",
"Language": "Language", "Language": "Language",
"Language that Sonarr will use for UI": "Language that Sonarr will use for UI", "Language that Sonarr will use for UI": "Language that Sonarr will use for UI",
"Languages": "Languages", "Languages": "Languages",
"LastDuration": "Last Duration", "LastDuration": "Last Duration",
"LastExecution": "Last Execution", "LastExecution": "Last Execution",
"LastWriteTime": "Last Write Time", "LastWriteTime": "Last Write Time",
"LatestSeason": "Latest Season",
"LiberaWebchat": "Libera Webchat", "LiberaWebchat": "Libera Webchat",
"LibraryImport": "Library Import", "LibraryImport": "Library Import",
"Location": "Location", "Location": "Location",
@ -167,8 +197,10 @@
"Metadata": "Metadata", "Metadata": "Metadata",
"MetadataSource": "Metadata Source", "MetadataSource": "Metadata Source",
"Missing": "Missing", "Missing": "Missing",
"MissingEpisodes": "Missing Episodes",
"Mode": "Mode", "Mode": "Mode",
"Monitored": "Monitored", "Monitored": "Monitored",
"MonitoredOnly": "Monitored Only",
"MoreInfo": "More Info", "MoreInfo": "More Info",
"MountHealthCheckMessage": "Mount containing a series path is mounted read-only: ", "MountHealthCheckMessage": "Mount containing a series path is mounted read-only: ",
"MultiSeason": "Multi-Season", "MultiSeason": "Multi-Season",
@ -190,19 +222,24 @@
"NoLogFiles": "No log files", "NoLogFiles": "No log files",
"NoSeasons": "No seasons", "NoSeasons": "No seasons",
"NoUpdatesAreAvailable": "No updates are available", "NoUpdatesAreAvailable": "No updates are available",
"OneSeason": "1 season", "NotSeasonPack": "Not Season Pack",
"OnLatestVersion": "The latest version of Sonarr is already installed", "OnLatestVersion": "The latest version of Sonarr is already installed",
"OneSeason": "1 season",
"Options": "Options", "Options": "Options",
"OriginalLanguage": "Original Language", "OriginalLanguage": "Original Language",
"OutputPath": "Output Path",
"PackageVersion": "Package Version", "PackageVersion": "Package Version",
"PackageVersionInfo": "{packageVersion} by {packageAuthor}", "PackageVersionInfo": "{packageVersion} by {packageAuthor}",
"PartialSeason": "Partial Season", "PartialSeason": "Partial Season",
"Path": "Path", "Path": "Path",
"Peers": "Peers",
"PreviousAiring": "Previous Airing", "PreviousAiring": "Previous Airing",
"PreviouslyInstalled": "Previously Installed", "PreviouslyInstalled": "Previously Installed",
"Priority": "Priority", "Priority": "Priority",
"Profiles": "Profiles", "Profiles": "Profiles",
"Progress": "Progress",
"Proper": "Proper", "Proper": "Proper",
"Protocol": "Protocol",
"ProxyBadRequestHealthCheckMessage": "Failed to test proxy. Status Code: {0}", "ProxyBadRequestHealthCheckMessage": "Failed to test proxy. Status Code: {0}",
"ProxyFailedToTestHealthCheckMessage": "Failed to test proxy: {0}", "ProxyFailedToTestHealthCheckMessage": "Failed to test proxy: {0}",
"ProxyResolveIpHealthCheckMessage": "Failed to resolve the IP Address for the Configured Proxy Host {0}", "ProxyResolveIpHealthCheckMessage": "Failed to resolve the IP Address for the Configured Proxy Host {0}",
@ -210,13 +247,17 @@
"QualityProfile": "Quality Profile", "QualityProfile": "Quality Profile",
"Queue": "Queue", "Queue": "Queue",
"Queued": "Queued", "Queued": "Queued",
"Rating": "Rating",
"ReadTheWikiForMoreInformation": "Read the Wiki for more information", "ReadTheWikiForMoreInformation": "Read the Wiki for more information",
"Real": "Real", "Real": "Real",
"RecycleBinUnableToWriteHealthCheckMessage": "Unable to write to configured recycling bin folder: {0}. Ensure this path exists and is writable by the user running Sonarr", "RecycleBinUnableToWriteHealthCheckMessage": "Unable to write to configured recycling bin folder: {0}. Ensure this path exists and is writable by the user running Sonarr",
"Refresh": "Refresh", "Refresh": "Refresh",
"RefreshSeries": "Refresh Series", "RefreshSeries": "Refresh Series",
"RejectionCount": "Rejection Count",
"RelativePath": "Relative Path",
"Release": "Release", "Release": "Release",
"ReleaseGroup": "Release Group", "ReleaseGroup": "Release Group",
"ReleaseGroups": "Release Groups",
"ReleaseHash": "Release Hash", "ReleaseHash": "Release Hash",
"ReleaseTitle": "Release Title", "ReleaseTitle": "Release Title",
"Reload": "Reload", "Reload": "Reload",
@ -238,9 +279,6 @@
"Remove": "Remove", "Remove": "Remove",
"RemoveCompleted": "Remove Completed", "RemoveCompleted": "Remove Completed",
"RemoveCompletedDownloads": "Remove Completed Downloads", "RemoveCompletedDownloads": "Remove Completed Downloads",
"RemovedFromTaskQueue": "Removed from task queue",
"RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {0} were removed from TheTVDB",
"RemovedSeriesSingleRemovedHealthCheckMessage": "Series {0} was removed from TheTVDB",
"RemoveFailed": "Remove Failed", "RemoveFailed": "Remove Failed",
"RemoveFailedDownloads": "Remove Failed Downloads", "RemoveFailedDownloads": "Remove Failed Downloads",
"RemoveFromDownloadClient": "Remove From Download Client", "RemoveFromDownloadClient": "Remove From Download Client",
@ -249,7 +287,11 @@
"RemoveSelectedItemQueueMessageText": "Are you sure you want to remove 1 item from the queue?", "RemoveSelectedItemQueueMessageText": "Are you sure you want to remove 1 item from the queue?",
"RemoveSelectedItems": "Remove Selected Items", "RemoveSelectedItems": "Remove Selected Items",
"RemoveSelectedItemsQueueMessageText": "Are you sure you want to remove {0} items from the queue?", "RemoveSelectedItemsQueueMessageText": "Are you sure you want to remove {0} items from the queue?",
"RemovedFromTaskQueue": "Removed from task queue",
"RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {0} were removed from TheTVDB",
"RemovedSeriesSingleRemovedHealthCheckMessage": "Series {0} was removed from TheTVDB",
"RemovingTag": "Removing tag", "RemovingTag": "Removing tag",
"Renamed": "Renamed",
"Repack": "Repack", "Repack": "Repack",
"Replace": "Replace", "Replace": "Replace",
"Required": "Required", "Required": "Required",
@ -266,9 +308,17 @@
"RootFolder": "Root Folder", "RootFolder": "Root Folder",
"RootFolderMissingHealthCheckMessage": "Missing root folder: {0}", "RootFolderMissingHealthCheckMessage": "Missing root folder: {0}",
"RootFolderMultipleMissingHealthCheckMessage": "Multiple root folders are missing: {0}", "RootFolderMultipleMissingHealthCheckMessage": "Multiple root folders are missing: {0}",
"RootFolderPath": "Root Folder Path",
"Runtime": "Runtime",
"SceneNumbering": "Scene Numbering",
"Scheduled": "Scheduled", "Scheduled": "Scheduled",
"SearchForMonitoredEpisodes": "Search for monitored episodes", "SearchForMonitoredEpisodes": "Search for monitored episodes",
"SeasonCount": "Season Count",
"SeasonFolder": "Season Folder",
"SeasonNumber": "Season Number", "SeasonNumber": "Season Number",
"SeasonPack": "Season Pack",
"Seasons": "Seasons",
"Seeders": "Seeders",
"Series": "Series", "Series": "Series",
"SeriesEditor": "Series Editor", "SeriesEditor": "Series Editor",
"SeriesTitle": "Series Title", "SeriesTitle": "Series Title",
@ -278,40 +328,50 @@
"ShownClickToHide": "Shown, click to hide", "ShownClickToHide": "Shown, click to hide",
"Size": "Size", "Size": "Size",
"SizeOnDisk": "Size on disk", "SizeOnDisk": "Size on disk",
"SkipRedownloadHelpText": "Prevents Sonarr from trying to download an alternative release for this item",
"SkipRedownload": "Skip Redownload", "SkipRedownload": "Skip Redownload",
"SkipRedownloadHelpText": "Prevents Sonarr from trying to download an alternative release for this item",
"Source": "Source", "Source": "Source",
"SourceTitle": "Source Title",
"Special": "Special", "Special": "Special",
"Started": "Started", "Started": "Started",
"StartupDirectory": "Startup directory", "StartupDirectory": "Startup directory",
"Status": "Status", "Status": "Status",
"SubtitleLanguages": "Subtitle Languages",
"System": "System", "System": "System",
"SystemTimeHealthCheckMessage": "System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected", "SystemTimeHealthCheckMessage": "System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected",
"Tags": "Tags", "Tags": "Tags",
"Tasks": "Tasks",
"TaskUserAgentTooltip": "User-Agent provided by the app that called the API", "TaskUserAgentTooltip": "User-Agent provided by the app that called the API",
"Tasks": "Tasks",
"TestAll": "Test All", "TestAll": "Test All",
"TestParsing": "Test Parsing", "TestParsing": "Test Parsing",
"TheLogLevelDefault": "The log level defaults to 'Info' and can be changed in [General Settings](/settings/general)", "TheLogLevelDefault": "The log level defaults to 'Info' and can be changed in [General Settings](/settings/general)",
"Time": "Time", "Time": "Time",
"TimeLeft": "Time Left",
"Title": "Title",
"TotalSpace": "Total Space", "TotalSpace": "Total Space",
"Twitter": "Twitter", "Twitter": "Twitter",
"Type": "Type",
"UI": "UI", "UI": "UI",
"UI Language": "UI Language", "UI Language": "UI Language",
"UnableToLoadBackups": "Unable to load backups", "UnableToLoadBackups": "Unable to load backups",
"UnableToUpdateSonarrDirectly": "Unable to update Sonarr directly,", "UnableToUpdateSonarrDirectly": "Unable to update Sonarr directly,",
"Unmonitored": "Unmonitored", "Unmonitored": "Unmonitored",
"UnmonitoredOnly": "Unmonitored Only",
"UpdateAvailableHealthCheckMessage": "New update is available", "UpdateAvailableHealthCheckMessage": "New update is available",
"UpdaterLogFiles": "Updater Log Files",
"Updates": "Updates",
"UpdateStartupNotWritableHealthCheckMessage": "Cannot install update because startup folder '{0}' is not writable by the user '{1}'.", "UpdateStartupNotWritableHealthCheckMessage": "Cannot install update because startup folder '{0}' is not writable by the user '{1}'.",
"UpdateStartupTranslocationHealthCheckMessage": "Cannot install update because startup folder '{0}' is in an App Translocation folder.", "UpdateStartupTranslocationHealthCheckMessage": "Cannot install update because startup folder '{0}' is in an App Translocation folder.",
"UpdateUINotWritableHealthCheckMessage": "Cannot install update because UI folder '{0}' is not writable by the user '{1}'.", "UpdateUINotWritableHealthCheckMessage": "Cannot install update because UI folder '{0}' is not writable by the user '{1}'.",
"UpdaterLogFiles": "Updater Log Files",
"Updates": "Updates",
"Uptime": "Uptime", "Uptime": "Uptime",
"Version": "Version", "Version": "Version",
"VideoCodec": "Video Codec",
"VideoDynamicRange": "Video Dynamic Range",
"Wanted": "Wanted", "Wanted": "Wanted",
"Warn": "Warn",
"Wiki": "Wiki", "Wiki": "Wiki",
"WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?", "WouldYouLikeToRestoreBackup": "Would you like to restore the backup '{name}'?",
"Year": "Year",
"Yes": "Yes", "Yes": "Yes",
"YesCancel": "Yes, Cancel" "YesCancel": "Yes, Cancel"
} }