Fix translations for parse release

This commit is contained in:
Bogdan 2023-07-14 18:21:08 +03:00
parent 5af90e6ac7
commit f6a20aba44
4 changed files with 55 additions and 27 deletions

View File

@ -11,6 +11,7 @@ import ModalHeader from 'Components/Modal/ModalHeader';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import { clear, fetch } from 'Store/Actions/parseActions'; import { clear, fetch } from 'Store/Actions/parseActions';
import getErrorMessage from 'Utilities/Object/getErrorMessage'; import getErrorMessage from 'Utilities/Object/getErrorMessage';
import translate from 'Utilities/String/translate';
import ParseResult from './ParseResult'; import ParseResult from './ParseResult';
import parseStateSelector from './parseStateSelector'; import parseStateSelector from './parseStateSelector';
import styles from './ParseModalContent.css'; import styles from './ParseModalContent.css';
@ -58,7 +59,7 @@ function ParseModalContent(props: ParseModalContentProps) {
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader>Test Parsing</ModalHeader> <ModalHeader>{translate('TestParsing')}</ModalHeader>
<ModalBody> <ModalBody>
<div className={styles.inputContainer}> <div className={styles.inputContainer}>
@ -115,7 +116,7 @@ function ParseModalContent(props: ParseModalContentProps) {
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button onPress={onModalClose}>Close</Button> <Button onPress={onModalClose}>{translate('Close')}</Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>
); );

View File

