From bf43453c040ba0474e0cd71e1c5aa3b98edf13ff Mon Sep 17 00:00:00 2001 From: Stevie Robinson Date: Thu, 10 Aug 2023 21:13:12 +0200 Subject: [PATCH] Translate Calendar Frontend --- frontend/src/Calendar/Agenda/AgendaEvent.js | 15 +++--- frontend/src/Calendar/Calendar.js | 3 +- frontend/src/Calendar/CalendarPage.js | 11 ++-- frontend/src/Calendar/Events/CalendarEvent.js | 17 +++--- .../src/Calendar/Events/CalendarEventGroup.js | 9 ++-- .../src/Calendar/Header/CalendarHeader.js | 15 +++--- frontend/src/Calendar/Legend/Legend.js | 21 ++++---- .../Options/CalendarOptionsModalContent.js | 45 ++++++++-------- .../Calendar/iCal/CalendarLinkModalContent.js | 25 ++++----- src/NzbDrone.Core/Localization/Core/en.json | 52 +++++++++++++++++++ 10 files changed, 137 insertions(+), 76 deletions(-) diff --git a/frontend/src/Calendar/Agenda/AgendaEvent.js b/frontend/src/Calendar/Agenda/AgendaEvent.js index 155be19f1..133f2e466 100644 --- a/frontend/src/Calendar/Agenda/AgendaEvent.js +++ b/frontend/src/Calendar/Agenda/AgendaEvent.js @@ -11,6 +11,7 @@ import episodeEntities from 'Episode/episodeEntities'; import { icons, kinds } from 'Helpers/Props'; import formatTime from 'Utilities/Date/formatTime'; import padNumber from 'Utilities/Number/padNumber'; +import translate from 'Utilities/String/translate'; import styles from './AgendaEvent.css'; class AgendaEvent extends Component { @@ -129,7 +130,7 @@ class AgendaEvent extends Component { } @@ -138,7 +139,7 @@ class AgendaEvent extends Component { : null } @@ -160,7 +161,7 @@ class AgendaEvent extends Component { } @@ -172,7 +173,7 @@ class AgendaEvent extends Component { className={styles.statusIcon} name={icons.EPISODE_FILE} kind={kinds.WARNING} - title="Quality cutoff has not been met" + title={translate('QualityCutoffNotMet')} /> } @@ -182,7 +183,7 @@ class AgendaEvent extends Component { className={styles.statusIcon} name={icons.INFO} kind={kinds.INFO} - title={seasonNumber === 1 ? 'Series Premiere' : 'Season Premiere'} + title={seasonNumber === 1 ? translate('SeriesPremiere') : translate('SeasonPremiere')} /> } @@ -195,7 +196,7 @@ class AgendaEvent extends Component { className={styles.statusIcon} name={icons.INFO} kind={kinds.WARNING} - title={series.status === 'ended' ? 'Series finale' : 'Season finale'} + title={series.status === 'ended' ? translate('SeriesFinale') : translate('SeasonFinale')} /> } @@ -206,7 +207,7 @@ class AgendaEvent extends Component { className={styles.statusIcon} name={icons.INFO} kind={kinds.PINK} - title="Special" + title={translate('Special')} /> } diff --git a/frontend/src/Calendar/Calendar.js b/frontend/src/Calendar/Calendar.js index a9996d7f5..0a2fd671d 100644 --- a/frontend/src/Calendar/Calendar.js +++ b/frontend/src/Calendar/Calendar.js @@ -3,6 +3,7 @@ import React, { Component } from 'react'; import Alert from 'Components/Alert'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import { kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import AgendaConnector from './Agenda/AgendaConnector'; import * as calendarViews from './calendarViews'; import CalendarDaysConnector from './Day/CalendarDaysConnector'; @@ -32,7 +33,7 @@ class Calendar extends Component { { !isFetching && !!error && - Unable to load the calendar + {translate('CalendarLoadError')} } { diff --git a/frontend/src/Calendar/CalendarPage.js b/frontend/src/Calendar/CalendarPage.js index d98d85683..2e4d56b6b 100644 --- a/frontend/src/Calendar/CalendarPage.js +++ b/frontend/src/Calendar/CalendarPage.js @@ -10,6 +10,7 @@ import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection'; import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator'; import { align, icons } from 'Helpers/Props'; import NoSeries from 'Series/NoSeries'; +import translate from 'Utilities/String/translate'; import CalendarConnector from './CalendarConnector'; import CalendarFilterModal from './CalendarFilterModal'; import CalendarLinkModal from './iCal/CalendarLinkModal'; @@ -95,11 +96,11 @@ class CalendarPage extends Component { const PageComponent = hasSeries ? CalendarConnector : NoSeries; return ( - + @@ -107,14 +108,14 @@ class CalendarPage extends Component { diff --git a/frontend/src/Calendar/Events/CalendarEvent.js b/frontend/src/Calendar/Events/CalendarEvent.js index 78d938e5c..ebb63de7c 100644 --- a/frontend/src/Calendar/Events/CalendarEvent.js +++ b/frontend/src/Calendar/Events/CalendarEvent.js @@ -10,6 +10,7 @@ import episodeEntities from 'Episode/episodeEntities'; import { icons, kinds } from 'Helpers/Props'; import formatTime from 'Utilities/Date/formatTime'; import padNumber from 'Utilities/Number/padNumber'; +import translate from 'Utilities/String/translate'; import CalendarEventQueueDetails from './CalendarEventQueueDetails'; import styles from './CalendarEvent.css'; @@ -107,7 +108,7 @@ class CalendarEvent extends Component { : null } @@ -117,7 +118,7 @@ class CalendarEvent extends Component { : null } @@ -137,7 +138,7 @@ class CalendarEvent extends Component { : null } @@ -150,7 +151,7 @@ class CalendarEvent extends Component { className={styles.statusIcon} name={icons.EPISODE_FILE} kind={fullColorEvents ? kinds.DEFAULT : kinds.WARNING} - title="Quality cutoff has not been met" + title={translate('QualityCutoffNotMet')} /> : null } @@ -162,7 +163,7 @@ class CalendarEvent extends Component { name={icons.INFO} kind={kinds.INFO} darken={fullColorEvents} - title={seasonNumber === 1 ? 'Series premiere' : 'Season premiere'} + title={seasonNumber === 1 ? translate('SeriesPremiere') : translate('SeasonPremiere')} /> : null } @@ -176,7 +177,7 @@ class CalendarEvent extends Component { className={styles.statusIcon} name={icons.INFO} kind={fullColorEvents ? kinds.DEFAULT : kinds.WARNING} - title={series.status === 'ended' ? 'Series finale' : 'Season finale'} + title={series.status === 'ended' ? translate('SeriesFinale') : translate('SeasonFinale')} /> : null } @@ -189,7 +190,7 @@ class CalendarEvent extends Component { name={icons.INFO} kind={kinds.PINK} darken={fullColorEvents} - title="Special" + title={translate('Special')} /> : null } @@ -249,7 +250,7 @@ CalendarEvent.propTypes = { hasFile: PropTypes.bool.isRequired, grabbed: PropTypes.bool, queueItem: PropTypes.object, - // These props come from the connector, not marked as required to apease TS for now. + // These props come from the connector, not marked as required to appease TS for now. showEpisodeInformation: PropTypes.bool, showFinaleIcon: PropTypes.bool, showSpecialIcon: PropTypes.bool, diff --git a/frontend/src/Calendar/Events/CalendarEventGroup.js b/frontend/src/Calendar/Events/CalendarEventGroup.js index 2527c09f7..633056733 100644 --- a/frontend/src/Calendar/Events/CalendarEventGroup.js +++ b/frontend/src/Calendar/Events/CalendarEventGroup.js @@ -9,6 +9,7 @@ import Link from 'Components/Link/Link'; import { icons, kinds } from 'Helpers/Props'; import formatTime from 'Utilities/Date/formatTime'; import padNumber from 'Utilities/Number/padNumber'; +import translate from '../../Utilities/String/translate'; import styles from './CalendarEventGroup.css'; function getEventsInfo(series, events) { @@ -148,7 +149,7 @@ class CalendarEventGroup extends Component { } @@ -157,7 +158,7 @@ class CalendarEventGroup extends Component { } @@ -168,7 +169,7 @@ class CalendarEventGroup extends Component { name={icons.INFO} kind={kinds.INFO} darken={fullColorEvents} - title={seasonNumber === 1 ? 'Series Premiere' : 'Season Premiere'} + title={seasonNumber === 1 ? translate('SeriesPremiere') : translate('SeasonPremiere')} /> } @@ -181,7 +182,7 @@ class CalendarEventGroup extends Component { containerClassName={styles.statusIcon} name={icons.INFO} kind={fullColorEvents ? kinds.DEFAULT : kinds.WARNING} - title={series.status === 'ended' ? 'Series finale' : 'Season finale'} + title={series.status === 'ended' ? translate('SeriesFinale') : translate('SeasonFinale')} /> } diff --git a/frontend/src/Calendar/Header/CalendarHeader.js b/frontend/src/Calendar/Header/CalendarHeader.js index 71dcd67a8..4555fc63b 100644 --- a/frontend/src/Calendar/Header/CalendarHeader.js +++ b/frontend/src/Calendar/Header/CalendarHeader.js @@ -10,6 +10,7 @@ import MenuButton from 'Components/Menu/MenuButton'; import MenuContent from 'Components/Menu/MenuContent'; import ViewMenuItem from 'Components/Menu/ViewMenuItem'; import { align, icons } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import CalendarHeaderViewButton from './CalendarHeaderViewButton'; import styles from './CalendarHeader.css'; @@ -23,7 +24,7 @@ function getTitle(time, start, end, view, longDateFormat) { } else if (view === 'month') { return timeMoment.format('MMMM YYYY'); } else if (view === 'agenda') { - return 'Agenda'; + return translate('Agenda'); } let startFormat = 'MMM D YYYY'; @@ -125,7 +126,7 @@ class CalendarHeader extends Component { isDisabled={view === calendarViews.AGENDA} onPress={onTodayPress} > - Today + {translate('Today')} @@ -167,7 +168,7 @@ class CalendarHeader extends Component { selectedView={view} onPress={this.onViewChange} > - Month + {translate('Month')} } @@ -176,7 +177,7 @@ class CalendarHeader extends Component { selectedView={view} onPress={this.onViewChange} > - Week + {translate('Week')} - Forecast + {translate('Forecast')} - Day + {translate('Day')} - Agenda + {translate('Agenda')} : diff --git a/frontend/src/Calendar/Legend/Legend.js b/frontend/src/Calendar/Legend/Legend.js index ba0e2663a..546917b4a 100644 --- a/frontend/src/Calendar/Legend/Legend.js +++ b/frontend/src/Calendar/Legend/Legend.js @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { icons, kinds } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; import LegendIconItem from './LegendIconItem'; import LegendItem from './LegendItem'; import styles from './Legend.css'; @@ -24,7 +25,7 @@ function Legend(props) { name="Finale" icon={icons.INFO} kind={fullColorEvents ? kinds.DEFAULT : kinds.WARNING} - tooltip="Series or season finale" + tooltip={translate('CalendarLegendFinaleTooltip')} /> ); } @@ -36,7 +37,7 @@ function Legend(props) { icon={icons.INFO} kind={kinds.PINK} darken={fullColorEvents} - tooltip="Special episode" + tooltip={translate('SpecialEpisode')} /> ); } @@ -47,7 +48,7 @@ function Legend(props) { name="Cutoff Not Met" icon={icons.EPISODE_FILE} kind={fullColorEvents ? kinds.DEFAULT : kinds.WARNING} - tooltip="Quality cutoff has not been met" + tooltip={translate('QualityCutoffNotMet')} /> ); } @@ -57,7 +58,7 @@ function Legend(props) {
{iconsToShow[0]} diff --git a/frontend/src/Calendar/Options/CalendarOptionsModalContent.js b/frontend/src/Calendar/Options/CalendarOptionsModalContent.js index b7e738e72..c34401315 100644 --- a/frontend/src/Calendar/Options/CalendarOptionsModalContent.js +++ b/frontend/src/Calendar/Options/CalendarOptionsModalContent.js @@ -12,6 +12,7 @@ import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { inputTypes } from 'Helpers/Props'; import { firstDayOfWeekOptions, timeFormatOptions, weekColumnOptions } from 'Settings/UI/UISettings'; +import translate from 'Utilities/String/translate'; class CalendarOptionsModalContent extends Component { @@ -112,90 +113,90 @@ class CalendarOptionsModalContent extends Component { return ( - Calendar Options + {translate('CalendarOptions')} -
+
- Collapse Multiple Episodes + {translate('CollapseMultipleEpisodes')} - Show Episode Information + {translate('ShowEpisodeInformation')} - Icon for Finales + {translate('IconForFinales')} - Icon for Specials + {translate('IconForSpecials')} - Icon for Cutoff Unmet + {translate('IconForCutoffUnmet')} - Full Color Events + {translate('FullColorEvents')}
-
+
- First Day of Week + {translate('FirstDayOfWeek')} - Week Column Header + {translate('WeekColumnHeader')} - Time Format + {translate('TimeFormat')} - Enable Color-Impaired Mode + {translate('EnableColorImpairedMode')} @@ -248,7 +249,7 @@ class CalendarOptionsModalContent extends Component { diff --git a/frontend/src/Calendar/iCal/CalendarLinkModalContent.js b/frontend/src/Calendar/iCal/CalendarLinkModalContent.js index 5abcb249d..f7a904e21 100644 --- a/frontend/src/Calendar/iCal/CalendarLinkModalContent.js +++ b/frontend/src/Calendar/iCal/CalendarLinkModalContent.js @@ -13,6 +13,7 @@ import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; import { icons, inputTypes, kinds, sizes } from 'Helpers/Props'; +import translate from 'Utilities/String/translate'; function getUrls(state) { const { @@ -115,55 +116,55 @@ class CalendarLinkModalContent extends Component { return ( - Sonarr Calendar Feed + {translate('CalendarFeed', { appName: 'Sonarr' })} - Include Unmonitored + {translate('IncludeUnmonitored')} - Season Premieres Only + {translate('SeasonPremieresOnly')} - Show as All-Day Events + {translate('ICalShowAsAllDayEvents')} - Tags + {translate('Tags')} @@ -171,14 +172,14 @@ class CalendarLinkModalContent extends Component { - iCal Feed + {translate('ICalFeed')} diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 2d4aad010..f43649d1b 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -46,6 +46,7 @@ "AfterManualRefresh": "After Manual Refresh", "Age": "Age", "AgeWhenGrabbed": "Age (when grabbed)", + "Agenda": "Agenda", "AirDate": "Air Date", "All": "All", "AllResultsAreHiddenByTheAppliedFilter": "All results are hidden by the applied filter", @@ -53,6 +54,7 @@ "AllTitles": "All Titles", "AlreadyInYourLibrary": "Already in your library", "Always": "Always", + "AnEpisodeIsDownloading": "An Episode is downloading", "AnalyseVideoFiles": "Analyse video files", "AnalyseVideoFilesHelpText": "Extract video information such as resolution, runtime and codec information from files. This requires Sonarr to read parts of the file which may cause high disk or network activity during scans.", "Analytics": "Analytics", @@ -123,7 +125,17 @@ "BypassDelayIfHighestQualityHelpText": "Bypass delay when release has the highest enabled quality in the quality profile with the preferred protocol", "BypassProxyForLocalAddresses": "Bypass Proxy for Local Addresses", "Calendar": "Calendar", + "CalendarFeed": "{appName} Calendar Feed", + "CalendarLegendDownloadedTooltip": "Episode was downloaded and sorted", + "CalendarLegendDownloadingTooltip": "Episode is currently downloading", + "CalendarLegendFinaleTooltip": "Series or season finale", + "CalendarLegendMissingTooltip": "Episode has aired and is missing from disk", + "CalendarLegendOnAirTooltip": "Episode is currently airing", + "CalendarLegendPremiereTooltip": "Series or season premiere", + "CalendarLegendUnairedTooltip": "Episode hasn't aired yet", + "CalendarLegendUnmonitoredTooltip": "Episode is unmonitored", "CalendarLoadError": "Unable to load the calendar", + "CalendarOptions": "Calendar Options", "Cancel": "Cancel", "CancelPendingTask": "Are you sure you want to cancel this pending task?", "CancelProcessing": "Cancel Processing", @@ -149,6 +161,8 @@ "CloneIndexer": "Clone Indexer", "CloneProfile": "Clone Profile", "Close": "Close", + "CollapseMultipleEpisodes": "Collapse Multiple Episodes", + "CollapseMultipleEpisodesHelpText": "Collapse multiple episodes airing on the same day", "CollectionsLoadError": "Unable to load collections", "ColonReplacement": "Colon Replacement", "ColonReplacementFormatHelpText": "Change how Sonarr handles colon replacement", @@ -192,6 +206,7 @@ "Dash": "Dash", "Date": "Date", "Dates": "Dates", + "Day": "Day", "Debug": "Debug", "DefaultCase": "Default Case", "DefaultDelayProfile": "This is the default profile. It applies to all series that don't have an explicit profile.", @@ -342,6 +357,8 @@ "EpisodeImported": "Episode Imported", "EpisodeImportedTooltip": "Episode downloaded successfully and picked up from download client", "EpisodeInfo": "Episode Info", + "EpisodeIsDownloading": "Episode is downloading", + "EpisodeMissingAbsoluteNumber": "Episode does not have an absolute episode number", "EpisodeNaming": "Episode Naming", "EpisodeNumbers": "Episode Number(s)", "EpisodeProgress": "Episode Progress", @@ -372,20 +389,25 @@ "FileNameTokens": "File Name Tokens", "FileNames": "File Names", "Filename": "Filename", + "FinaleTooltip": "Series or season finale", "FirstDayOfWeek": "First Day of Week", "Fixed": "Fixed", "Folder": "Folder", "Folders": "Folders", + "Forecast": "Forecast", "Formats": "Formats", "Forums": "Forums", "FreeSpace": "Free Space", "From": "From", + "FullColorEvents": "Full Color Events", + "FullColorEventsHelpText": "Altered style to color the entire event with the status color, instead of just the left edge. Does not apply to Agenda", "FullSeason": "Full Season", "General": "General", "GeneralSettings": "General Settings", "GeneralSettingsLoadError": "Unable to load General settings", "GeneralSettingsSummary": "Port, SSL, username/password, proxy, analytics and updates", "Genres": "Genres", + "Global": "Global", "GrabId": "Grab ID", "GrabSelected": "Grab Selected", "Grabbed": "Grabbed", @@ -403,8 +425,21 @@ "Hostname": "Hostname", "HourShorthand": "h", "HttpHttps": "HTTP(S)", + "ICalFeed": "iCal Feed", + "ICalFeedHelpText": "Copy this URL to your client(s) or click to subscribe if your browser supports webcal", + "ICalIncludeUnmonitoredHelpText": "Include unmonitored episodes in the iCal feed", + "ICalLink": "iCal Link", + "ICalSeasonPremieresOnlyHelpText": "Only the first episode in a season will be in the feed", + "ICalShowAsAllDayEventsHelpText": "Events will appear as all-day events in your calendar", + "ICalTagsHelpText": "Feed will only contain series with at least one matching tag", "IRC": "IRC", "IRCLinkText": "#sonarr on Libera", + "IconForCutoffUnmet": "Icon for Cutoff Unmet", + "IconForCutoffUnmetHelpText": "Show icon for files when the cutoff hasn't been met", + "IconForFinales": "Icon for Finales", + "IconForFinalesHelpText": "Show icon for series/season finales based on available episode information", + "IconForSpecials": "Icon for Specials", + "IconForSpecialsHelpText": "Show icon for special episodes (season 0)", "Ignored": "Ignored", "IgnoredAddresses": "Ignored Addresses", "Images": "Images", @@ -495,6 +530,7 @@ "ListTagsHelpText": "Tags that will be added on import from this list", "ListWillRefreshEveryInterval": "List will refresh every {refreshInterval}", "ListsLoadError": "Unable to load Lists", + "Local": "Local", "LocalAirDate": "Local Air Date", "LocalPath": "Local Path", "Location": "Location", @@ -575,6 +611,7 @@ "Monitored": "Monitored", "MonitoredOnly": "Monitored Only", "MonitoringOptions": "Monitoring Options", + "Month": "Month", "MoreDetails": "More details", "MoreInfo": "More Info", "MountHealthCheckMessage": "Mount containing a series path is mounted read-only: ", @@ -703,6 +740,7 @@ "QualitiesHelpText": "Qualities higher in the list are more preferred. Qualities within the same group are equal. Only checked qualities are wanted", "QualitiesLoadError": "Unable to load qualities", "Quality": "Quality", + "QualityCutoffNotMet": "Quality cutoff has not been met", "QualityDefinitions": "Quality Definitions", "QualityDefinitionsLoadError": "Unable to load Quality Definitions", "QualityLimitsHelpText": "Limits are automatically adjusted for the series runtime and number of episodes in the file.", @@ -844,6 +882,7 @@ "RootFoldersLoadError": "Unable to load root folders", "Rss": "RSS", "RssIsNotSupportedWithThisIndexer": "RSS is not supported with this indexer", + "RssSync": "RSS Sync", "RssSyncInterval": "RSS Sync Interval", "RssSyncIntervalHelpText": "Interval in minutes. Set to zero to disable (this will stop all automatic release grabbing)", "RssSyncIntervalHelpTextWarning": "This will apply to all indexers, please follow the rules set forth by them", @@ -852,6 +891,7 @@ "SaveChanges": "Save Changes", "SaveSettings": "Save Settings", "Scene": "Scene", + "SceneNumberNotVerified": "Scene number hasn't been verified yet", "SceneNumbering": "Scene Numbering", "Scheduled": "Scheduled", "Score": "Score", @@ -859,14 +899,18 @@ "ScriptPath": "Script Path", "SearchByTvdbId": "You can also search using TVDB ID of a show. eg. tvdb:71663", "SearchFailedError": "Search failed, please try again later.", + "SearchForMissing": "Search for Missing", "SearchForMonitoredEpisodes": "Search for monitored episodes", "SearchIsNotSupportedWithThisIndexer": "Search is not supported with this indexer", "Season": "Season", "SeasonCount": "Season Count", + "SeasonFinale": "Season Finale", "SeasonFolder": "Season Folder", "SeasonFolderFormat": "Season Folder Format", "SeasonNumber": "Season Number", "SeasonPack": "Season Pack", + "SeasonPremiere": "Season Premiere", + "SeasonPremieresOnly": "Season Premieres Only", "Seasons": "Seasons", "Security": "Security", "Seeders": "Seeders", @@ -875,12 +919,14 @@ "Series": "Series", "SeriesAndEpisodeInformationIsProvidedByTheTVDB": "Series and episode information is provided by TheTVDB.com. [Please consider supporting them](https://www.thetvdb.com/subscribe).", "SeriesEditor": "Series Editor", + "SeriesFinale": "Series Finale", "SeriesFolderFormat": "Series Folder Format", "SeriesFolderFormatHelpText": "Used when adding a new series or moving series via the series editor", "SeriesFolderImportedTooltip": "Episode imported from series folder", "SeriesID": "Series ID", "SeriesLoadError": "Unable to load Series", "SeriesMatchType": "Series Match Type", + "SeriesPremiere": "Series Premiere", "SeriesTitle": "Series Title", "SeriesTitleToExcludeHelpText": "The name of the series to exclude", "SeriesType": "Series Type", @@ -893,6 +939,9 @@ "Settings": "Settings", "ShortDateFormat": "Short Date Format", "ShowAdvanced": "Show Advanced", + "ICalShowAsAllDayEvents": "Show as All-Day Events", + "ShowEpisodeInformation": "Show Episode Information", + "ShowEpisodeInformationHelpText": "Show episode title and number", "ShowRelativeDates": "Show Relative Dates", "ShowRelativeDatesHelpText": "Show relative (Today/Yesterday/etc) or absolute dates", "ShownClickToHide": "Shown, click to hide", @@ -919,6 +968,7 @@ "SourceTitle": "Source Title", "Space": "Space", "Special": "Special", + "SpecialEpisode": "Special Episode", "SpecialsFolderFormat": "Specials Folder Format", "SslCertPassword": "SSL Cert Password", "SslCertPasswordHelpText": "Password for pfx file", @@ -968,6 +1018,7 @@ "TimeFormat": "Time Format", "TimeLeft": "Time Left", "Title": "Title", + "Today": "Today", "TorrentDelay": "Torrent Delay", "TorrentDelayHelpText": "Delay in minutes to wait before grabbing a torrent", "TorrentDelayTime": "Torrent Delay: {torrentDelay}", @@ -1045,6 +1096,7 @@ "WantMoreControlAddACustomFormat": "Want more control over which downloads are preferred? Add a [Custom Format](/settings/customformats)", "Wanted": "Wanted", "Warn": "Warn", + "Week": "Week", "WeekColumnHeader": "Week Column Header", "WeekColumnHeaderHelpText": "Shown above each column when week is the active view", "WhyCantIFindMyShow": "Why can't I find my show?",