diff --git a/src/controllers/dashboard/plugins/add/index.js b/src/controllers/dashboard/plugins/add/index.js index 89bd499f49..007a2d8410 100644 --- a/src/controllers/dashboard/plugins/add/index.js +++ b/src/controllers/dashboard/plugins/add/index.js @@ -22,6 +22,10 @@ function populateHistory(packageInfo, page) { function populateVersions(packageInfo, page, installedPlugin) { let html = ''; + packageInfo.versions.sort((a, b) => { + return b.timestamp < a.timestamp ? -1 : 1; + }); + for (let i = 0; i < packageInfo.versions.length; i++) { const version = packageInfo.versions[i]; html += ''; diff --git a/src/controllers/dashboard/plugins/installed/index.js b/src/controllers/dashboard/plugins/installed/index.js index 654ae4c29e..77229f3ac9 100644 --- a/src/controllers/dashboard/plugins/installed/index.js +++ b/src/controllers/dashboard/plugins/installed/index.js @@ -66,7 +66,7 @@ function getPluginCardHtml(plugin, pluginConfigurationPages) { if (configPageUrl) { html += ``; } else { - html += '
'; + html += '
'; } if (plugin.HasImage) { @@ -87,12 +87,10 @@ function getPluginCardHtml(plugin, pluginConfigurationPages) { html += '
'; } - html += "
"; - html += configPage && configPage.DisplayName ? configPage.DisplayName : plugin.Name; - html += `
${globalize.translate('LabelStatus')} ${plugin.Status}
`; - html += "
"; - html += plugin.Version; + html += '
'; + html += `${plugin.Name}${plugin.Version}`; html += '
'; + html += `
${globalize.translate('LabelStatus')} ${plugin.Status}
`; html += '
'; html += '
'; html += ''; @@ -161,7 +159,7 @@ function showPluginMenu(page, elem) { menuItems.push({ name: globalize.translate('EnablePlugin'), id: 'enable', - icon: 'mode_enable' + icon: 'check_circle_outline' }); } @@ -169,7 +167,7 @@ function showPluginMenu(page, elem) { menuItems.push({ name: globalize.translate('DisablePlugin'), id: 'disable', - icon: 'mode_disable' + icon: 'do_not_disturb' }); } diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 83e1219d38..574d324fea 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1457,6 +1457,49 @@ "LabelEnableIP4Help": "Enables IPv4 functionality.", "LabelEnableIP4": "Enable IPv4:", "HeaderNetworking": "IP Protocols", - "EnablePlugin": "Enable Plugin", - "DisablePlugin": "Disable Plugin" + "EnablePlugin": "Enable", + "DisablePlugin": "Disable", + "YoutubeDenied": "Requested video is not allowed to be played in embedded players.", + "YoutubeNotFound": "Video not found.", + "YoutubePlaybackError": "Requested video cannot be played.", + "YoutubeBadRequest": "Bad request.", + "LabelSelectStereo": "Stereo", + "LabelSelectMono": "Mono", + "LabelSelectAudioChannels": "Channels", + "LabelAllowedAudioChannels": "Maximum Allowed Audio Channels", + "AllowHevcEncoding": "Allow encoding in HEVC format", + "PreferFmp4HlsContainerHelp": "Prefer to use fMP4 as the default container for HLS, making it possible to direct stream HEVC content on supported devices.", + "PreferFmp4HlsContainer": "Prefer fMP4-HLS Media Container", + "LabelSyncPlayInfo": "Sync Play Info", + "LabelOriginalMediaInfo": "Original Media Info", + "LabelRemuxingInfo": "Re-muxing Info", + "LabelDirectStreamingInfo": "Direct Streaming Info", + "LabelTranscodingInfo": "Transcoding Info", + "LabelVideoInfo": "Video Info", + "LabelAudioInfo": "Audio Info", + "LabelPlaybackInfo": "Playback Info", + "RemuxHelp2": "Re-mux uses very little processing power with a completely lossless media quality.", + "RemuxHelp1": "The media is in an incompatible file container (MKV, AVI, WMV, etc) but both the video stream and audio stream are compatible with the device. The media will be repackaged losslessly on the fly before being sent to the device.", + "Remuxing": "Re-muxing", + "AspectRatioFill": "Fill", + "AspectRatioCover": "Cover", + "SyncPlayGroupDefaultTitle": "{0}'s group", + "PluginFromRepo": "{0} from repository {1}", + "MessageSyncPlayIsDisabled": "Permission required to use Sync Play.", + "LabelSyncPlayTimeSyncOffset": "Time offset:", + "LabelSyncPlayTimeSyncDevice": "Time syncing with:", + "LabelSyncPlayResumePlaybackDescription": "Join back group playback", + "LabelSyncPlayResumePlayback": "Resume local playback", + "LabelSyncPlayHaltPlaybackDescription": "And ignore current playlist updates", + "LabelSyncPlayHaltPlayback": "Stop local playback", + "LabelIsForced": "Forced", + "LabelH265Crf": "H265 encoding CRF:", + "LabelDropSubtitleHere": "Drop subtitle here, or click to browse.", + "HeaderUploadSubtitle": "Upload Subtitle", + "HeaderAddUser": "Add User", + "HeaderAddUpdateSubtitle": "Add/Update Subtitle", + "LabelMinAudiobookResumeHelp": "Titles are assumed unplayed if stopped before this time.", + "LabelMinAudiobookResume": "Minimum Audiobook resume in minutes:", + "LabelMaxAudiobookResumeHelp": "Titles are assumed fully played if stopped after this time.", + "LabelMaxAudiobookResume": "Maximum Audiobook resume in minutes:" } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 4982637825..ac0ef43437 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -180,8 +180,8 @@ "DirectStreamHelp1": "The video stream is compatible with the device, but has an incompatible audio format (DTS, TRUEHD, etc) or number of audio channels. The video stream will be repackaged losslessly on the fly before being sent to the device. Only the audio stream will be transcoded.", "DirectStreamHelp2": "Power consumed by direct streaming usually depends on the audio profile. Only the video stream is lossless.", "DirectStreaming": "Direct streaming", - "EnablePlugin": "Enable Plugin", - "DisablePlugin": "Disable Plugin", + "EnablePlugin": "Enable", + "DisablePlugin": "Disable", "Disc": "Disc", "Disconnect": "Disconnect", "Display": "Display",