@ -46,11 +46,11 @@ function ParseResult(props: ParseResultProps) {
<div> <div>
<FieldSet legend={translate('Release')}> <FieldSet legend={translate('Release')}>
<ParseResultItem <ParseResultItem
title={translate('Release Title')} title={translate('ReleaseTitle')}
data={releaseTitle} data={releaseTitle}
/> />
<ParseResultItem title={translate('Series Title')} data={seriesTitle} /> <ParseResultItem title={translate('SeriesTitle')} data={seriesTitle} />
<ParseResultItem <ParseResultItem
title={translate('Year')} title={translate('Year')}
@ -58,7 +58,7 @@ function ParseResult(props: ParseResultProps) {
/> />
<ParseResultItem <ParseResultItem
title={translate('All Titles')} title={translate('AllTitles')}
data={ data={
seriesTitleInfo.allTitles?.length > 0 seriesTitleInfo.allTitles?.length > 0
? seriesTitleInfo.allTitles.join(', ') ? seriesTitleInfo.allTitles.join(', ')
@ -67,12 +67,12 @@ function ParseResult(props: ParseResultProps) {
/> />
<ParseResultItem <ParseResultItem
title={translate('Release Group')} title={translate('ReleaseGroup')}
data={releaseGroup ?? '-'} data={releaseGroup ?? '-'}
/> />
<ParseResultItem <ParseResultItem
title={translate('Release Hash')} title={translate('ReleaseHash')}
data={releaseHash ? releaseHash : '-'} data={releaseHash ? releaseHash : '-'}
/> />
</FieldSet> </FieldSet>
@ -85,11 +85,11 @@ function ParseResult(props: ParseResultProps) {
*/} */}
<FieldSet legend={translate('Episode Info')}> <FieldSet legend={translate('EpisodeInfo')}>
<div className={styles.container}> <div className={styles.container}>
<div className={styles.column}> <div className={styles.column}>
<ParseResultItem <ParseResultItem
title={translate('Season Number')} title={translate('SeasonNumber')}
data={ data={
seasonNumber === 0 && absoluteEpisodeNumbers.length seasonNumber === 0 && absoluteEpisodeNumbers.length
? '-' ? '-'
@ -98,12 +98,12 @@ function ParseResult(props: ParseResultProps) {
/> />
<ParseResultItem <ParseResultItem
title={translate('Episode Number(s)')} title={translate('EpisodeNumbers')}
data={episodeNumbers.join(', ') || '-'} data={episodeNumbers.join(', ') || '-'}
/> />
<ParseResultItem <ParseResultItem
title={translate('Absolute Episode Number(s)')} title={translate('AbsoluteEpisodeNumbers')}
data={ data={
absoluteEpisodeNumbers.length absoluteEpisodeNumbers.length
? absoluteEpisodeNumbers.join(', ') ? absoluteEpisodeNumbers.join(', ')
@ -117,7 +117,7 @@ function ParseResult(props: ParseResultProps) {
/> />
<ParseResultItem <ParseResultItem
title={translate('Air Date')} title={translate('AirDate')}
data={airDate ?? '-'} data={airDate ?? '-'}
/> />
</div> </div>
@ -129,17 +129,17 @@ function ParseResult(props: ParseResultProps) {
/> />
<ParseResultItem <ParseResultItem
title={translate('Full Season')} title={translate('FullSeason')}
data={fullSeason ? 'True' : 'False'} data={fullSeason ? 'True' : 'False'}
/> />
<ParseResultItem <ParseResultItem
title={translate('Multi-Season')} title={translate('MultiSeason')}
data={isMultiSeason ? 'True' : 'False'} data={isMultiSeason ? 'True' : 'False'}
/> />
<ParseResultItem <ParseResultItem
title={translate('Partial Season')} title={translate('PartialSeason')}
data={isPartialSeason ? 'True' : 'False'} data={isPartialSeason ? 'True' : 'False'}
/> />
</div> </div>
@ -194,7 +194,7 @@ function ParseResult(props: ParseResultProps) {
<FieldSet legend={translate('Details')}> <FieldSet legend={translate('Details')}>
<ParseResultItem <ParseResultItem
title={translate('Matched to Series')} title={translate('MatchedToSeries')}
data={ data={
series ? ( series ? (
<SeriesTitleLink <SeriesTitleLink
@ -208,12 +208,12 @@ function ParseResult(props: ParseResultProps) {
/> />
<ParseResultItem <ParseResultItem
title={translate('Matched to Season')} title={translate('MatchedToSeason')}
data={episodes.length ? episodes[0].seasonNumber : '-'} data={episodes.length ? episodes[0].seasonNumber : '-'}
/> />
<ParseResultItem <ParseResultItem
title={translate('Matched to Episodes')} title={translate('MatchedToEpisodes')}
data={ data={
episodes.length ? ( episodes.length ? (
<div> <div>
@ -236,12 +236,12 @@ function ParseResult(props: ParseResultProps) {
/> />
<ParseResultItem <ParseResultItem
title={translate('Custom Formats')} title={translate('CustomFormats')}
data={<EpisodeFormats formats={customFormats} />} data={<EpisodeFormats formats={customFormats} />}
/> />
<ParseResultItem <ParseResultItem
title={translate('Custom Format Score')} title={translate('CustomFormatScore')}
data={customFormatScore} data={customFormatScore}
/> />
</FieldSet> </FieldSet>

View File

@ -2,6 +2,7 @@ import React, { Fragment, useCallback, useState } from 'react';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton'; import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import ParseModal from 'Parse/ParseModal'; import ParseModal from 'Parse/ParseModal';
import translate from 'Utilities/String/translate';
function ParseToolbarButton() { function ParseToolbarButton() {
const [isParseModalOpen, setIsParseModalOpen] = useState(false); const [isParseModalOpen, setIsParseModalOpen] = useState(false);
@ -17,7 +18,7 @@ function ParseToolbarButton() {
return ( return (
<Fragment> <Fragment>
<PageToolbarButton <PageToolbarButton
label="Test Parsing" label={translate('TestParsing')}
iconName={icons.PARSE} iconName={icons.PARSE}
onPress={onOpenParseModalPress} onPress={onOpenParseModalPress}
/> />

View File

@ -1,16 +1,19 @@
{ {
"AbsoluteEpisodeNumbers": "Absolute Episode Number(s)",
"Activity": "Activity", "Activity": "Activity",
"Add": "Add", "Add": "Add",
"AddNew": "Add New",
"Added": "Added", "Added": "Added",
"AddingTag": "Adding tag", "AddingTag": "Adding tag",
"AddNew": "Add New", "AirDate": "Air Date",
"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",
"AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update", "AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update",
"Apply": "Apply", "Apply": "Apply",
"ApplyChanges": "Apply Changes", "ApplyChanges": "Apply Changes",
"ApplyTags": "Apply Tags", "ApplyTags": "Apply Tags",
"ApplyTagsHelpTextHowToApply": "How to apply tags to the selected indexers",
"ApplyTagsHelpTextAdd": "Add: Add the tags the existing list of tags", "ApplyTagsHelpTextAdd": "Add: Add the tags the existing list of tags",
"ApplyTagsHelpTextHowToApply": "How to apply tags to the selected indexers",
"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)",
"AutoAdd": "Auto Add", "AutoAdd": "Auto Add",
@ -34,6 +37,7 @@
"CustomFormatScore": "Custom Format Score", "CustomFormatScore": "Custom Format Score",
"CustomFormats": "Custom Formats", "CustomFormats": "Custom Formats",
"CutoffUnmet": "Cutoff Unmet", "CutoffUnmet": "Cutoff Unmet",
"Daily": "Daily",
"Delete": "Delete", "Delete": "Delete",
"DeleteCondition": "Delete Condition", "DeleteCondition": "Delete Condition",
"DeleteConditionMessageText": "Are you sure you want to delete the condition '{0}'?", "DeleteConditionMessageText": "Are you sure you want to delete the condition '{0}'?",
@ -45,14 +49,15 @@
"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)?",
"Details": "Details",
"Disabled": "Disabled", "Disabled": "Disabled",
"DownloadClients": "Download Clients",
"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.",
"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",
"Edit": "Edit", "Edit": "Edit",
"EditSelectedDownloadClients": "Edit Selected Download Clients", "EditSelectedDownloadClients": "Edit Selected Download Clients",
"EditSelectedImportLists": "Edit Selected Import Lists", "EditSelectedImportLists": "Edit Selected Import Lists",
@ -63,23 +68,25 @@
"EnableRSS": "Enable RSS", "EnableRSS": "Enable RSS",
"Enabled": "Enabled", "Enabled": "Enabled",
"Ended": "Ended", "Ended": "Ended",
"EpisodeInfo": "Episode Info",
"EpisodeNumbers": "Episode Number(s)",
"Events": "Events", "Events": "Events",
"ExistingTag": "Existing tag", "ExistingTag": "Existing tag",
"ExportCustomFormat": "Export Custom Format", "ExportCustomFormat": "Export Custom Format",
"FullSeason": "Full Season",
"General": "General", "General": "General",
"HiddenClickToShow": "Hidden, click to show", "HiddenClickToShow": "Hidden, click to show",
"HideAdvanced": "Hide Advanced", "HideAdvanced": "Hide Advanced",
"History": "History", "History": "History",
"Implementation": "Implementation", "Implementation": "Implementation",
"ImportLists": "Import Lists",
"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}",
"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",
"Indexers": "Indexers",
"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}",
@ -90,8 +97,10 @@
"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",
"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",
"LibraryImport": "Library Import", "LibraryImport": "Library Import",
"LogFiles": "Log Files", "LogFiles": "Log Files",
"ManageClients": "Manage Clients", "ManageClients": "Manage Clients",
@ -99,12 +108,16 @@
"ManageImportLists": "Manage Import Lists", "ManageImportLists": "Manage Import Lists",
"ManageIndexers": "Manage Indexers", "ManageIndexers": "Manage Indexers",
"ManageLists": "Manage Lists", "ManageLists": "Manage Lists",
"MatchedToEpisodes": "Matched to Episodes",
"MatchedToSeason": "Matched to Season",
"MatchedToSeries": "Matched to Series",
"MediaManagement": "Media Management", "MediaManagement": "Media Management",
"Metadata": "Metadata", "Metadata": "Metadata",
"MetadataSource": "Metadata Source", "MetadataSource": "Metadata Source",
"Missing": "Missing", "Missing": "Missing",
"Monitored": "Monitored", "Monitored": "Monitored",
"MountHealthCheckMessage": "Mount containing a series path is mounted read-only: ", "MountHealthCheckMessage": "Mount containing a series path is mounted read-only: ",
"MultiSeason": "Multi-Season",
"Name": "Name", "Name": "Name",
"Negated": "Negated", "Negated": "Negated",
"Network": "Network", "Network": "Network",
@ -117,18 +130,25 @@
"NoSeasons": "No seasons", "NoSeasons": "No seasons",
"OneSeason": "1 season", "OneSeason": "1 season",
"OriginalLanguage": "Original Language", "OriginalLanguage": "Original Language",
"PartialSeason": "Partial Season",
"Path": "Path", "Path": "Path",
"PreviousAiring": "Previous Airing", "PreviousAiring": "Previous Airing",
"Priority": "Priority", "Priority": "Priority",
"Profiles": "Profiles", "Profiles": "Profiles",
"Proper": "Proper",
"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}",
"Quality": "Quality", "Quality": "Quality",
"QualityProfile": "Quality Profile", "QualityProfile": "Quality Profile",
"Queue": "Queue", "Queue": "Queue",
"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",
"RefreshSeries": "Refresh Series", "RefreshSeries": "Refresh Series",
"Release": "Release",
"ReleaseGroup": "Release Group",
"ReleaseHash": "Release Hash",
"ReleaseTitle": "Release Title",
"RemotePathMappingBadDockerPathHealthCheckMessage": "You are using docker; download client {0} places downloads in {1} but this is not a valid {2} path. Review your remote path mappings and download client settings.", "RemotePathMappingBadDockerPathHealthCheckMessage": "You are using docker; download client {0} places downloads in {1} but this is not a valid {2} path. Review your remote path mappings and download client settings.",
"RemotePathMappingDockerFolderMissingHealthCheckMessage": "You are using docker; download client {0} places downloads in {1} but this directory does not appear to exist inside the container. Review your remote path mappings and container volume settings.", "RemotePathMappingDockerFolderMissingHealthCheckMessage": "You are using docker; download client {0} places downloads in {1} but this directory does not appear to exist inside the container. Review your remote path mappings and container volume settings.",
"RemotePathMappingDownloadPermissionsHealthCheckMessage": "Sonarr can see but not access downloaded episode {0}. Likely permissions error.", "RemotePathMappingDownloadPermissionsHealthCheckMessage": "Sonarr can see but not access downloaded episode {0}. Likely permissions error.",
@ -158,6 +178,7 @@
"RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {0} were removed from TheTVDB", "RemovedSeriesMultipleRemovedHealthCheckMessage": "Series {0} were removed from TheTVDB",
"RemovedSeriesSingleRemovedHealthCheckMessage": "Series {0} was removed from TheTVDB", "RemovedSeriesSingleRemovedHealthCheckMessage": "Series {0} was removed from TheTVDB",
"RemovingTag": "Removing tag", "RemovingTag": "Removing tag",
"Repack": "Repack",
"Replace": "Replace", "Replace": "Replace",
"Required": "Required", "Required": "Required",
"Result": "Result", "Result": "Result",
@ -165,24 +186,29 @@
"RootFolderMissingHealthCheckMessage": "Missing root folder: {0}", "RootFolderMissingHealthCheckMessage": "Missing root folder: {0}",
"RootFolderMultipleMissingHealthCheckMessage": "Multiple root folders are missing: {0}", "RootFolderMultipleMissingHealthCheckMessage": "Multiple root folders are missing: {0}",
"SearchForMonitoredEpisodes": "Search for monitored episodes", "SearchForMonitoredEpisodes": "Search for monitored episodes",
"SeasonNumber": "Season Number",
"Series": "Series", "Series": "Series",
"SeriesTitle": "Series Title",
"SetTags": "Set Tags", "SetTags": "Set Tags",
"Settings": "Settings", "Settings": "Settings",
"ShowAdvanced": "Show Advanced", "ShowAdvanced": "Show Advanced",
"ShownClickToHide": "Shown, click to hide", "ShownClickToHide": "Shown, click to hide",
"SizeOnDisk": "Size on disk", "SizeOnDisk": "Size on disk",
"Special": "Special",
"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", "Tasks": "Tasks",
"TestParsing": "Test Parsing",
"UI": "UI", "UI": "UI",
"UI Language": "UI Language", "UI Language": "UI Language",
"Unmonitored": "Unmonitored", "Unmonitored": "Unmonitored",
"Updates": "Updates",
"UpdateAvailableHealthCheckMessage": "New update is available", "UpdateAvailableHealthCheckMessage": "New update is available",
"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}'.",
"Updates": "Updates",
"Version": "Version",
"Wanted": "Wanted", "Wanted": "Wanted",
"Yes": "Yes" "Yes": "Yes"
} }