From d791da07e39240696e57463466a681cafcb9ba49 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 19 Mar 2020 00:17:51 +0100 Subject: [PATCH 01/41] Translate alerts --- src/components/directorybrowser/directorybrowser.js | 7 +++---- src/strings/en-us.json | 4 +++- src/strings/es.json | 4 +++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index b71f7bbb05..db53f0a398 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -163,16 +163,15 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper- } }).catch(function(response) { if (response) { - // TODO All alerts (across the project), should use Globalize.translate() if (response.status === 404) { - alertText("The path could not be found. Please ensure the path is valid and try again."); + alertText(Globalize.translate("PathNotFound")); return Promise.reject(); } if (response.status === 500) { if (validateWriteable) { - alertText("Jellyfin Server requires write access to this folder. Please ensure write access and try again."); + alertText(Globalize.translate("WriteAccessRequired")); } else { - alertText("The path could not be found. Please ensure the path is valid and try again.") + alertText(Globalize.translate("PathNotFound")) } return Promise.reject() } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 62e8fa3f8f..784fa7c7ad 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1468,5 +1468,7 @@ "XmlTvPathHelp": "A path to a XMLTV file. Jellyfin will read this file and periodically check it for updates. You are responsible for creating and updating the file.", "XmlTvSportsCategoriesHelp": "Programs with these categories will be displayed as sports programs. Separate multiple with '|'.", "Yes": "Yes", - "Yesterday": "Yesterday" + "Yesterday": "Yesterday", + "PathNotFound": "The path could not be found. Please ensure the path is valid and try again.", + "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again." } diff --git a/src/strings/es.json b/src/strings/es.json index 3d56ff56d8..442459c9ea 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1476,5 +1476,7 @@ "LabelDroppedFrames": "Frames perdidos:", "LabelCorruptedFrames": "Frames corruptos:", "AskAdminToCreateLibrary": "Solo un administrador puede crear librerías.", - "AllowFfmpegThrottling": "Acelerar transcodificación" + "AllowFfmpegThrottling": "Acelerar transcodificación", + "PathNotFound": "No se encontró la ruta especificada. Asegúrate de que existe e inténtalo de nuevo.", + "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo." } From e383c3dee1c52d17b644079359a8e5ff70ce2f6c Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 19 Mar 2020 00:40:17 +0100 Subject: [PATCH 02/41] Translate paging phrase --- src/components/imagedownloader/imagedownloader.js | 2 +- src/scripts/librarybrowser.js | 2 +- src/strings/en-us.json | 3 ++- src/strings/es.json | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/imagedownloader/imagedownloader.js b/src/components/imagedownloader/imagedownloader.js index ce53b5cf0d..947a50135c 100644 --- a/src/components/imagedownloader/imagedownloader.js +++ b/src/components/imagedownloader/imagedownloader.js @@ -109,7 +109,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' html += ''; var startAtDisplay = totalRecordCount ? startIndex + 1 : 0; - html += startAtDisplay + '-' + recordsEnd + ' of ' + totalRecordCount; + html += globalize.translate("ListPaging").replace("{0}", startAtDisplay + '-' + recordsEnd).replace("{1}", totalRecordCount); html += ''; diff --git a/src/scripts/librarybrowser.js b/src/scripts/librarybrowser.js index bd8980aed2..a570558f47 100644 --- a/src/scripts/librarybrowser.js +++ b/src/scripts/librarybrowser.js @@ -83,7 +83,7 @@ define(["userSettings"], function (userSettings) { if (html += '
', showControls) { html += ''; - html += (totalRecordCount ? startIndex + 1 : 0) + "-" + recordsEnd + " of " + totalRecordCount; + html += Globalize.translate("ListPaging").replace("{0}", (totalRecordCount ? startIndex + 1 : 0) + "-" + recordsEnd).replace("{1}", totalRecordCount); html += ""; } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 784fa7c7ad..f3e7756f5e 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1470,5 +1470,6 @@ "Yes": "Yes", "Yesterday": "Yesterday", "PathNotFound": "The path could not be found. Please ensure the path is valid and try again.", - "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again." + "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.", + "ListPaging": "{0} of {1}" } diff --git a/src/strings/es.json b/src/strings/es.json index 442459c9ea..138d19f86c 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1478,5 +1478,6 @@ "AskAdminToCreateLibrary": "Solo un administrador puede crear librerías.", "AllowFfmpegThrottling": "Acelerar transcodificación", "PathNotFound": "No se encontró la ruta especificada. Asegúrate de que existe e inténtalo de nuevo.", - "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo." + "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo.", + "ListPaging": "{0} de {1}" } From 8201322715b1a892300e4da3b3d50d07fda8dc62 Mon Sep 17 00:00:00 2001 From: ferferga Date: Tue, 24 Mar 2020 20:15:59 +0100 Subject: [PATCH 03/41] Replace with method overload --- src/components/imagedownloader/imagedownloader.js | 2 +- src/scripts/librarybrowser.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/imagedownloader/imagedownloader.js b/src/components/imagedownloader/imagedownloader.js index 947a50135c..a1c17646f5 100644 --- a/src/components/imagedownloader/imagedownloader.js +++ b/src/components/imagedownloader/imagedownloader.js @@ -109,7 +109,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' html += ''; var startAtDisplay = totalRecordCount ? startIndex + 1 : 0; - html += globalize.translate("ListPaging").replace("{0}", startAtDisplay + '-' + recordsEnd).replace("{1}", totalRecordCount); + html += globalize.translate("ListPaging", startAtDisplay + '-' + recordsEnd, totalRecordCount); html += ''; diff --git a/src/scripts/librarybrowser.js b/src/scripts/librarybrowser.js index a570558f47..9106bdd389 100644 --- a/src/scripts/librarybrowser.js +++ b/src/scripts/librarybrowser.js @@ -83,7 +83,7 @@ define(["userSettings"], function (userSettings) { if (html += '
', showControls) { html += ''; - html += Globalize.translate("ListPaging").replace("{0}", (totalRecordCount ? startIndex + 1 : 0) + "-" + recordsEnd).replace("{1}", totalRecordCount); + html += Globalize.translate("ListPaging", (totalRecordCount ? startIndex + 1 : 0) + "-" + recordsEnd, totalRecordCount); html += ""; } From 4ba2e3a950845fd0be4140bcfc921e1254498071 Mon Sep 17 00:00:00 2001 From: ferferga Date: Tue, 24 Mar 2020 20:49:18 +0100 Subject: [PATCH 04/41] Use globalize.translate() overload everywhere --- .../directorybrowser/directorybrowser.js | 2 +- .../itemidentifier/itemidentifier.js | 2 +- .../metadataeditor/metadataeditor.js | 2 +- src/components/notifications/notifications.js | 8 ++--- src/controllers/dashboard/plugins/add.js | 2 +- .../dashboard/plugins/available.js | 4 +-- .../dashboard/plugins/installed.js | 2 +- .../scheduledtasks/scheduledtasks.js | 2 +- src/controllers/dlnaprofile.js | 34 +++++++++---------- src/controllers/itemdetailpage.js | 6 ++-- src/controllers/movies/moviesrecommended.js | 8 ++--- 11 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index db53f0a398..1d5c23eb1f 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -89,7 +89,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper- var instruction = options.instruction ? options.instruction + "

" : ""; html += '
'; html += instruction; - html += Globalize.translate("MessageDirectoryPickerInstruction").replace("{0}", "\\\\server").replace("{1}", "\\\\192.168.1.101"); + html += Globalize.translate("MessageDirectoryPickerInstruction", "\\\\server", "\\\\192.168.1.101"); if ("bsd" === systemInfo.OperatingSystem.toLowerCase()) { html += "
"; html += "
"; diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 6f28de0b3b..b1aea7ce16 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -306,7 +306,7 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", html += '
'; - var idLabel = globalize.translate("LabelDynamicExternalId").replace("{0}", idInfo.Name); + var idLabel = globalize.translate("LabelDynamicExternalId", idInfo.Name); var value = providerIds[idInfo.Key] || ""; diff --git a/src/components/metadataeditor/metadataeditor.js b/src/components/metadataeditor/metadataeditor.js index e8736258fa..a262a948b0 100644 --- a/src/components/metadataeditor/metadataeditor.js +++ b/src/components/metadataeditor/metadataeditor.js @@ -465,7 +465,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi var id = "txt1" + idInfo.Key; var formatString = idInfo.UrlFormatString || ''; - var labelText = globalize.translate('LabelDynamicExternalId').replace('{0}', idInfo.Name); + var labelText = globalize.translate('LabelDynamicExternalId', idInfo.Name); html += '
'; html += '
'; diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 2c3e45b630..df5552be2e 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -173,15 +173,15 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir }; if (status === 'completed') { - notification.title = globalize.translate('PackageInstallCompleted').replace('{0}', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('PackageInstallCompleted', installation.Name + ' ' + installation.Version); notification.vibrate = true; } else if (status === 'cancelled') { - notification.title = globalize.translate('PackageInstallCancelled').replace('{0}', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('PackageInstallCancelled', installation.Name + ' ' + installation.Version); } else if (status === 'failed') { - notification.title = globalize.translate('PackageInstallFailed').replace('{0}', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('PackageInstallFailed', installation.Name + ' ' + installation.Version); notification.vibrate = true; } else if (status === 'progress') { - notification.title = globalize.translate('InstallingPackage').replace('{0}', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('InstallingPackage', installation.Name + ' ' + installation.Version); notification.actions = [ diff --git a/src/controllers/dashboard/plugins/add.js b/src/controllers/dashboard/plugins/add.js index 72a7134fac..a05cac461b 100644 --- a/src/controllers/dashboard/plugins/add.js +++ b/src/controllers/dashboard/plugins/add.js @@ -84,7 +84,7 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e } if (installedPlugin) { - var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled").replace("{0}", "" + installedPlugin.Version + ""); + var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled", "" + installedPlugin.Version + ""); $("#pCurrentVersion", page).show().html(currentVersionText); } else { $("#pCurrentVersion", page).hide().html(""); diff --git a/src/controllers/dashboard/plugins/available.js b/src/controllers/dashboard/plugins/available.js index 5526bd9ade..166505856e 100644 --- a/src/controllers/dashboard/plugins/available.js +++ b/src/controllers/dashboard/plugins/available.js @@ -16,7 +16,7 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby } function getHeaderText(category) { - category = category.replace(" ", ""); + category = category(" ", ""); if ("Channel" === category) { category = "Channels"; } else if ("Theme" === category) { @@ -116,7 +116,7 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby return ip.Id == plugin.guid; })[0]; html += "
"; - html += installedPlugin ? globalize.translate("LabelVersionInstalled").replace("{0}", installedPlugin.Version) : " "; + html += installedPlugin ? globalize.translate("LabelVersionInstalled", installedPlugin.Version) : " "; html += "
"; html += "
"; html += "
"; diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 026b58ce67..c381b2409e 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -2,7 +2,7 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" "use strict"; function deletePlugin(page, uniqueid, name) { - var msg = globalize.translate("UninstallPluginConfirmation").replace("{0}", name); + var msg = globalize.translate("UninstallPluginConfirmation", name); require(["confirm"], function (confirm) { confirm({ diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index 390fd17353..e21d4c23f4 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -66,7 +66,7 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "huma var html = ""; if (task.State === "Idle") { if (task.LastExecutionResult) { - html += globalize.translate("LabelScheduledTaskLastRan").replace("{0}", humaneDate(task.LastExecutionResult.EndTimeUtc)).replace("{1}", humaneElapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)); + html += globalize.translate("LabelScheduledTaskLastRan", humaneDate(task.LastExecutionResult.EndTimeUtc), humaneElapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)); if (task.LastExecutionResult.Status === "Failed") { html += " (" + globalize.translate("LabelFailed") + ")"; } else if (task.LastExecutionResult.Status === "Cancelled") { diff --git a/src/controllers/dlnaprofile.js b/src/controllers/dlnaprofile.js index fb4cdb425e..ca0d3afdb1 100644 --- a/src/controllers/dlnaprofile.js +++ b/src/controllers/dlnaprofile.js @@ -258,14 +258,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in html += "
"; html += ''; - html += "

" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "

"; + html += "

" + Globalize.translate("ValueContainer", profile.Container || allText) + "

"; if ("Video" == profile.Type) { - html += "

" + Globalize.translate("ValueVideoCodec").replace("{0}", profile.VideoCodec || allText) + "

"; - html += "

" + Globalize.translate("ValueAudioCodec").replace("{0}", profile.AudioCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "

"; } else { if ("Audio" == profile.Type) { - html += "

" + Globalize.translate("ValueCodec").replace("{0}", profile.AudioCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueCodec", profile.AudioCodec || allText) + "

"; } } @@ -319,14 +319,14 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in html += "
"; html += ''; html += "

Protocol: " + (profile.Protocol || "Http") + "

"; - html += "

" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "

"; + html += "

" + Globalize.translate("ValueContainer", profile.Container || allText) + "

"; if ("Video" == profile.Type) { - html += "

" + Globalize.translate("ValueVideoCodec").replace("{0}", profile.VideoCodec || allText) + "

"; - html += "

" + Globalize.translate("ValueAudioCodec").replace("{0}", profile.AudioCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "

"; } else { if ("Audio" == profile.Type) { - html += "

" + Globalize.translate("ValueCodec").replace("{0}", profile.AudioCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueCodec", profile.AudioCodec || allText) + "

"; } } @@ -404,11 +404,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in html += "
"; html += ''; - html += "

" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "

"; + html += "

" + Globalize.translate("ValueContainer", profile.Container || allText) + "

"; if (profile.Conditions && profile.Conditions.length) { html += "

"; - html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) { + html += Globalize.translate("ValueConditions", profile.Conditions.map(function (c) { return c.Property; }).join(", ")); html += "

"; @@ -476,11 +476,11 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in html += "
"; html += ''; - html += "

" + Globalize.translate("ValueCodec").replace("{0}", profile.Codec || allText) + "

"; + html += "

" + Globalize.translate("ValueCodec", profile.Codec || allText) + "

"; if (profile.Conditions && profile.Conditions.length) { html += "

"; - html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) { + html += Globalize.translate("ValueConditions", profile.Conditions.map(function (c) { return c.Property; }).join(", ")); html += "

"; @@ -547,20 +547,20 @@ define(["jQuery", "loading", "fnchecked", "emby-select", "emby-button", "emby-in html += "
"; html += ''; - html += "

" + Globalize.translate("ValueContainer").replace("{0}", profile.Container || allText) + "

"; + html += "

" + Globalize.translate("ValueContainer", profile.Container || allText) + "

"; if ("Video" == profile.Type) { - html += "

" + Globalize.translate("ValueVideoCodec").replace("{0}", profile.VideoCodec || allText) + "

"; - html += "

" + Globalize.translate("ValueAudioCodec").replace("{0}", profile.AudioCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueVideoCodec", profile.VideoCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueAudioCodec", profile.AudioCodec || allText) + "

"; } else { if ("Audio" == profile.Type) { - html += "

" + Globalize.translate("ValueCodec").replace("{0}", profile.AudioCodec || allText) + "

"; + html += "

" + Globalize.translate("ValueCodec", profile.AudioCodec || allText) + "

"; } } if (profile.Conditions && profile.Conditions.length) { html += "

"; - html += Globalize.translate("ValueConditions").replace("{0}", profile.Conditions.map(function (c) { + html += Globalize.translate("ValueConditions", profile.Conditions.map(function (c) { return c.Property; }).join(", ")); html += "

"; diff --git a/src/controllers/itemdetailpage.js b/src/controllers/itemdetailpage.js index 82569835ca..835253ee11 100644 --- a/src/controllers/itemdetailpage.js +++ b/src/controllers/itemdetailpage.js @@ -591,7 +591,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti try { var birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString(); itemBirthday.classList.remove("hide"); - itemBirthday.innerHTML = globalize.translate("BirthDateValue").replace("{0}", birthday); + itemBirthday.innerHTML = globalize.translate("BirthDateValue", birthday); } catch (err) { itemBirthday.classList.add("hide"); } @@ -605,7 +605,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti try { var deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString(); itemDeathDate.classList.remove("hide"); - itemDeathDate.innerHTML = globalize.translate("DeathDateValue").replace("{0}", deathday); + itemDeathDate.innerHTML = globalize.translate("DeathDateValue", deathday); } catch (err) { itemDeathDate.classList.add("hide"); } @@ -618,7 +618,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if ("Person" == item.Type && item.ProductionLocations && item.ProductionLocations.length) { var gmap = '
' + item.ProductionLocations[0] + ""; itemBirthLocation.classList.remove("hide"); - itemBirthLocation.innerHTML = globalize.translate("BirthPlaceValue").replace("{0}", gmap); + itemBirthLocation.innerHTML = globalize.translate("BirthPlaceValue", gmap); } else { itemBirthLocation.classList.add("hide"); } diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 7e19af4b9f..98e0871479 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -91,21 +91,21 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" switch (recommendation.RecommendationType) { case "SimilarToRecentlyPlayed": - title = Globalize.translate("RecommendationBecauseYouWatched").replace("{0}", recommendation.BaselineItemName); + title = Globalize.translate("RecommendationBecauseYouWatched", recommendation.BaselineItemName); break; case "SimilarToLikedItem": - title = Globalize.translate("RecommendationBecauseYouLike").replace("{0}", recommendation.BaselineItemName); + title = Globalize.translate("RecommendationBecauseYouLike", recommendation.BaselineItemName); break; case "HasDirectorFromRecentlyPlayed": case "HasLikedDirector": - title = Globalize.translate("RecommendationDirectedBy").replace("{0}", recommendation.BaselineItemName); + title = Globalize.translate("RecommendationDirectedBy", recommendation.BaselineItemName); break; case "HasActorFromRecentlyPlayed": case "HasLikedActor": - title = Globalize.translate("RecommendationStarring").replace("{0}", recommendation.BaselineItemName); + title = Globalize.translate("RecommendationStarring", recommendation.BaselineItemName); break; } From 1ec4ce0dfae6f44480775fdfab4eb7afe3586796 Mon Sep 17 00:00:00 2001 From: ferferga Date: Tue, 24 Mar 2020 21:15:34 +0100 Subject: [PATCH 05/41] Add date-fns dependency --- package.json | 1 + yarn.lock | 142 +++++---------------------------------------------- 2 files changed, 14 insertions(+), 129 deletions(-) diff --git a/package.json b/package.json index 90cfa954a8..ae50f65b93 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "dependencies": { "alameda": "^1.4.0", "core-js": "^3.6.4", + "date-fns": "^2.11.0", "document-register-element": "^1.14.3", "flv.js": "^1.5.0", "hls.js": "^0.13.1", diff --git a/yarn.lock b/yarn.lock index 8dee672565..5b9f8aa453 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3051,6 +3051,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +date-fns@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.0.tgz#ec2b44977465b9dcb370021d5e6c019b19f36d06" + integrity sha512-8P1cDi8ebZyDxUyUprBXwidoEtiQAawYPGvpfb+Dg0G6JrQ+VozwOmm91xYC0vAv1+0VmLehEPb+isg4BGUFfA== + dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" @@ -3072,7 +3077,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@3.X, debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: +debug@3.X, debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3183,11 +3188,6 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -3302,11 +3302,6 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@2.X: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -4551,13 +4546,6 @@ fs-extra@3.0.1: jsonfile "^3.0.0" universalify "^0.1.0" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs-mkdirp-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" @@ -5532,7 +5520,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5556,13 +5544,6 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -5744,7 +5725,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -7257,21 +7238,6 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -7406,15 +7372,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" - integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7499,22 +7456,6 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.50: version "1.1.52" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" @@ -7552,14 +7493,6 @@ node-sass@^4.13.1, node-sass@^4.8.3: dependencies: abbrev "1" -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -7613,13 +7546,6 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-conf@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" @@ -7628,20 +7554,6 @@ npm-conf@^1.1.0: config-chain "^1.1.11" pify "^3.0.0" -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -7649,7 +7561,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7916,7 +7828,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: +osenv@0: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -9369,16 +9281,6 @@ raw-body@^2.3.2: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-file-stdin@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/read-file-stdin/-/read-file-stdin-0.2.1.tgz#25eccff3a153b6809afacb23ee15387db9e0ee61" @@ -9853,7 +9755,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9952,7 +9854,7 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -10801,11 +10703,6 @@ strip-json-comments@^3.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-outer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -11115,19 +11012,6 @@ tar@^2.0.0: fstream "^1.0.12" inherits "2" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -12275,7 +12159,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From cbe3cbe221422f37b3285ee950d760b17a0ae218 Mon Sep 17 00:00:00 2001 From: ferferga Date: Tue, 24 Mar 2020 22:27:01 +0100 Subject: [PATCH 06/41] Translate role sentences (and removed dead code) --- src/components/cardbuilder/cardBuilder.js | 6 +----- src/strings/en-us.json | 3 ++- src/strings/es.json | 3 ++- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 7f562f1fd0..a6ee8fab6d 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -993,11 +993,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana if (options.showPersonRoleOrType) { if (item.Role) { - lines.push('as ' + item.Role); - } else if (item.Type) { - lines.push(globalize.translate('' + item.Type)); - } else { - lines.push(''); + lines.push(globalize.translate('PersonRole', item.Role)); } } } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index f3e7756f5e..5e5984b34c 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1471,5 +1471,6 @@ "Yesterday": "Yesterday", "PathNotFound": "The path could not be found. Please ensure the path is valid and try again.", "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.", - "ListPaging": "{0} of {1}" + "ListPaging": "{0} of {1}", + "PersonRole": "as {0}" } diff --git a/src/strings/es.json b/src/strings/es.json index 138d19f86c..58ca9d623a 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1479,5 +1479,6 @@ "AllowFfmpegThrottling": "Acelerar transcodificación", "PathNotFound": "No se encontró la ruta especificada. Asegúrate de que existe e inténtalo de nuevo.", "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo.", - "ListPaging": "{0} de {1}" + "ListPaging": "{0} de {1}", + "PersonRole": "como {0}" } From 1656e73adf3dfc3906d9cab7abf5a22266e90935 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 26 Mar 2020 13:53:30 +0100 Subject: [PATCH 07/41] Attempt to implement date-fns internalization --- src/bundle.js | 11 +++++++++++ .../dashboard/scheduledtasks/scheduledtasks.js | 6 ++++-- src/scripts/site.js | 2 ++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/bundle.js b/src/bundle.js index 5e1a2ab3e3..dc2402d13d 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -114,3 +114,14 @@ var polyfill = require("@babel/polyfill/dist/polyfill"); _define("polyfill", function () { return polyfill; }); + +// Date-FNS +var date_fns = require("date-fns"); +_define("date-fns", function () { + return date_fns; +}); + +var date_fns_locale = require("date-fns/locale"); +_define("date-fns/locale", function () { + return date_fns_locale; +}); diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index e21d4c23f4..5f437cc47b 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -1,4 +1,5 @@ -define(["jQuery", "loading", "events", "globalize", "serverNotifications", "humanedate", "listViewStyle", "emby-button"], function($, loading, events, globalize, serverNotifications) { +import { es } from 'date-fns/locale' +define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date-fns", "listViewStyle", "emby-button"], function($, loading, events, globalize, serverNotifications, datefns) { "use strict"; function reloadList(page) { @@ -66,7 +67,8 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "huma var html = ""; if (task.State === "Idle") { if (task.LastExecutionResult) { - html += globalize.translate("LabelScheduledTaskLastRan", humaneDate(task.LastExecutionResult.EndTimeUtc), humaneElapsed(task.LastExecutionResult.StartTimeUtc, task.LastExecutionResult.EndTimeUtc)); + html += globalize.translate("LabelScheduledTaskLastRan", datefns.formatDistanceToNow(Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: true, locale: es }), + datefns.formatDistance(Date.parse(task.LastExecutionResult.StartTimeUtc), Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: false, locale: es })); if (task.LastExecutionResult.Status === "Failed") { html += " (" + globalize.translate("LabelFailed") + ")"; } else if (task.LastExecutionResult.Status === "Cancelled") { diff --git a/src/scripts/site.js b/src/scripts/site.js index fca5011478..d29da5cf30 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -619,6 +619,7 @@ var AppInfo = {}; } require(["mediaSession", "serverNotifications"]); + require(["date-fns", "date-fns/locale"]); if (!browser.tv && !browser.xboxOne) { require(["components/playback/playbackorientation"]); @@ -738,6 +739,7 @@ var AppInfo = {}; "webcomponents", "material-icons", "jellyfin-noto", + "date-fns", "page", "polyfill" ] From 368f21010bbcd61bb24ad41a5a5eaa81dbf73b50 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 19:31:32 +0200 Subject: [PATCH 08/41] First successful attempt at dynamic lang loading --- package.json | 2 +- .../scheduledtasks/scheduledtasks.js | 7 +- src/scripts/dfnshelper.js | 103 ++++++++++++++++++ src/scripts/site.js | 1 + src/strings/es.json | 2 +- yarn.lock | 8 +- 6 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 src/scripts/dfnshelper.js diff --git a/package.json b/package.json index 2138e51f01..1446782cc3 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "dependencies": { "alameda": "^1.4.0", "core-js": "^3.6.4", - "date-fns": "^2.11.0", + "date-fns": "^2.11.1", "document-register-element": "^1.14.3", "flv.js": "^1.5.0", "hls.js": "^0.13.1", diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index 5f437cc47b..133e6247de 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -1,5 +1,4 @@ -import { es } from 'date-fns/locale' -define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date-fns", "listViewStyle", "emby-button"], function($, loading, events, globalize, serverNotifications, datefns) { +define(["jQuery", "loading", "events", "globalize", "dfnshelper", "serverNotifications", "date-fns", "listViewStyle", "emby-button"], function($, loading, events, globalize, dfnshelper, serverNotifications, datefns) { "use strict"; function reloadList(page) { @@ -67,8 +66,8 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date var html = ""; if (task.State === "Idle") { if (task.LastExecutionResult) { - html += globalize.translate("LabelScheduledTaskLastRan", datefns.formatDistanceToNow(Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: true, locale: es }), - datefns.formatDistance(Date.parse(task.LastExecutionResult.StartTimeUtc), Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: false, locale: es })); + html += globalize.translate("LabelScheduledTaskLastRan", datefns.formatDistanceToNow(Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: true, locale: dfnshelper.getLocale() }), + datefns.formatDistance(Date.parse(task.LastExecutionResult.StartTimeUtc), Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: false, locale: dfnshelper.getLocale() })); if (task.LastExecutionResult.Status === "Failed") { html += " (" + globalize.translate("LabelFailed") + ")"; } else if (task.LastExecutionResult.Status === "Cancelled") { diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js new file mode 100644 index 0000000000..f317613454 --- /dev/null +++ b/src/scripts/dfnshelper.js @@ -0,0 +1,103 @@ +import * as locale from 'date-fns/locale' +define(["globalize"], function (globalize) { + "use strict"; + + function getLocale() + { + switch (globalize.getCurrentLocale()) { + case 'ar': + return locale.ar; + case 'be-by': + return locale.be; + case 'bg-bg': + return locale.bg; + case 'ca': + return locale.ca; + case 'cs': + return locale.cs; + case 'da': + return locale.da; + case 'de': + return locale.de; + case 'el': + return locale.el + case 'en-gb': + return locale.enGB; + case 'en-us': + return locale.enUS; + case 'es': + return locale.es; + case 'es-ar': + return locale.es; + case 'es-mx': + return locale.es; + case 'fa': + return locale.faIR; + case 'fi': + return locale.fi; + case 'fr': + return locale.fr; + case 'fr-ca': + return locale.frCA; + case 'gsw': + return locale.de; + case 'he': + return locale.he; + case 'hi-in': + return locale.hi; + case 'hr': + return locale.hr; + case 'hu': + return locale.hu; + case 'id': + return locale.id; + case 'it': + return locale.it + case 'kk': + return locale.kk; + case 'ko': + return locale.ko; + case 'lt-lt': + return locale.lt; + case 'ms': + return locale.ms; + case 'nb': + return locale.nb; + case 'nl': + return locale.nl; + case 'pl': + return locale.pl + case 'pt-br': + return locale.ptBR; + case 'pt-pt': + return locale.pt; + case 'ro': + return locale.ro; + case 'ru': + return locale.ru; + case 'sk': + return locale.sk; + case 'sl-si': + return locale.sl; + case 'sv': + return locale.sv; + case 'tr': + return locale.tr; + case 'uk': + return locale.uk; + case 'vi': + return locale.vi; + case 'zh-cn': + return locale.zhCN; + case 'zh-hk': + return locale.zhCN; + case 'zh-tw': + return locale.zhTW; + default: + return locale.enUS; + } + } + return { + getLocale: getLocale + }; +}); \ No newline at end of file diff --git a/src/scripts/site.js b/src/scripts/site.js index 4285137f18..0a65cf1a63 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -648,6 +648,7 @@ var AppInfo = {}; inputManager: "scripts/inputManager", datetime: "scripts/datetime", globalize: "scripts/globalize", + dfnshelper: "scripts/dfnshelper", libraryMenu: "scripts/librarymenu", playlisteditor: componentsPath + "/playlisteditor/playlisteditor", medialibrarycreator: componentsPath + "/medialibrarycreator/medialibrarycreator", diff --git a/src/strings/es.json b/src/strings/es.json index ddf631191c..e35d29cc4e 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1481,5 +1481,5 @@ "PathNotFound": "No se encontró la ruta especificada. Asegúrate de que existe e inténtalo de nuevo.", "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo.", "ListPaging": "{0} de {1}", - "PersonRole": "como {0}", + "PersonRole": "como {0}" } diff --git a/yarn.lock b/yarn.lock index 6410d07831..d4be1ef5e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3085,10 +3085,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-fns@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.0.tgz#ec2b44977465b9dcb370021d5e6c019b19f36d06" - integrity sha512-8P1cDi8ebZyDxUyUprBXwidoEtiQAawYPGvpfb+Dg0G6JrQ+VozwOmm91xYC0vAv1+0VmLehEPb+isg4BGUFfA== +date-fns@^2.11.1: + version "2.11.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12" + integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w== dateformat@^2.0.0: version "2.2.0" From 35c4d06bf60a4aef03ed87e9a4827a0f02b1d661 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 19:53:11 +0200 Subject: [PATCH 09/41] Translate devices.js, dashboard.js and added new keys --- src/controllers/dashboard/dashboard.js | 4 ++-- src/controllers/dashboard/scheduledtasks/scheduledtasks.js | 2 +- src/controllers/devices.js | 4 ++-- src/scripts/dfnshelper.js | 6 +++--- src/strings/en-us.json | 3 ++- src/strings/es.json | 3 ++- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 2057deaf6f..922ec763cb 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -1,4 +1,4 @@ -define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "indicators", "humanedate", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) { +define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "datefns", "dfnshelper", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "indicators", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, datefns, dfnshelper, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) { "use strict"; function showPlaybackInfo(btn, session) { @@ -470,7 +470,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (!nowPlayingItem) { return { - html: "Last seen " + humaneDate(session.LastActivityDate), + html: globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), { addSuffix: true, locale: dfnshelper.getLocale() })), image: imgUrl }; } diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index 133e6247de..f6616bad9d 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -1,4 +1,4 @@ -define(["jQuery", "loading", "events", "globalize", "dfnshelper", "serverNotifications", "date-fns", "listViewStyle", "emby-button"], function($, loading, events, globalize, dfnshelper, serverNotifications, datefns) { +define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date-fns", "dfnshelper", "listViewStyle", "emby-button"], function ($, loading, events, globalize, serverNotifications, datefns, dfnshelper) { "use strict"; function reloadList(page) { diff --git a/src/controllers/devices.js b/src/controllers/devices.js index 3fd2be983e..dccece404d 100644 --- a/src/controllers/devices.js +++ b/src/controllers/devices.js @@ -1,4 +1,4 @@ -define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "humanedate", "emby-button", "emby-itemscontainer", "cardStyle"], function (loading, dom, libraryMenu, globalize, imageHelper) { +define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "date-fns", "dfnshelper", "emby-button", "emby-itemscontainer", "cardStyle"], function (loading, dom, libraryMenu, globalize, imageHelper, datefns, dfnshelper) { "use strict"; function canDelete(deviceId) { @@ -103,7 +103,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu if (device.LastUserName) { deviceHtml += device.LastUserName; - deviceHtml += ", " + humaneDate(device.DateLastActivity); + deviceHtml += ", " + datefns.formatDistanceToNow(Date.parse(device.DateLastActivity), { addSuffix: true, locale: dfnshelper.getLocale() }); } deviceHtml += " "; diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index f317613454..0efc6aa6fe 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -20,7 +20,7 @@ define(["globalize"], function (globalize) { case 'de': return locale.de; case 'el': - return locale.el + return locale.el; case 'en-gb': return locale.enGB; case 'en-us': @@ -52,7 +52,7 @@ define(["globalize"], function (globalize) { case 'id': return locale.id; case 'it': - return locale.it + return locale.it; case 'kk': return locale.kk; case 'ko': @@ -66,7 +66,7 @@ define(["globalize"], function (globalize) { case 'nl': return locale.nl; case 'pl': - return locale.pl + return locale.pl; case 'pt-br': return locale.ptBR; case 'pt-pt': diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 3787f3025f..79e8feb8d2 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1473,5 +1473,6 @@ "PathNotFound": "The path could not be found. Please ensure the path is valid and try again.", "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.", "ListPaging": "{0} of {1}", - "PersonRole": "as {0}" + "PersonRole": "as {0}", + "LastSeen": "Last seen {0}" } diff --git a/src/strings/es.json b/src/strings/es.json index e35d29cc4e..7439138b75 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1481,5 +1481,6 @@ "PathNotFound": "No se encontró la ruta especificada. Asegúrate de que existe e inténtalo de nuevo.", "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo.", "ListPaging": "{0} de {1}", - "PersonRole": "como {0}" + "PersonRole": "como {0}", + "LastSeen": "Última vez {0}" } From 41e27123155b59e210e33032ddf01811610255df Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 19:55:09 +0200 Subject: [PATCH 10/41] Fix typo --- src/controllers/dashboard/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 922ec763cb..a7caa7a9f5 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -1,4 +1,4 @@ -define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "datefns", "dfnshelper", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "indicators", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, datefns, dfnshelper, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) { +define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "date-fns", "dfnshelper", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "indicators", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, datefns, dfnshelper, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) { "use strict"; function showPlaybackInfo(btn, session) { From af9d2d0bf8d1a2c9c973e2876343653be49adb69 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 19:59:44 +0200 Subject: [PATCH 11/41] Comment for known issue --- src/controllers/dashboard/dashboard.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index a7caa7a9f5..37e9a6155a 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -467,7 +467,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa getNowPlayingName: function (session) { var imgUrl = ""; var nowPlayingItem = session.NowPlayingItem; - + // FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix + // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences if (!nowPlayingItem) { return { html: globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), { addSuffix: true, locale: dfnshelper.getLocale() })), From b0a6c4dabc4c25e00d8c0f2be75b6e06be988241 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 20:02:52 +0200 Subject: [PATCH 12/41] Datefns on userprofilespage.js and complete removal of humanedate --- src/components/humanedate.js | 74 ----------------------------- src/controllers/userprofilespage.js | 4 +- src/scripts/site.js | 1 - 3 files changed, 2 insertions(+), 77 deletions(-) delete mode 100644 src/components/humanedate.js diff --git a/src/components/humanedate.js b/src/components/humanedate.js deleted file mode 100644 index 26ce26d942..0000000000 --- a/src/components/humanedate.js +++ /dev/null @@ -1,74 +0,0 @@ -define(["datetime"], function (datetime) { - "use strict"; - - function humaneDate(date_str) { - var format; - var time_formats = [ - [90, "a minute"], - [3600, "minutes", 60], - [5400, "an hour"], - [86400, "hours", 3600], - [129600, "a day"], - [604800, "days", 86400], - [907200, "a week"], - [2628e3, "weeks", 604800], - [3942e3, "a month"], - [31536e3, "months", 2628e3], - [47304e3, "a year"], - [31536e5, "years", 31536e3] - ]; - var dt = new Date(); - var date = datetime.parseISO8601Date(date_str, true); - var seconds = (dt - date) / 1000.0; - var i = 0; - - if (seconds < 0) { - seconds = Math.abs(seconds); - } - // eslint-disable-next-line no-cond-assign - for (; format = time_formats[i++];) { - if (seconds < format[0]) { - if (2 == format.length) { - return format[1] + " ago"; - } - - return Math.round(seconds / format[2]) + " " + format[1] + " ago"; - } - } - - if (seconds > 47304e5) { - return Math.round(seconds / 47304e5) + " centuries ago"; - } - - return date_str; - } - - function humaneElapsed(firstDateStr, secondDateStr) { - // TODO replace this whole script with a library or something - var dateOne = new Date(firstDateStr); - var dateTwo = new Date(secondDateStr); - var delta = (dateTwo.getTime() - dateOne.getTime()) / 1e3; - var days = Math.floor(delta % 31536e3 / 86400); - var hours = Math.floor(delta % 31536e3 % 86400 / 3600); - var minutes = Math.floor(delta % 31536e3 % 86400 % 3600 / 60); - var seconds = Math.round(delta % 31536e3 % 86400 % 3600 % 60); - var elapsed = ""; - elapsed += 1 == days ? days + " day " : ""; - elapsed += days > 1 ? days + " days " : ""; - elapsed += 1 == hours ? hours + " hour " : ""; - elapsed += hours > 1 ? hours + " hours " : ""; - elapsed += 1 == minutes ? minutes + " minute " : ""; - elapsed += minutes > 1 ? minutes + " minutes " : ""; - elapsed += elapsed.length > 0 ? "and " : ""; - elapsed += 1 == seconds ? seconds + " second" : ""; - elapsed += 0 == seconds || seconds > 1 ? seconds + " seconds" : ""; - return elapsed; - } - - window.humaneDate = humaneDate; - window.humaneElapsed = humaneElapsed; - return { - humaneDate: humaneDate, - humaneElapsed: humaneElapsed - }; -}); diff --git a/src/controllers/userprofilespage.js b/src/controllers/userprofilespage.js index 2a2387ab60..d7ffeedebf 100644 --- a/src/controllers/userprofilespage.js +++ b/src/controllers/userprofilespage.js @@ -1,4 +1,4 @@ -define(["loading", "dom", "globalize", "humanedate", "paper-icon-button-light", "cardStyle", "emby-button", "indicators", "flexStyles"], function (loading, dom, globalize) { +define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-button-light", "cardStyle", "emby-button", "indicators", "flexStyles"], function (loading, dom, globalize, datefns, dfnshelper) { "use strict"; function deleteUser(page, id) { @@ -128,7 +128,7 @@ define(["loading", "dom", "globalize", "humanedate", "paper-icon-button-light", function getLastSeenText(lastActivityDate) { if (lastActivityDate) { - return "Last seen " + humaneDate(lastActivityDate); + return globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), { addSuffix: true, locale: dfnshelper.getLocale() })); } return ""; diff --git a/src/scripts/site.js b/src/scripts/site.js index 0a65cf1a63..5eb3c2a346 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -654,7 +654,6 @@ var AppInfo = {}; medialibrarycreator: componentsPath + "/medialibrarycreator/medialibrarycreator", medialibraryeditor: componentsPath + "/medialibraryeditor/medialibraryeditor", imageoptionseditor: componentsPath + "/imageoptionseditor/imageoptionseditor", - humanedate: componentsPath + "/humanedate", apphost: componentsPath + "/apphost", visibleinviewport: componentsPath + "/visibleinviewport", qualityoptions: componentsPath + "/qualityoptions", From 9d6255dfa1986964fa51a7ee7b376781bfd621bf Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 20:03:59 +0200 Subject: [PATCH 13/41] Replace linter rules of humanedate to dfnshelper --- .eslintrc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 377716d53c..48035e1864 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -40,7 +40,7 @@ globals: getWindowLocationSearch: writable Globalize: writable Hls: writable - humaneDate: writable + dfnshelper: writable humaneElapsed: writable LibraryMenu: writable LinkParser: writable From f6340eb0b32e30a88aa2ee944ad5a48cfc80c9d4 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 20:11:10 +0200 Subject: [PATCH 14/41] Fix copy-paste typo and add comments --- src/controllers/userprofilespage.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/controllers/userprofilespage.js b/src/controllers/userprofilespage.js index d7ffeedebf..955b8de521 100644 --- a/src/controllers/userprofilespage.js +++ b/src/controllers/userprofilespage.js @@ -125,10 +125,11 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but html += "
"; return html + "
"; } - + // FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix + // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences function getLastSeenText(lastActivityDate) { if (lastActivityDate) { - return globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), { addSuffix: true, locale: dfnshelper.getLocale() })); + return globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(lastActivityDate), { addSuffix: true, locale: dfnshelper.getLocale() })); } return ""; From d23ad21bea48d0633efdc14de12193e81bc8225a Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 20:15:07 +0200 Subject: [PATCH 15/41] Remove unused lint rule --- .eslintrc.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 48035e1864..bd2f95909c 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -41,7 +41,6 @@ globals: Globalize: writable Hls: writable dfnshelper: writable - humaneElapsed: writable LibraryMenu: writable LinkParser: writable LiveTvHelpers: writable From 511b151d71b2c9eb04b7a818ce30f372b08327ac Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 2 Apr 2020 20:25:42 +0200 Subject: [PATCH 16/41] Remove deprecated touch detection --- src/scripts/browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/browser.js b/src/scripts/browser.js index f9e1942320..a6402d1393 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -292,7 +292,7 @@ define([], function () { } if (typeof document !== 'undefined') { - if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { + if (('ontouchstart' in window) || (navigator.MaxTouchPoints > 0)) { browser.touch = true; } } From 648f7379b358adf20f452993552045f9f47b3893 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 2 Apr 2020 20:34:48 +0200 Subject: [PATCH 17/41] Silence ESLint warnings in CI --- .ci/azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/azure-pipelines.yml b/.ci/azure-pipelines.yml index 7c7801b866..9c231e1391 100644 --- a/.ci/azure-pipelines.yml +++ b/.ci/azure-pipelines.yml @@ -95,7 +95,7 @@ jobs: displayName: 'Install Dependencies' condition: ne(variables.CACHE_RESTORED, 'true') - - script: 'yarn run lint' + - script: 'yarn run lint --quiet' displayName: 'Run ESLint' - script: 'yarn run stylelint' From cdb9b2920368960fc653a91edebd48753de94d2e Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 2 Apr 2020 20:35:08 +0200 Subject: [PATCH 18/41] Add some environments and cleanup globals --- .eslintrc.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 377716d53c..f99bc97c63 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,21 +1,19 @@ env: - es6: true - browser: true amd: true + browser: true + es6: true + es2017: true + es2020: true parserOptions: - ecmaVersion: 6 + ecmaVersion: 2020 sourceType: module ecmaFeatures: impliedStrict: true globals: - # New browser globals - DataView: readonly + # Browser globals MediaMetadata: readonly - Promise: readonly - # Deprecated browser globals - DocumentTouch: readonly # Tizen globals tizen: readonly webapis: readonly @@ -24,7 +22,6 @@ globals: # Dependency globals $: readonly jQuery: readonly - queryString: readonly requirejs: readonly # Jellyfin globals ApiClient: writable From 95e13ca4884f4f3a9b466d44c01e2462b9a5766a Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 20:35:33 +0200 Subject: [PATCH 19/41] datetime to date-fns on activitylog.js --- src/components/activitylog.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/activitylog.js b/src/components/activitylog.js index 05971f01b8..934a610ad0 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -1,4 +1,4 @@ -define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotifications", "connectionManager", "emby-button", "listViewStyle"], function (events, globalize, dom, datetime, userSettings, serverNotifications, connectionManager) { +define(["events", "globalize", "dom", "date-fns", "dfnshelper", "userSettings", "serverNotifications", "connectionManager", "emby-button", "listViewStyle"], function (events, globalize, dom, datefns, dfnshelper, userSettings, serverNotifications, connectionManager) { "use strict"; function getEntryHtml(entry, apiClient) { @@ -26,8 +26,7 @@ define(["events", "globalize", "dom", "datetime", "userSettings", "serverNotific html += entry.Name; html += "
"; html += '
'; - var date = datetime.parseISO8601Date(entry.Date, true); - html += datetime.toLocaleString(date).toLowerCase(); + html += datefns.formatRelative(Date.parse(entry.Date), Date.parse(new Date()), { locale: dfnshelper.getLocale() }); html += "
"; html += '
'; html += entry.ShortOverview || ""; From b23496939afd5199eb883bfcda69cefa63f190e2 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 21:25:43 +0200 Subject: [PATCH 20/41] First attempt at translating sheduledtask.js --- .../dashboard/scheduledtasks/scheduledtask.js | 20 ++++++++++--------- src/strings/en-us.json | 9 ++++++++- src/strings/es.json | 9 ++++++++- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtask.js b/src/controllers/dashboard/scheduledtasks/scheduledtask.js index 03eeeeb870..1f156982fd 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtask.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtask.js @@ -75,17 +75,19 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby html += "
"; context.querySelector(".taskTriggers").innerHTML = html; }, + // TODO: Replace this mess with date-fns and remove datetime completely getTriggerFriendlyName: function (trigger) { if ("DailyTrigger" == trigger.Type) { - return "Daily at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); + return globalize("DailyAt", ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } if ("WeeklyTrigger" == trigger.Type) { - return trigger.DayOfWeek + "s at " + ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks); + // TODO: The day of week isn't localised as well + return globalize("WeeklyAt", trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) { - return "On wake from sleep"; + return globalize.translate("OnWakeFromSleep"); } if (trigger.Type == "IntervalTrigger") { @@ -93,23 +95,23 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby var hours = trigger.IntervalTicks / 36e9; if (hours == 0.25) { - return "Every 15 minutes"; + return globalize.translate("EveryXMinutes", "15"); } if (hours == 0.5) { - return "Every 30 minutes"; + return globalize.translate("EveryXMinutes", "30"); } if (hours == 0.75) { - return "Every 45 minutes"; + return globalize.translate("EveryXMinutes", "45"); } if (hours == 1) { - return "Every hour"; + return globalize.translate("EveryHour"); } - return "Every " + hours + " hours"; + return globalize.translate("EveryXHours", hours); } if (trigger.Type == "StartupTrigger") { - return "On application startup"; + return globalize.translate("OnApplicationStartup"); } return trigger.Type; diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 79e8feb8d2..126ce74b41 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1474,5 +1474,12 @@ "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.", "ListPaging": "{0} of {1}", "PersonRole": "as {0}", - "LastSeen": "Last seen {0}" + "LastSeen": "Last seen {0}", + "DailyAt": "Daily at {0}", + "WeeklyAt": "{0}s at {1}", + "OnWakeFromSleep": "On wake from sleep", + "EveryXMinutes": "Every {0} minutes", + "EveryHour": "Every hour", + "EveryXHours": "Every {0} hours", + "OnApplicationStartup": "On application startup" } diff --git a/src/strings/es.json b/src/strings/es.json index 7439138b75..35bde0b9b3 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1482,5 +1482,12 @@ "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo.", "ListPaging": "{0} de {1}", "PersonRole": "como {0}", - "LastSeen": "Última vez {0}" + "LastSeen": "Última vez {0}", + "DailyAt": "Diariamente a las {0}", + "WeeklyAt": "Los {0}s a las {1}", + "OnWakeFromSleep": "Al reanudar el servidor", + "EveryXMinutes": "Cada {0} minutos", + "EveryHour": "Cada hora", + "EveryXHours": "Cada {0} horas", + "OnApplicationStartup": "Al iniciarse el servidor" } From bdae2eebc25a4ea612e437df0052e7405b8694aa Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 21:40:09 +0200 Subject: [PATCH 21/41] Fix typos --- src/controllers/dashboard/scheduledtasks/scheduledtask.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtask.js b/src/controllers/dashboard/scheduledtasks/scheduledtask.js index 1f156982fd..8a3cdf5d69 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtask.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtask.js @@ -78,12 +78,12 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby // TODO: Replace this mess with date-fns and remove datetime completely getTriggerFriendlyName: function (trigger) { if ("DailyTrigger" == trigger.Type) { - return globalize("DailyAt", ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); + return globalize.translate("DailyAt", ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } if ("WeeklyTrigger" == trigger.Type) { // TODO: The day of week isn't localised as well - return globalize("WeeklyAt", trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); + return globalize.translate("WeeklyAt", trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) { From 357b4c7a4c2ecc7888958d5dc6ed56f2f6f6800f Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 2 Apr 2020 22:04:36 +0200 Subject: [PATCH 22/41] Moved to ES6 Co-Authored-By: Julien Machiels --- src/scripts/dfnshelper.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index 0efc6aa6fe..6f4ef6d393 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -1,5 +1,6 @@ -import * as locale from 'date-fns/locale' -define(["globalize"], function (globalize) { +import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, kk, ko, lt, ms, nb, nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale'; +import globalize from 'globalize'; + "use strict"; function getLocale() @@ -100,4 +101,4 @@ define(["globalize"], function (globalize) { return { getLocale: getLocale }; -}); \ No newline at end of file +}); From 59d239f319a44a30c5b50d489d8a947f70eb539c Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 22:08:46 +0200 Subject: [PATCH 23/41] Change variables after ES6 --- src/scripts/dfnshelper.js | 90 +++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index 6f4ef6d393..c4fc350490 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -7,95 +7,95 @@ import globalize from 'globalize'; { switch (globalize.getCurrentLocale()) { case 'ar': - return locale.ar; + return ar; case 'be-by': - return locale.be; + return be; case 'bg-bg': - return locale.bg; + return bg; case 'ca': - return locale.ca; + return ca; case 'cs': - return locale.cs; + return cs; case 'da': - return locale.da; + return da; case 'de': - return locale.de; + return de; case 'el': - return locale.el; + return el; case 'en-gb': - return locale.enGB; + return enGB; case 'en-us': - return locale.enUS; + return enUS; case 'es': - return locale.es; + return es; case 'es-ar': - return locale.es; + return es; case 'es-mx': - return locale.es; + return es; case 'fa': - return locale.faIR; + return faIR; case 'fi': - return locale.fi; + return fi; case 'fr': - return locale.fr; + return fr; case 'fr-ca': - return locale.frCA; + return frCA; case 'gsw': - return locale.de; + return de; case 'he': - return locale.he; + return he; case 'hi-in': - return locale.hi; + return hi; case 'hr': - return locale.hr; + return hr; case 'hu': - return locale.hu; + return hu; case 'id': - return locale.id; + return id; case 'it': - return locale.it; + return it; case 'kk': - return locale.kk; + return kk; case 'ko': - return locale.ko; + return ko; case 'lt-lt': - return locale.lt; + return lt; case 'ms': - return locale.ms; + return ms; case 'nb': - return locale.nb; + return nb; case 'nl': - return locale.nl; + return nl; case 'pl': - return locale.pl; + return pl; case 'pt-br': - return locale.ptBR; + return ptBR; case 'pt-pt': - return locale.pt; + return pt; case 'ro': - return locale.ro; + return ro; case 'ru': - return locale.ru; + return ru; case 'sk': - return locale.sk; + return sk; case 'sl-si': - return locale.sl; + return sl; case 'sv': - return locale.sv; + return sv; case 'tr': - return locale.tr; + return tr; case 'uk': - return locale.uk; + return uk; case 'vi': - return locale.vi; + return vi; case 'zh-cn': - return locale.zhCN; + return zhCN; case 'zh-hk': - return locale.zhCN; + return zhCN; case 'zh-tw': - return locale.zhTW; + return zhTW; default: - return locale.enUS; + return enUS; } } return { From eb8ae3ea705ae81f3488a0ae0d864ccdf9787662 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 2 Apr 2020 23:45:23 +0200 Subject: [PATCH 24/41] Remove extra bracket not needed after ES6 Co-Authored-By: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/scripts/dfnshelper.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index c4fc350490..74a4a582c8 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -101,4 +101,3 @@ import globalize from 'globalize'; return { getLocale: getLocale }; -}); From f58f54815cca45e1ebc2de5d009bbde7f5b21277 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 2 Apr 2020 23:45:45 +0200 Subject: [PATCH 25/41] Fix ESLint breakage --- src/components/autoFocuser.js | 12 ++++++----- src/components/cardbuilder/cardBuilder.js | 2 ++ src/components/dom.js | 26 ++++++++++++----------- src/components/scrollManager.js | 12 ++++++----- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/components/autoFocuser.js b/src/components/autoFocuser.js index a469eb8854..43c341bfdf 100644 --- a/src/components/autoFocuser.js +++ b/src/components/autoFocuser.js @@ -95,8 +95,10 @@ import layoutManager from "layoutManager"; return focusedElement; } - export default { - isEnabled: isEnabled, - enable: enable, - autoFocus: autoFocus - }; +/* eslint-enable indent */ + +export default { + isEnabled: isEnabled, + enable: enable, + autoFocus: autoFocus +}; diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 1249f802af..3dc328f129 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -1854,6 +1854,8 @@ import 'programStyles'; } } +/* eslint-enable indent */ + export default { getCardsHtml: getCardsHtml, getDefaultBackgroundClass: getDefaultBackgroundClass, diff --git a/src/components/dom.js b/src/components/dom.js index 3fe4287320..a9ce5d53a2 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -262,15 +262,17 @@ return _transitionEvent; } - export default { - parentWithAttribute: parentWithAttribute, - parentWithClass: parentWithClass, - parentWithTag: parentWithTag, - addEventListener: addEventListener, - removeEventListener: removeEventListener, - getWindowSize: getWindowSize, - getScreenWidth: getScreenWidth, - whichTransitionEvent: whichTransitionEvent, - whichAnimationEvent: whichAnimationEvent, - whichAnimationCancelEvent: whichAnimationCancelEvent - }; +/* eslint-enable indent */ + +export default { + parentWithAttribute: parentWithAttribute, + parentWithClass: parentWithClass, + parentWithTag: parentWithTag, + addEventListener: addEventListener, + removeEventListener: removeEventListener, + getWindowSize: getWindowSize, + getScreenWidth: getScreenWidth, + whichTransitionEvent: whichTransitionEvent, + whichAnimationEvent: whichAnimationEvent, + whichAnimationCancelEvent: whichAnimationCancelEvent +}; diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 037ca5b059..6a626cd254 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -544,8 +544,10 @@ import layoutManager from "layoutManager"; }, {capture: true}); } - export default { - isEnabled: isEnabled, - scrollTo: scrollTo, - scrollToElement: scrollToElement - }; +/* eslint-enable indent */ + +export default { + isEnabled: isEnabled, + scrollTo: scrollTo, + scrollToElement: scrollToElement +}; From aeb654f0fb9c66f3502d34ba9aa320802105be49 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 2 Apr 2020 23:46:00 +0200 Subject: [PATCH 26/41] Add more rules to ESLint --- .eslintrc.yml | 20 ++++++-- package.json | 3 ++ yarn.lock | 133 ++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 148 insertions(+), 8 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index f99bc97c63..880315fd12 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -11,6 +11,18 @@ parserOptions: ecmaFeatures: impliedStrict: true +plugins: + - promise + - import + - eslint-comments + +extends: + - eslint:recommended + - plugin:promise/recommended + - plugin:import/errors + - plugin:import/warnings + - plugin:eslint-comments/recommended + globals: # Browser globals MediaMetadata: readonly @@ -49,9 +61,6 @@ globals: UserParentalControlPage: writable Windows: readonly -extends: - - eslint:recommended - rules: block-spacing: ["error"] brace-style: ["error"] @@ -72,3 +81,8 @@ rules: no-redeclare: ["warn"] no-unused-vars: ["warn"] no-useless-escape: ["warn"] + promise/catch-or-return: ["warn"] + promise/always-return: ["warn"] + promise/no-return-wrap: ["warn"] + # TODO: Remove after ES6 migration is complete + import/no-unresolved: ["warn"] diff --git a/package.json b/package.json index c0ff158ec9..6fcd0e8766 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,9 @@ "cssnano": "^4.1.10", "del": "^5.1.0", "eslint": "^6.8.0", + "eslint-plugin-eslint-comments": "^3.1.2", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-promise": "^4.2.1", "file-loader": "^6.0.0", "gulp": "^4.0.2", "gulp-babel": "^8.0.0", diff --git a/yarn.lock b/yarn.lock index 2cfa8f3e8b..4eea6831e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1354,6 +1354,15 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-includes@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" + integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + is-string "^1.0.5" + array-initial@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" @@ -1405,6 +1414,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" + integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" @@ -2665,6 +2682,11 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + content-disposition@0.5.3, content-disposition@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -3099,7 +3121,7 @@ debug-fabulous@1.X: memoizee "0.4.X" object-assign "4.X" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3397,6 +3419,14 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -3758,7 +3788,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -3840,6 +3870,53 @@ escape-string-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +eslint-import-resolver-node@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" + integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== + dependencies: + debug "^2.6.9" + resolve "^1.13.1" + +eslint-module-utils@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" + integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + dependencies: + debug "^2.6.9" + pkg-dir "^2.0.0" + +eslint-plugin-eslint-comments@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.1.2.tgz#4ef6c488dbe06aa1627fea107b3e5d059fc8a395" + integrity sha512-QexaqrNeteFfRTad96W+Vi4Zj1KFbkHHNMMaHZEYcovKav6gdomyGzaxSDSL3GoIyUOo078wRAdYlu1caiauIQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-import@^2.20.2: + version "2.20.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" + integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== + dependencies: + array-includes "^3.0.3" + array.prototype.flat "^1.2.1" + contains-path "^0.1.0" + debug "^2.6.9" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.2" + eslint-module-utils "^2.4.1" + has "^1.0.3" + minimatch "^3.0.4" + object.values "^1.1.0" + read-pkg-up "^2.0.0" + resolve "^1.12.0" + +eslint-plugin-promise@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a" + integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw== + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -4424,7 +4501,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -5644,7 +5721,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.4, ignore@^5.1.1, ignore@^5.1.4: +ignore@^5.0.4, ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== @@ -6247,6 +6324,11 @@ is-stream@^1.0.0, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-supported-regexp-flag@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" @@ -6643,6 +6725,16 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -8294,6 +8386,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -8359,6 +8458,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -9424,6 +9530,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -9450,6 +9564,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -9828,7 +9951,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.4.0: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== From eba46a9576a737900954de04b707604339e1029c Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 3 Apr 2020 00:10:18 +0200 Subject: [PATCH 27/41] Fix wrongly removed replace --- src/controllers/dashboard/plugins/available.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/dashboard/plugins/available.js b/src/controllers/dashboard/plugins/available.js index 166505856e..adccfa3935 100644 --- a/src/controllers/dashboard/plugins/available.js +++ b/src/controllers/dashboard/plugins/available.js @@ -16,7 +16,7 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby } function getHeaderText(category) { - category = category(" ", ""); + category = category.replace(" ", ""); if ("Channel" === category) { category = "Channels"; } else if ("Theme" === category) { From 7fae0fa589c55f2e7a0c616fe4d25d5075094dd9 Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 3 Apr 2020 00:24:50 +0200 Subject: [PATCH 28/41] ES6 for dfnshelper --- package.json | 3 +- src/scripts/dfnshelper.js | 192 ++++++++++++++++++-------------------- 2 files changed, 95 insertions(+), 100 deletions(-) diff --git a/package.json b/package.json index 1446782cc3..3ee18e7653 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,8 @@ "src/components/input/keyboardnavigation.js", "src/components/sanatizefilename.js", "src/scripts/settings/webSettings.js", - "src/components/scrollManager.js" + "src/components/scrollManager.js", + "scripts/dfnshelper.js" ], "plugins": [ "@babel/plugin-transform-modules-amd" diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index 74a4a582c8..3730a01652 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -1,103 +1,97 @@ import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, kk, ko, lt, ms, nb, nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale'; import globalize from 'globalize'; - "use strict"; - - function getLocale() - { - switch (globalize.getCurrentLocale()) { - case 'ar': - return ar; - case 'be-by': - return be; - case 'bg-bg': - return bg; - case 'ca': - return ca; - case 'cs': - return cs; - case 'da': - return da; - case 'de': - return de; - case 'el': - return el; - case 'en-gb': - return enGB; - case 'en-us': - return enUS; - case 'es': - return es; - case 'es-ar': - return es; - case 'es-mx': - return es; - case 'fa': - return faIR; - case 'fi': - return fi; - case 'fr': - return fr; - case 'fr-ca': - return frCA; - case 'gsw': - return de; - case 'he': - return he; - case 'hi-in': - return hi; - case 'hr': - return hr; - case 'hu': - return hu; - case 'id': - return id; - case 'it': - return it; - case 'kk': - return kk; - case 'ko': - return ko; - case 'lt-lt': - return lt; - case 'ms': - return ms; - case 'nb': - return nb; - case 'nl': - return nl; - case 'pl': - return pl; - case 'pt-br': - return ptBR; - case 'pt-pt': - return pt; - case 'ro': - return ro; - case 'ru': - return ru; - case 'sk': - return sk; - case 'sl-si': - return sl; - case 'sv': - return sv; - case 'tr': - return tr; - case 'uk': - return uk; - case 'vi': - return vi; - case 'zh-cn': - return zhCN; - case 'zh-hk': - return zhCN; - case 'zh-tw': - return zhTW; - default: - return enUS; - } +export function getLocale() { + switch (globalize.getCurrentLocale()) { + case 'ar': + return ar; + case 'be-by': + return be; + case 'bg-bg': + return bg; + case 'ca': + return ca; + case 'cs': + return cs; + case 'da': + return da; + case 'de': + return de; + case 'el': + return el; + case 'en-gb': + return enGB; + case 'en-us': + return enUS; + case 'es': + return es; + case 'es-ar': + return es; + case 'es-mx': + return es; + case 'fa': + return faIR; + case 'fi': + return fi; + case 'fr': + return fr; + case 'fr-ca': + return frCA; + case 'gsw': + return de; + case 'he': + return he; + case 'hi-in': + return hi; + case 'hr': + return hr; + case 'hu': + return hu; + case 'id': + return id; + case 'it': + return it; + case 'kk': + return kk; + case 'ko': + return ko; + case 'lt-lt': + return lt; + case 'ms': + return ms; + case 'nb': + return nb; + case 'nl': + return nl; + case 'pl': + return pl; + case 'pt-br': + return ptBR; + case 'pt-pt': + return pt; + case 'ro': + return ro; + case 'ru': + return ru; + case 'sk': + return sk; + case 'sl-si': + return sl; + case 'sv': + return sv; + case 'tr': + return tr; + case 'uk': + return uk; + case 'vi': + return vi; + case 'zh-cn': + return zhCN; + case 'zh-hk': + return zhCN; + case 'zh-tw': + return zhTW; + default: + return enUS; } - return { - getLocale: getLocale - }; +} From 8fb041e9a9657df7a28542d6024bc13d1f22f0ef Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 3 Apr 2020 00:47:04 +0200 Subject: [PATCH 29/41] Fix paths in package.json Co-Authored-By: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ee18e7653..a236ae91fc 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "src/components/sanatizefilename.js", "src/scripts/settings/webSettings.js", "src/components/scrollManager.js", - "scripts/dfnshelper.js" + "src/scripts/dfnshelper.js" ], "plugins": [ "@babel/plugin-transform-modules-amd" From 05e26e6588d87a6ac1520999d891ceed55016a56 Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 3 Apr 2020 20:11:09 +0200 Subject: [PATCH 30/41] Apply suggestions --- src/components/imagedownloader/imagedownloader.js | 2 +- src/controllers/dashboard/dashboard.js | 2 +- src/controllers/dashboard/scheduledtasks/scheduledtasks.js | 6 ++++-- src/controllers/devices.js | 2 +- src/controllers/userprofilespage.js | 2 +- src/scripts/dfnshelper.js | 1 + src/scripts/librarybrowser.js | 2 +- src/strings/en-us.json | 2 +- src/strings/es.json | 2 +- 9 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/components/imagedownloader/imagedownloader.js b/src/components/imagedownloader/imagedownloader.js index 3d08bf2da0..9df083aea2 100644 --- a/src/components/imagedownloader/imagedownloader.js +++ b/src/components/imagedownloader/imagedownloader.js @@ -109,7 +109,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image html += ''; var startAtDisplay = totalRecordCount ? startIndex + 1 : 0; - html += globalize.translate("ListPaging", startAtDisplay + '-' + recordsEnd, totalRecordCount); + html += globalize.translate("ListPaging", startAtDisplay, recordsEnd, totalRecordCount); html += ''; diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 37e9a6155a..78f5cdca01 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -471,7 +471,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences if (!nowPlayingItem) { return { - html: globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), { addSuffix: true, locale: dfnshelper.getLocale() })), + html: globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), dfnshelper.localeWithSuffix)), image: imgUrl }; } diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index f6616bad9d..b91158d8bf 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -66,8 +66,10 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date var html = ""; if (task.State === "Idle") { if (task.LastExecutionResult) { - html += globalize.translate("LabelScheduledTaskLastRan", datefns.formatDistanceToNow(Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: true, locale: dfnshelper.getLocale() }), - datefns.formatDistance(Date.parse(task.LastExecutionResult.StartTimeUtc), Date.parse(task.LastExecutionResult.EndTimeUtc), { addSuffix: false, locale: dfnshelper.getLocale() })); + var endtime = Date.parse(task.LastExecutionResult.EndTimeUtc); + var starttime = Date.parse(task.LastExecutionResult.StartTimeUtc); + html += globalize.translate("LabelScheduledTaskLastRan", datefns.formatDistanceToNow(endtime, dfnshelper.localeWithSuffix), + datefns.formatDistance(starttime, endtime, dfnshelper.localeWithSuffix)); if (task.LastExecutionResult.Status === "Failed") { html += " (" + globalize.translate("LabelFailed") + ")"; } else if (task.LastExecutionResult.Status === "Cancelled") { diff --git a/src/controllers/devices.js b/src/controllers/devices.js index dccece404d..8dd665f7fa 100644 --- a/src/controllers/devices.js +++ b/src/controllers/devices.js @@ -103,7 +103,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "da if (device.LastUserName) { deviceHtml += device.LastUserName; - deviceHtml += ", " + datefns.formatDistanceToNow(Date.parse(device.DateLastActivity), { addSuffix: true, locale: dfnshelper.getLocale() }); + deviceHtml += ", " + datefns.formatDistanceToNow(Date.parse(device.DateLastActivity), dfnshelper.localeWithSuffix); } deviceHtml += " "; diff --git a/src/controllers/userprofilespage.js b/src/controllers/userprofilespage.js index 955b8de521..180d0e62ae 100644 --- a/src/controllers/userprofilespage.js +++ b/src/controllers/userprofilespage.js @@ -129,7 +129,7 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences function getLastSeenText(lastActivityDate) { if (lastActivityDate) { - return globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(lastActivityDate), { addSuffix: true, locale: dfnshelper.getLocale() })); + return globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(lastActivityDate), dfnshelper.localeWithSuffix)); } return ""; diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index 3730a01652..01d032f223 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -95,3 +95,4 @@ export function getLocale() { return enUS; } } +export const localeWithSuffix = { addSuffix: true, locale: getLocale() }; diff --git a/src/scripts/librarybrowser.js b/src/scripts/librarybrowser.js index 9106bdd389..bc8908fe6c 100644 --- a/src/scripts/librarybrowser.js +++ b/src/scripts/librarybrowser.js @@ -83,7 +83,7 @@ define(["userSettings"], function (userSettings) { if (html += '
', showControls) { html += ''; - html += Globalize.translate("ListPaging", (totalRecordCount ? startIndex + 1 : 0) + "-" + recordsEnd, totalRecordCount); + html += Globalize.translate("ListPaging", (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount); html += ""; } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 06eaf3d86a..a1b1bea63a 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1483,7 +1483,7 @@ "Yesterday": "Yesterday", "PathNotFound": "The path could not be found. Please ensure the path is valid and try again.", "WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.", - "ListPaging": "{0} of {1}", + "ListPaging": "{0}-{1} of {2}", "PersonRole": "as {0}", "LastSeen": "Last seen {0}", "DailyAt": "Daily at {0}", diff --git a/src/strings/es.json b/src/strings/es.json index 35bde0b9b3..1870b255aa 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1480,7 +1480,7 @@ "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Usar la información de episodio de los metadatos embebidos si está disponible.", "PathNotFound": "No se encontró la ruta especificada. Asegúrate de que existe e inténtalo de nuevo.", "WriteAccessRequired": "Jellyfin requiere de permisos de escritura en esta carpeta. Asegúrate de que existe este permiso e inténtalo de nuevo.", - "ListPaging": "{0} de {1}", + "ListPaging": "{0}-{1} de {2}", "PersonRole": "como {0}", "LastSeen": "Última vez {0}", "DailyAt": "Diariamente a las {0}", From fd93ce45f7c0ce00308ae860532f0bf9e52781bf Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 3 Apr 2020 20:21:00 +0200 Subject: [PATCH 31/41] Don't concatenate on notifications.js --- src/components/notifications/notifications.js | 8 ++++---- src/strings/en-us.json | 8 ++++---- src/strings/es.json | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index df5552be2e..c8a79a3627 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -173,15 +173,15 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir }; if (status === 'completed') { - notification.title = globalize.translate('PackageInstallCompleted', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('PackageInstallCompleted', installation.Name, installation.Version); notification.vibrate = true; } else if (status === 'cancelled') { - notification.title = globalize.translate('PackageInstallCancelled', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('PackageInstallCancelled', installation.Name, installation.Version); } else if (status === 'failed') { - notification.title = globalize.translate('PackageInstallFailed', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('PackageInstallFailed', installation.Name, installation.Version); notification.vibrate = true; } else if (status === 'progress') { - notification.title = globalize.translate('InstallingPackage', installation.Name + ' ' + installation.Version); + notification.title = globalize.translate('InstallingPackage', installation.Name, installation.Version); notification.actions = [ diff --git a/src/strings/en-us.json b/src/strings/en-us.json index a1b1bea63a..008c8565f9 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -521,7 +521,7 @@ "Images": "Images", "ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.", "ImportMissingEpisodesHelp": "If enabled, information about missing episodes will be imported into your Jellyfin database and displayed within seasons and series. This may cause significantly longer library scans.", - "InstallingPackage": "Installing {0}", + "InstallingPackage": "Installing {0} (version {1})", "InstantMix": "Instant mix", "ItemCount": "{0} items", "Items": "Items", @@ -1210,9 +1210,9 @@ "OriginalAirDateValue": "Original air date: {0}", "OtherArtist": "Other Artist", "Overview": "Overview", - "PackageInstallCancelled": "{0} installation cancelled.", - "PackageInstallCompleted": "{0} installation completed.", - "PackageInstallFailed": "{0} installation failed.", + "PackageInstallCancelled": "{0} (version {1}) installation cancelled.", + "PackageInstallCompleted": "{0} (version {1}) installation completed.", + "PackageInstallFailed": "{0} (version {1}) installation failed.", "ParentalRating": "Parental rating", "PasswordMatchError": "Password and password confirmation must match.", "PasswordResetComplete": "The password has been reset.", diff --git a/src/strings/es.json b/src/strings/es.json index 1870b255aa..727fb24775 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -425,7 +425,7 @@ "Images": "Imágenes", "ImportFavoriteChannelsHelp": "Si está activado, sólo los canales guardados como favoritos en el sintonizador se importarán.", "ImportMissingEpisodesHelp": "Si está activada, la información sobre los episodios que faltan se importará en su base de datos Jellyfin y se mostrará en temporadas y series. Esto puede causar exploraciones de bibliotecas significativamente más largas.", - "InstallingPackage": "Instalando {0}", + "InstallingPackage": "Instalando {0} (versión {1})", "InstantMix": "Mix instantáneo", "ItemCount": "Elementos {0}", "Items": "Elemento", @@ -998,9 +998,9 @@ "OptionWeekly": "Semanal", "OriginalAirDateValue": "Fecha de emisión original: {0}", "Overview": "Sinopsis", - "PackageInstallCancelled": "{0} instalación cancelada.", - "PackageInstallCompleted": "{0} instalación completada.", - "PackageInstallFailed": "{0} instalación fallida.", + "PackageInstallCancelled": "{0} (versión {1}) instalación cancelada.", + "PackageInstallCompleted": "{0} (versión {1}) instalación completada.", + "PackageInstallFailed": "{0} (versión {1}) instalación fallida.", "ParentalRating": "Calificación de los padres", "PasswordMatchError": "La contraseña y la confirmación de la contraseña deben de ser iguales.", "PasswordResetComplete": "La contraseña se ha restablecido.", From 82d019099ff1107c7f4ffd3473d25867db9641b4 Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 3 Apr 2020 20:24:04 +0200 Subject: [PATCH 32/41] Prepare dfnshelper.js for AMD conversion Co-Authored-By: Julien Machiels --- src/scripts/dfnshelper.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index 01d032f223..ada97a14b4 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -95,4 +95,10 @@ export function getLocale() { return enUS; } } + export const localeWithSuffix = { addSuffix: true, locale: getLocale() }; + +export default { + getLocale: getLocale, + localeWithSuffix, localeWithSuffix +} From e734f7c793d413d7586226ba41a96819dd9dbb2f Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 3 Apr 2020 20:55:43 +0200 Subject: [PATCH 33/41] Update src/scripts/dfnshelper.js Co-Authored-By: Dmitry Lyzo <56478732+dmitrylyzo@users.noreply.github.com> --- src/scripts/dfnshelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index ada97a14b4..a593c42c0d 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -100,5 +100,5 @@ export const localeWithSuffix = { addSuffix: true, locale: getLocale() }; export default { getLocale: getLocale, - localeWithSuffix, localeWithSuffix + localeWithSuffix: localeWithSuffix } From 20481f72b36bd83d185c5224dec452c463eea08c Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Fri, 3 Apr 2020 21:32:19 +0200 Subject: [PATCH 34/41] Fix maxTouchPoints --- src/scripts/browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/browser.js b/src/scripts/browser.js index a6402d1393..19153bb19f 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -292,7 +292,7 @@ define([], function () { } if (typeof document !== 'undefined') { - if (('ontouchstart' in window) || (navigator.MaxTouchPoints > 0)) { + if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0)) { browser.touch = true; } } From ceab439361d1baecc406c2f3f7dfbc77b2eb487e Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 3 Apr 2020 23:41:19 +0200 Subject: [PATCH 35/41] Use unused variable as done in #971 --- src/components/itemidentifier/itemidentifier.js | 2 +- src/components/metadataeditor/metadataeditor.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index aff48fa9ca..9f89aef947 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -309,7 +309,7 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", fullName = idInfo.Name + " " + globalize.translate(idInfo.Type); } - var idLabel = globalize.translate("LabelDynamicExternalId", idInfo.Name); + var idLabel = globalize.translate("LabelDynamicExternalId", fullName); html += ''; diff --git a/src/components/metadataeditor/metadataeditor.js b/src/components/metadataeditor/metadataeditor.js index 41bfbba31c..8a64cac7ef 100644 --- a/src/components/metadataeditor/metadataeditor.js +++ b/src/components/metadataeditor/metadataeditor.js @@ -470,7 +470,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi fullName = idInfo.Name + " " + globalize.translate(idInfo.Type); } - var labelText = globalize.translate('LabelDynamicExternalId', idInfo.Name); + var labelText = globalize.translate('LabelDynamicExternalId', fullName); html += '
'; html += '
'; From 81a5ac0476c89588eb1d1169e32b9211e7f9e9d1 Mon Sep 17 00:00:00 2001 From: Gabriel Villar <64br137@vivaldi.net> Date: Sat, 4 Apr 2020 01:45:25 +0000 Subject: [PATCH 36/41] Translated using Weblate (Spanish (Argentina)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_AR/ --- src/strings/es-ar.json | 46 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 6c7ed6f2d4..93dfbbfc0f 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -343,18 +343,18 @@ "EnableBackdrops": "Habilitar fondo", "EnableBackdropsHelp": "Si esta habilitado, los fondos van a ser mostrados en segundo plano de algunas paginas mientras estas en la biblioteca.", "EnableCinemaMode": "Habilitar modo Cine", - "EnableColorCodedBackgrounds": "Habilitar colores en el fondo del codigo", + "EnableColorCodedBackgrounds": "Habilitar colores en el fondo del código", "AuthProviderHelp": "Seleccione un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.", "CriticRating": "Calificación de la crítica", "DefaultSubtitlesHelp": "Los subtítulos se cargan en base a los indicadores por defecto y los indicadores forzados en los metadatos embebidos. Las preferencias de idioma son consideradas cuando existe más de una opción.", "Dislike": "No me gusta", "EnableDebugLoggingHelp": "El registro de depuración debería activarse solo a fin de solucionar problemas. El incremento en el acceso al sistema de archivos podría prevenir que el servidor entre en modo de suspensión en algunos entornos.", "EnableDisplayMirroring": "Habilitar duplicación de la pantalla", - "EnableExternalVideoPlayers": "Habilitar reproductores de vídeo externos", + "EnableExternalVideoPlayers": "Habilitar reproductores de video externos", "EnableExternalVideoPlayersHelp": "Se mostrará un menú de reproductor externo al iniciar la reproducción de video", "EnableNextVideoInfoOverlay": "Habilitar vista de información del siguiente vídeo durante la reproducción", "EnableNextVideoInfoOverlayHelp": "Al finalizar un video, mostrar información sobre el siguiente vídeo en la lista de reproducción", - "EnablePhotos": "Habilitar fotos", + "EnablePhotos": "Mostrar fotos", "EnablePhotosHelp": "Las fotos serán detectadas y se mostrarán junto a otros archivos de medios", "EnableStreamLooping": "Repetir automáticamente transmisiones en vivo", "EnableStreamLoopingHelp": "Habilita esto sí las transmisiones en vivo sólo contienen unos cuantos segundos y es necesario solicitarlos continuamente. Habilitar esto cuando no es necesario puede causar problemas.", @@ -417,5 +417,43 @@ "ButtonAddImage": "Agregar imagen", "AskAdminToCreateLibrary": "Pregunte al administrador para crear una biblioteca.", "AllowFfmpegThrottlingHelp": "Cuando una transcodificación o conversión avanza demasiado con respecto a la posición actual de la reproducción, se pausara el proceso para consumir menos recursos. esto es mas útil cuando no se hacen búsquedas de tiempo a menudo. Desactive esta opción si experimenta problemas en la reproducción.", - "AllowFfmpegThrottling": "Transcodificación Throttle" + "AllowFfmpegThrottling": "Transcodificación Throttle", + "HeaderCancelRecording": "Cancelar Grabación", + "HeaderBranding": "Marca", + "HeaderBooks": "Libros", + "HeaderBlockItemsWithNoRating": "Bloquear elementos con rating de información no reconocible:", + "HeaderAutomaticUpdates": "Actualizaciones Automáticas", + "HeaderAudioSettings": "Configuración del Audio", + "HeaderAudioBooks": "Audiolibros", + "HeaderAppearsOn": "Aparece en", + "HeaderApp": "Aplicación", + "HeaderApiKeysHelp": "Las aplicaciones externas requieren una llave API para poder comunicarse con el servidor Jellyfin. Las llaves se emiten iniciando sesión con una cuenta Jellyfin u otorgando manualmente una clave a la aplicación.", + "HeaderApiKeys": "Llaves API", + "HeaderApiKey": "Llave API", + "HeaderAllowMediaDeletionFrom": "Permitir el borrado de medios desde", + "HeaderAlert": "Alerta", + "HeaderAlbums": "Albumes", + "HeaderAdmin": "Admin", + "HeaderAdditionalParts": "Partes adicionales", + "HeaderAddUpdateImage": "Agregar/Actualizar imagen", + "HeaderAddToPlaylist": "Agregar a la lista de reproducción", + "HeaderAddToCollection": "Agregar a la Colección", + "HeaderAddScheduledTaskTrigger": "Agregar disparador", + "HeaderActivity": "Actividad", + "HeaderActiveRecordings": "Grabaciones activas", + "HeaderActiveDevices": "Dispositivos activos", + "HeaderAccessScheduleHelp": "Crear un calendario de acceso, para limitar el acceso en determinadas horas.", + "HeaderAccessSchedule": "Acceder al Calendario", + "HardwareAccelerationWarning": "Habilitar la aceleración de hardware puede causar inestabilidad en algunos entornos. Asegúrese de que su sistema operativo y los controladores de video estén completamente actualizados. Si tiene dificultades para reproducir el video después de habilitarlo, deberá volver a cambiar la configuración a \"Nada\".", + "HandledByProxy": "Manejado por un proxy reverso", + "HDPrograms": "Programas en HD", + "EncoderPresetHelp": "Elige un valor más rápido para mejorar la performance, o elige un valor más lento para mejorar la calidad.", + "FetchingData": "Obteniendo información adicional", + "Episode": "Episodio", + "Yesterday": "Ayer", + "ClientSettings": "Configuración del cliente", + "BoxSet": "Colección", + "Artist": "Artista", + "AlbumArtist": "Artista del Album", + "Album": "Album" } From b7d02e0380c602094b243c147cd23c23e0ac6525 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sat, 4 Apr 2020 01:33:32 +0000 Subject: [PATCH 37/41] Translated using Weblate (Chinese (Simplified)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 43 ++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index ccd90e05b5..f0d36b2aaa 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -2,31 +2,31 @@ "AccessRestrictedTryAgainLater": "目前访问受限。请稍后再试。", "Actor": "演员", "Add": "添加", - "AddItemToCollectionHelp": "通过搜索并使用鼠标右键单击或点击菜单将项目添加到集合中, 将项目添加到集合中。", - "AddToCollection": "加入收藏", + "AddItemToCollectionHelp": "通过搜索项目并右键或轻触得到的弹出菜单来将项目添加到集合中。", + "AddToCollection": "加入集合", "AddToPlayQueue": "添加至播放队列", - "AddToPlaylist": "添加到播放列表", + "AddToPlaylist": "添加至播放列表", "AddedOnValue": "已添加 {0}", "AdditionalNotificationServices": "浏览插件目录来安装额外的通知访问服务。", "AirDate": "播出日期", - "Aired": "已发布", + "Aired": "已播出", "Albums": "专辑", "Alerts": "警告", "All": "全部", "AllChannels": "所有频道", - "AllComplexFormats": "所有高级特效格式字幕(ASS, SSA, VOBSUB, PGS, SUB/IDX 等)", + "AllComplexFormats": "所有复杂格式字幕 (ASS, SSA, VOBSUB, PGS, SUB, IDX 等)", "AllEpisodes": "所有剧集", "AllLanguages": "所有语言", "AllLibraries": "所有媒体库", "AllowHWTranscodingHelp": "允许调谐器即时转码。这可能有助于减少Jellyfin 媒体服务器的转码工作。", "AllowMediaConversion": "允许媒体转换", - "AllowMediaConversionHelp": "授予或拒绝访问转换媒体功能。", - "AllowOnTheFlySubtitleExtraction": "允许同时提取字幕", + "AllowMediaConversionHelp": "授予或拒绝访问媒体转换功能。", + "AllowOnTheFlySubtitleExtraction": "允许实时提取字幕", "AllowOnTheFlySubtitleExtractionHelp": "为避免视频转码,可以从视频中提取内置的字幕,并以纯文本的形式发送给客户端。在某些系统中这个提取的进程可能会花费较长时间并导致视频播放出现卡顿。如果禁用这个选项,当内置字幕不能被客户端设备原生支持时,字幕将通过视频转码被烧录进视频中。", "AllowRemoteAccess": "允许与此 Jellyfin 服务器进行远程连接。", "AllowRemoteAccessHelp": "如果取消勾选,所有的远程连接将会被阻止。", - "AllowedRemoteAddressesHelp": "将允许远程连接的网络的 ip 地址或 ip/网掩码条目的逗号分隔列表。如果留空, 则允许所有远程地址。", - "AlwaysPlaySubtitles": "总是显示字幕", + "AllowedRemoteAddressesHelp": "允许远程连接的 IP 地址或 IP/子网掩码 的列表,以逗号分隔。如果留空,则允许所有远程地址。", + "AlwaysPlaySubtitles": "总是显示", "AlwaysPlaySubtitlesHelp": "无论音频为何种语言,都将加载与语言偏好匹配的字幕。", "Anytime": "任何时间", "AroundTime": "{0} 左右", @@ -48,7 +48,7 @@ "Books": "书籍", "Browse": "浏览", "BrowsePluginCatalogMessage": "浏览我们的插件目录来查看现有插件。", - "BurnSubtitlesHelp": "根据字幕格式确定服务器在转换视频时是否应压制字幕。避免压制字幕会提高服务器性能。选择“自动”以压制基于图像的字幕格式(如 VOBSUB, PGS, SUB/IDX 等)和一些复杂的 ASS/SSA 字幕。", + "BurnSubtitlesHelp": "服务器在转换视频时是否应压制字幕。避免压制字幕会提高服务器性能。选择“自动”以压制基于图像的字幕格式(如 VOBSUB, PGS, SUB, IDX 等)和一些复杂的 ASS/SSA 字幕。", "ButtonAdd": "添加", "ButtonAddMediaLibrary": "添加媒体库", "ButtonAddScheduledTaskTrigger": "添加触发器", @@ -921,9 +921,9 @@ "Normal": "普通", "NumLocationsValue": "{0} 个文件夹", "OneChannel": "一个频道", - "OnlyForcedSubtitles": "只显示强制字幕", + "OnlyForcedSubtitles": "仅强制字幕", "OnlyForcedSubtitlesHelp": "只有被标记为“强制”的字幕会被加载。", - "OnlyImageFormats": "仅图像格式(VOBSUB, PGS, SUB等)", + "OnlyImageFormats": "仅图像格式(VOBSUB, PGS, SUB 等)", "OptionAdminUsers": "管理员", "OptionAlbum": "专辑", "OptionAlbumArtist": "专辑艺术家", @@ -1334,9 +1334,9 @@ "AuthProviderHelp": "选择用于验证此用户密码的身份验证提供者。", "ColorPrimaries": "基色", "ConfigureDateAdded": "在Jellyfin Server仪表板媒体库的设置里确认如何添加日期", - "DisplayModeHelp": "选择您正在运行Jellyfin的屏幕类型。", + "DisplayModeHelp": "选择您想要的界面布局风格。", "EnableColorCodedBackgrounds": "彩色背景", - "ErrorDeletingItem": "服务器删除项目时出错。请确认服务器具有对媒体文件夹的写入权限并重试。", + "ErrorDeletingItem": "从 Jellyfin Server 删除项目时出错。请确认 Jellyfin Server 是否拥有对媒体目录的写权限,然后重试。", "GroupBySeries": "按系列分组", "HeaderApp": "应用程序", "DirectStreamHelp1": "该媒体文件的分辨率和编码(H.264、AC3 等)与您的设备兼容,但容器格式(.mkv、.avi、.wmv 等)不受支持。因此,视频在串流至您的设备之前将会被即时封装为另一种格式。", @@ -1471,9 +1471,20 @@ "NoCreatedLibraries": "看上去您还未创建任何资料库。{0} 您想现在创建一个吗? {1}", "AskAdminToCreateLibrary": "请联系管理员以创建一个新的资料库。", "PlaybackErrorNoCompatibleStream": "客户端配置文件存在问题,服务器未发送兼容的媒体格式。", - "AllowFfmpegThrottlingHelp": "当转码或再封装的进度大幅超过当前播放位置时,暂停该进程,以使其消耗更少的资源。在观看时不经常调整播放进度的情况下,这将非常有用。如果遇到播放问题,请关闭此功能。", + "AllowFfmpegThrottlingHelp": "当转码或者再封装的进度距离当前播放进度足够远时,暂停这个过程以减少资源消耗。当观看视频时不经常调整播放进度的情况下,这个功能将非常有用。如果你遇到了播放问题,请关闭这个选项。", "AllowFfmpegThrottling": "限制转码速度", "PreferEmbeddedEpisodeInfosOverFileNames": "优先使用内置的剧集信息而不是文件名", "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "这将在内置元数据含剧集信息时使用内置信息。", - "ClientSettings": "客户端设置" + "ClientSettings": "客户端设置", + "Track": "音轨", + "Season": "季", + "ReleaseGroup": "发行组", + "Person": "人物", + "OtherArtist": "其他艺术家", + "Movie": "电影", + "Episode": "剧集", + "BoxSet": "套装", + "Artist": "艺术家", + "AlbumArtist": "专辑艺术家", + "Album": "专辑" } From 9a3dd412f4ba1a98a1feb652e58142caff5f20b9 Mon Sep 17 00:00:00 2001 From: Louis Hermier Date: Sat, 4 Apr 2020 08:35:48 +0000 Subject: [PATCH 38/41] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 77a0c37b2d..d8451dc388 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -476,7 +476,7 @@ "Identify": "Identifier", "ImportFavoriteChannelsHelp": "Activez cette option pour n'importer que les chaînes ajoutées aux favoris sur le tuner.", "ImportMissingEpisodesHelp": "Les informations à propos des épisodes manquants seront importées dans votre base de donnée Jellyfin et affichées dans les saisons et séries. Cela peut accroître significativement la durée d'actualisation de la médiathèque.", - "InstallingPackage": "Installation de {0}", + "InstallingPackage": "Installation de {0} (version {1})", "InstantMix": "Mix instantané", "ItemCount": "{0} éléments", "Items": "Éléments", @@ -1058,7 +1058,7 @@ "OptionReportByteRangeSeekingWhenTranscodingHelp": "Nécessaire pour certains appareils qui ne sont pas capables d'effectuer une recherche dans le temps correctement.", "OptionRequirePerfectSubtitleMatch": "Télécharger uniquement les sous-titres qui correspondent parfaitement à mes fichiers vidéo", "OptionRequirePerfectSubtitleMatchHelp": "En activant cette option, seuls les sous-titres ayant été testés et vérifiés avec votre fichier vidéo seront téléchargés. En désactivant cette option, vous aurez plus de chance que des sous-titres soient téléchargés, mais ils risquent d'être décalés ou incorrects.", - "OptionResElement": "res element", + "OptionResElement": "Résolution d'élément", "OptionResumable": "Reprise possible", "OptionRuntime": "Durée", "OptionSaturday": "Samedi", @@ -1080,9 +1080,9 @@ "OptionWeekly": "Hebdomadaire", "OriginalAirDateValue": "Date de diffusion originale : {0}", "Overview": "Synopsis", - "PackageInstallCancelled": "L'installation de {0} a été annulée.", - "PackageInstallCompleted": "L'installation de {0} est terminée.", - "PackageInstallFailed": "L'installation de {0} a échoué.", + "PackageInstallCancelled": "L'installation de {0} (version {1}) a été annulée.", + "PackageInstallCompleted": "L'installation de {0} (version {1}) est terminée.", + "PackageInstallFailed": "L'installation de {0} (version {1}) a échoué.", "ParentalRating": "Classification parentale", "PasswordMatchError": "Le mot de passe et sa confirmation doivent correspondre.", "PasswordResetComplete": "Le mot de passe a été réinitialisé.", @@ -1482,5 +1482,17 @@ "BoxSet": "Coffret", "Artist": "Artiste", "AlbumArtist": "Artiste de l'Album", - "Album": "Album" + "Album": "Album", + "OnApplicationStartup": "Au démarrage de l'application", + "EveryXHours": "Toutes les {0} heures", + "EveryHour": "Toutes les heures", + "EveryXMinutes": "Toutes les {0} minutes", + "OnWakeFromSleep": "À la sortie de veille", + "WeeklyAt": "{0} à {1}", + "DailyAt": "Tous les jours à {0}", + "LastSeen": "Vu pour la dernière fois {0}", + "PersonRole": "en tant que {0}", + "ListPaging": "{0}-{1} de {2}", + "WriteAccessRequired": "Le serveur Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier l’accès en écriture et réessayez.", + "PathNotFound": "Le chemin d'accès n'a pas pu être trouvé. Merci de le vérifier et de réessayer." } From d3c0bdd2422fb54690586dd2e680e36cbdec7b18 Mon Sep 17 00:00:00 2001 From: Vasily Date: Sat, 4 Apr 2020 14:06:55 +0300 Subject: [PATCH 39/41] Fix attachment delivery urls --- src/components/htmlvideoplayer/plugin.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index 97056f80ff..451b53aefc 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -1048,11 +1048,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function renderSsaAss(videoElement, track, item) { var attachments = self._currentPlayOptions.mediaSource.MediaAttachments || []; + var apiClient = connectionManager.getApiClient(item); var options = { video: videoElement, subUrl: getTextTrackUrl(track, item), fonts: attachments.map(function (i) { - return i.DeliveryUrl; + return apiClient.getUrl(i.DeliveryUrl); }), workerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker.js", legacyWorkerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker-legacy.js", From e031c0f23f449ed1111d10eed63ec311d934374c Mon Sep 17 00:00:00 2001 From: Abderrahmane TAHRI JOUTI Date: Sat, 4 Apr 2020 16:32:48 +0000 Subject: [PATCH 40/41] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index 7fae30a084..524c245cd6 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -919,7 +919,7 @@ "HeaderFavoriteArtists": "الفنانون المفضلون", "Shows": "الحلقات", "Books": "الكتب", - "ValueSpecialEpisodeName": "مميز - {0}", + "ValueSpecialEpisodeName": "خاص - {0}", "HeaderFavoriteAlbums": "الألبومات المفضلة", "HeaderAlbumArtists": "فناني الألبومات", "Genres": "الأنواع", From b8482730f897a5ec53008578470cabf74a1970a9 Mon Sep 17 00:00:00 2001 From: Paul Date: Sat, 4 Apr 2020 16:46:12 +0000 Subject: [PATCH 41/41] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 46 +++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/strings/de.json b/src/strings/de.json index 3dab52c547..2adc5789e3 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -17,7 +17,7 @@ "Albums": "Alben", "All": "Alle", "AllChannels": "Alle Kanäle", - "AllComplexFormats": "Alle komplexen Formate (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)", + "AllComplexFormats": "Alle komplexen Formate (ASS, SSA, VOBSUB, PGS, SUB/IDX)", "AllEpisodes": "Alle Folgen", "AllLanguages": "Alle Sprachen", "AllLibraries": "Alle Bibliotheken", @@ -32,7 +32,7 @@ "AllowSeasonalThemes": "Erlaube automatische Jahreszeitenmotive", "AllowSeasonalThemesHelp": "Wenn aktiviert, werden Jahreszeitenmotive von Zeit zu Zeit deine Motiveinstellungen überschreiben.", "AllowedRemoteAddressesHelp": "Kommagetrennte Liste von IP Adressen oder IP/Netzmasken für Netzwerke, für die externe Verbindungen erlaubt sind. Wenn leer, sind alle Adressen erlaubt.", - "AlwaysPlaySubtitles": "Untertitel immer einblenden", + "AlwaysPlaySubtitles": "Immer anzeigen", "AlwaysPlaySubtitlesHelp": "Untertitel die den Spracheinstellungen entsprechen werden unabhängig von der Tonspursprache geladen.", "AnyLanguage": "Jede Sprache", "Anytime": "Jederzeit", @@ -60,7 +60,7 @@ "BoxRear": "Box (Rückseite)", "Browse": "Blättern", "BrowsePluginCatalogMessage": "Durchsuche unsere Bibliothek, um alle verfügbaren Plugins anzuzeigen.", - "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel basierend auf deren Format während der Videokonvertierung einbrennen soll. Die Vermeidung des Einbrennen von Untertiteln verbessert die Serverperformance. Wähle Auto, um Bildfomate (z.B. VOBSUB, PGS, SUB/IDX, etc.) sowie bestimmte ASS/SSA-Untertitel einbrennen zu lassen.", + "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel während der Videotranskodierung einbrennen soll. Deaktivieren verbessert die Serverperformance immens. Wähle Auto, um bildbasierte Formate (z.B. VOBSUB, PGS, SUB, IDX) sowie bestimmte ASS- oder SSA-Untertitel einbrennen zu lassen.", "ButtonAdd": "Hinzufügen", "ButtonAddMediaLibrary": "Füge Medienbibliothek hinzu", "ButtonAddScheduledTaskTrigger": "Auslöser hinzufügen", @@ -185,7 +185,7 @@ "DisplayInOtherHomeScreenSections": "Zeige auf dem Homescreen Bereiche wie 'Neueste Medien' oder 'Weiterschauen'", "DisplayMissingEpisodesWithinSeasons": "Zeige fehlende Episoden innerhalb von Staffeln", "DisplayMissingEpisodesWithinSeasonsHelp": "Dies muss auch für Serienbibliotheken in den Servereinstellungen aktiviert sein.", - "DisplayModeHelp": "Bitte wähle den Typ des Bildschirms auf dem Du Jellyfin verwendest.", + "DisplayModeHelp": "Wähle das Layout welches du für die Oberfläche verwenden möchtest.", "DoNotRecord": "Nicht aufnehmen", "Down": "Runter", "DownloadsValue": "{0} Downloads", @@ -469,7 +469,7 @@ "Images": "Bilder", "ImportFavoriteChannelsHelp": "Wenn aktiviert, werden nur auf dem Tuner favorisierte Kanäle importiert.", "ImportMissingEpisodesHelp": "Wenn aktiviert, werden Informationen über fehlende Episoden in Deine Jellyfin Datenbank importiert und innerhalb von Staffeln angezeigt. Dies kann zu deutlich längeren Bibliothek Scans führen.", - "InstallingPackage": "Installiere {0}", + "InstallingPackage": "Installiere {0} (Version {1})", "InstantMix": "Schnellmix", "ItemCount": "{0} Einträge", "Items": "Einträge", @@ -908,15 +908,15 @@ "NoNextUpItemsMessage": "Es wurde nichts gefunden. Schau dir deine Shows an!", "NoPluginConfigurationMessage": "Dieses Plugin hat keine konfigurierbaren Einstellungen.", "NoSubtitleSearchResultsFound": "Keine Ergebnisse gefunden.", - "NoSubtitles": "Keine Untertitel", + "NoSubtitles": "Keine", "NoSubtitlesHelp": "Untertitel werden standardmäßig nicht geladen. Sie können aber während der Wiedergabe manuell aktiviert werden.", "None": "Keines", "NumLocationsValue": "{0} Verzeichnisse", "Off": "Aus", "OneChannel": "Ein Kanal", - "OnlyForcedSubtitles": "Nur erzwungene Untertitel", + "OnlyForcedSubtitles": "Nur Erzwungene", "OnlyForcedSubtitlesHelp": "Nur Untertitel, die als erzwungen markiert wurden, werden geladen.", - "OnlyImageFormats": "Nur Bildformate (VOBSUB, PGS, SUB, etc.)", + "OnlyImageFormats": "Nur Bildformate (VOBSUB, PGS, SUB)", "OptionAdminUsers": "Administratoren", "OptionAlbumArtist": "Album-Interpret", "OptionAllUsers": "Alle Benutzer", @@ -1036,9 +1036,9 @@ "OptionWeekly": "Wöchentlich", "OriginalAirDateValue": "Erstausstrahlung: {0}", "Overview": "Übersicht", - "PackageInstallCancelled": "{0} Installation abgebrochen.", - "PackageInstallCompleted": "{0} Installation abgeschlossen.", - "PackageInstallFailed": "{0} Installation fehlgeschlagen.", + "PackageInstallCancelled": "{0} (Version {1}) Installation abgebrochen.", + "PackageInstallCompleted": "{0} (Version {1}) Installation abgeschlossen.", + "PackageInstallFailed": "{0} (Version {1}) Installation fehlgeschlagen.", "ParentalRating": "Altersfreigabe", "PasswordMatchError": "Die Passwörter müssen übereinstimmen.", "PasswordResetComplete": "Das Passwort wurde zurückgesetzt.", @@ -1492,5 +1492,27 @@ "AllowFfmpegThrottling": "Transkodierung drosseln", "PlaybackErrorNoCompatibleStream": "Es gab ein Problem bei der Erkennung des Wiedergabeprofils des Clients und der Server sendet kein kompatibles Format.", "AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden.", - "ClientSettings": "Client Einstellungen" + "ClientSettings": "Client Einstellungen", + "OnApplicationStartup": "Beim Starten der Applikation", + "EveryXHours": "Alle {0} Stunden", + "EveryHour": "Jede Stunde", + "EveryXMinutes": "Alle {0} Minuten", + "OnWakeFromSleep": "Beim Aufwachen aus \"Energie sparen\"", + "WeeklyAt": "{0} um {1}", + "DailyAt": "Täglich um {0}", + "LastSeen": "Zuletzt gesehen {0}", + "PersonRole": "als {0}", + "ListPaging": "{0}-{1} von {2}", + "WriteAccessRequired": "Jellyfin Server benötigt Schreibrechte auf diesem Ordner. Bitte prüfe die Schreibrechte und versuche es erneut.", + "PathNotFound": "Der Pfad konnte nicht gefunden werden. Bitte versichere dich dass der Pfad korrekt ist und versuche es erneut.", + "Track": "Track", + "Season": "Staffel", + "ReleaseGroup": "Veröffentlichungs-Gruppe", + "Person": "Person", + "OtherArtist": "Andere Künstler", + "Movie": "Film", + "Episode": "Episode", + "Artist": "Künstler", + "AlbumArtist": "Album Künstler", + "Album": "Album" }