From d791da07e39240696e57463466a681cafcb9ba49 Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 19 Mar 2020 00:17:51 +0100 Subject: [PATCH 01/29] 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 b71f7bbb0..db53f0a39 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 62e8fa3f8..784fa7c7a 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 3d56ff56d..442459c9e 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/29] 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 ce53b5cf0..947a50135 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 bd8980aed..a570558f4 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 784fa7c7a..f3e7756f5 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 442459c9e..138d19f86 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/29] 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 947a50135..a1c17646f 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 a570558f4..9106bdd38 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/29] 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 db53f0a39..1d5c23eb1 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 6f28de0b3..b1aea7ce1 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 e8736258f..a262a948b 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 2c3e45b63..df5552be2 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 72a7134fa..a05cac461 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 5526bd9ad..166505856 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 026b58ce6..c381b2409 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 390fd1735..e21d4c23f 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 fb4cdb425..ca0d3afdb 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 82569835c..835253ee1 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 7e19af4b9..98e087147 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/29] 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 90cfa954a..ae50f65b9 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 8dee67256..5b9f8aa45 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/29] 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 7f562f1fd..a6ee8fab6 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 f3e7756f5..5e5984b34 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 138d19f86..58ca9d623 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/29] 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 5e1a2ab3e..dc2402d13 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 e21d4c23f..5f437cc47 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 fca501147..d29da5cf3 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/29] 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 2138e51f0..1446782cc 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 5f437cc47..133e6247d 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 000000000..f31761345 --- /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 4285137f1..0a65cf1a6 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 ddf631191..e35d29cc4 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 6410d0783..d4be1ef5e 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/29] 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 2057deaf6..922ec763c 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 133e6247d..f6616bad9 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 3fd2be983..dccece404 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 f31761345..0efc6aa6f 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 3787f3025..79e8feb8d 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 e35d29cc4..7439138b7 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/29] 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 922ec763c..a7caa7a9f 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/29] 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 a7caa7a9f..37e9a6155 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/29] 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 26ce26d94..000000000 --- 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 2a2387ab6..d7ffeedeb 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 0a65cf1a6..5eb3c2a34 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/29] 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 377716d53..48035e186 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/29] 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 d7ffeedeb..955b8de52 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/29] Remove unused lint rule --- .eslintrc.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 48035e186..bd2f95909 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 95e13ca4884f4f3a9b466d44c01e2462b9a5766a Mon Sep 17 00:00:00 2001 From: ferferga Date: Thu, 2 Apr 2020 20:35:33 +0200 Subject: [PATCH 16/29] 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 05971f01b..934a610ad 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 17/29] 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 03eeeeb87..1f156982f 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 79e8feb8d..126ce74b4 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 7439138b7..35bde0b9b 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 18/29] 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 1f156982f..8a3cdf5d6 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 19/29] 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 0efc6aa6f..6f4ef6d39 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 20/29] 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 6f4ef6d39..c4fc35049 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 21/29] 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 c4fc35049..74a4a582c 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -101,4 +101,3 @@ import globalize from 'globalize'; return { getLocale: getLocale }; -}); From eba46a9576a737900954de04b707604339e1029c Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 3 Apr 2020 00:10:18 +0200 Subject: [PATCH 22/29] 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 166505856..adccfa393 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 23/29] 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 1446782cc..3ee18e765 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 74a4a582c..3730a0165 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 24/29] 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 3ee18e765..a236ae91f 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 25/29] 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 3d08bf2da..9df083aea 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 37e9a6155..78f5cdca0 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 f6616bad9..b91158d8b 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 dccece404..8dd665f7f 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 955b8de52..180d0e62a 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 3730a0165..01d032f22 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 9106bdd38..bc8908fe6 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 06eaf3d86..a1b1bea63 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 35bde0b9b..1870b255a 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 26/29] 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 df5552be2..c8a79a362 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 a1b1bea63..008c8565f 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 1870b255a..727fb2477 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 27/29] 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 01d032f22..ada97a14b 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 28/29] 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 ada97a14b..a593c42c0 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 ceab439361d1baecc406c2f3f7dfbc77b2eb487e Mon Sep 17 00:00:00 2001 From: ferferga Date: Fri, 3 Apr 2020 23:41:19 +0200 Subject: [PATCH 29/29] 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 aff48fa9c..9f89aef94 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 41bfbba31..8a64cac7e 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 += '
';