diff --git a/doc/devdocs/modules/launcher/plugins/timedate.md b/doc/devdocs/modules/launcher/plugins/timedate.md index 0e1a7ea5754c..69c69c716e07 100644 --- a/doc/devdocs/modules/launcher/plugins/timedate.md +++ b/doc/devdocs/modules/launcher/plugins/timedate.md @@ -36,6 +36,7 @@ The following formats are currently available: | Now | 3/5/2022 5:10 PM | x | x | | | Time UTC | 4:10 PM | x | x | | | Now UTC | 3/5/2022 4:10 PM | x | x | | +| Friendly | Yesterday | x | | | | Unix Timestamp | 1646496622 | x | x | | | Unix Timestamp in milliseconds | 1646496622500 | x | x | | | Hour | 10 | x | | | diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs index 0e53d91b15c0..b1d8b8b3feef 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs @@ -62,6 +62,7 @@ public void Setup() [DataRow("iso zone", "ISO 8601 with time zone - ", "Images\\timeDate.dark.png")] [DataRow("iso utc zone", "ISO 8601 UTC with time zone - ", "Images\\timeDate.dark.png")] [DataRow("rfc", "RFC1123 -", "Images\\timeDate.dark.png")] + [DataRow("friendly", "Friendly -", "Images\\timeDate.dark.png")] [DataRow("compatible", "Date and time in filename-compatible format", "Images\\timeDate.dark.png")] public void IconThemeDarkTest(string typedString, string subTitleMatch, string expectedResult) { @@ -109,6 +110,7 @@ public void IconThemeDarkTest(string typedString, string subTitleMatch, string e [DataRow("iso zone", "ISO 8601 with time zone - ", "Images\\timeDate.light.png")] [DataRow("iso utc zone", "ISO 8601 UTC with time zone - ", "Images\\timeDate.light.png")] [DataRow("rfc", "RFC1123 -", "Images\\timeDate.light.png")] + [DataRow("friendly", "Friendly -", "Images\\timeDate.light.png")] [DataRow("compatible", "Date and time in filename-compatible format", "Images\\timeDate.light.png")] public void IconThemeLightTest(string typedString, string subTitleMatch, string expectedResult) { diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs index 2eddc0f1c818..51ec07c009a0 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs @@ -56,9 +56,9 @@ public void CountWithoutPluginKeyword(string typedString, int expectedResultCoun [DataRow("(time", 18)] [DataRow("(date", 28)] [DataRow("(year", 8)] - [DataRow("(now", 34)] - [DataRow("(current", 34)] - [DataRow("(", 34)] + [DataRow("(now", 35)] + [DataRow("(current", 35)] + [DataRow("(", 35)] [DataRow("(now::10:10:10", 1)] // Windows file time [DataRow("(current::10:10:10", 0)] public void CountWithPluginKeyword(string typedString, int expectedResultCount) diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeAndDateHelperTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeAndDateHelperTests.cs index 6ae41d2b229d..517bae387547 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeAndDateHelperTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeAndDateHelperTests.cs @@ -166,6 +166,22 @@ public void GetWeekOfMonth(string date, int week) Assert.AreEqual(result, week); } + [DataTestMethod] + [DataRow("2026-04-07T12:00:00", "2026-04-07T08:00:00", "4 hours ago")] + [DataRow("2026-04-07T12:00:00", "2026-04-07T15:00:00", "in 3 hours")] + [DataRow("2026-04-07T12:00:00", "2026-04-07T12:00:05", "Today")] + [DataRow("2026-04-07T12:00:00", "2026-04-06T12:00:00", "Yesterday")] + [DataRow("2026-04-07T12:00:00", "2026-04-08T12:00:00", "Tomorrow")] + public void FriendlyDateTimeFormats(string now, string target, string expected) + { + DateTime referenceNow = DateTime.Parse(now, CultureInfo.InvariantCulture); + DateTime targetTime = DateTime.Parse(target, CultureInfo.InvariantCulture); + + var result = TimeAndDateHelper.GetFriendlyDateTime(targetTime, referenceNow); + + Assert.AreEqual(expected, result); + } + [TestCleanup] public void CleanUp() { diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs index fccaedb300ea..e1f858b3e142 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs @@ -66,7 +66,7 @@ private DateTime GetDateTimeForTest(bool embedUtc = false) public void LocalFormatsWithShortTimeAndShortDate(string formatLabel, string expectedResult) { // Setup - var helperResults = AvailableResultsList.GetList(true, false, false, GetDateTimeForTest(), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, GetDateTimeForTest(), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); // Act var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); @@ -101,7 +101,7 @@ public void LocalFormatsWithShortTimeAndShortDate(string formatLabel, string exp public void LocalFormatsWithShortTimeAndLongDate(string formatLabel, string expectedResult) { // Setup - var helperResults = AvailableResultsList.GetList(true, false, true, GetDateTimeForTest(), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, true, GetDateTimeForTest(), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); // Act var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); @@ -136,7 +136,7 @@ public void LocalFormatsWithShortTimeAndLongDate(string formatLabel, string expe public void LocalFormatsWithLongTimeAndShortDate(string formatLabel, string expectedResult) { // Setup - var helperResults = AvailableResultsList.GetList(true, true, false, GetDateTimeForTest(), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, true, false, GetDateTimeForTest(), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); // Act var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); @@ -171,7 +171,7 @@ public void LocalFormatsWithLongTimeAndShortDate(string formatLabel, string expe public void LocalFormatsWithLongTimeAndLongDate(string formatLabel, string expectedResult) { // Setup - var helperResults = AvailableResultsList.GetList(true, true, true, GetDateTimeForTest(), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, true, true, GetDateTimeForTest(), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); // Act var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); @@ -190,7 +190,7 @@ public void LocalFormatsWithLongTimeAndLongDate(string formatLabel, string expec public void UtcFormatsWithShortTimeAndShortDate(string formatLabel, string expectedFormat) { // Setup - var helperResults = AvailableResultsList.GetList(true, false, false, GetDateTimeForTest(true), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, GetDateTimeForTest(true), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = GetDateTimeForTest().ToString(expectedFormat, CultureInfo.CurrentCulture); // Act @@ -210,7 +210,7 @@ public void UtcFormatsWithShortTimeAndShortDate(string formatLabel, string expec public void UtcFormatsWithShortTimeAndLongDate(string formatLabel, string expectedFormat) { // Setup - var helperResults = AvailableResultsList.GetList(true, false, true, GetDateTimeForTest(true), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, true, GetDateTimeForTest(true), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = GetDateTimeForTest().ToString(expectedFormat, CultureInfo.CurrentCulture); // Act @@ -230,7 +230,7 @@ public void UtcFormatsWithShortTimeAndLongDate(string formatLabel, string expect public void UtcFormatsWithLongTimeAndShortDate(string formatLabel, string expectedFormat) { // Setup - var helperResults = AvailableResultsList.GetList(true, true, false, GetDateTimeForTest(true), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, true, false, GetDateTimeForTest(true), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = GetDateTimeForTest().ToString(expectedFormat, CultureInfo.CurrentCulture); // Act @@ -250,7 +250,7 @@ public void UtcFormatsWithLongTimeAndShortDate(string formatLabel, string expect public void UtcFormatsWithLongTimeAndLongDate(string formatLabel, string expectedFormat) { // Setup - var helperResults = AvailableResultsList.GetList(true, true, true, GetDateTimeForTest(true), CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, true, true, GetDateTimeForTest(true), now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = GetDateTimeForTest().ToString(expectedFormat, CultureInfo.CurrentCulture); // Act @@ -266,7 +266,7 @@ public void UnixTimestampSecondsFormat() // Setup string formatLabel = "Unix epoch time"; DateTime timeValue = DateTime.Now.ToUniversalTime(); - var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = (long)timeValue.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; // Act @@ -282,7 +282,7 @@ public void UnixTimestampMillisecondsFormat() // Setup string formatLabel = "Unix epoch time in milliseconds"; DateTime timeValue = DateTime.Now.ToUniversalTime(); - var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = (long)timeValue.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds; // Act @@ -298,7 +298,7 @@ public void WindowsFileTimeFormat() // Setup string formatLabel = "Windows file time (Int64 number)"; DateTime timeValue = DateTime.Now; - var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = timeValue.ToFileTime().ToString(CultureInfo.CurrentCulture); // Act @@ -314,7 +314,7 @@ public void ValidateEraResult() // Setup string formatLabel = "Era"; DateTime timeValue = DateTime.Now; - var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = DateTimeFormatInfo.CurrentInfo.GetEraName(CultureInfo.CurrentCulture.Calendar.GetEra(timeValue)); // Act @@ -330,7 +330,7 @@ public void ValidateEraAbbreviationResult() // Setup string formatLabel = "Era abbreviation"; DateTime timeValue = DateTime.Now; - var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, now: null, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); var expectedResult = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedEraName(CultureInfo.CurrentCulture.Calendar.GetEra(timeValue)); // Act @@ -348,7 +348,7 @@ public void DifferentFirstWeekSettingConfigurations(CalendarWeekRule weekRule, s { // Setup DateTime timeValue = new DateTime(2021, 1, 12); - var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, weekRule, DayOfWeek.Sunday); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, now: null, weekRule, DayOfWeek.Sunday); // Act var resultWeekOfYear = helperResults.FirstOrDefault(x => x.Label.Equals("week of the year (calendar week, week number)", StringComparison.OrdinalIgnoreCase)); @@ -369,7 +369,7 @@ public void DifferentFirstDayOfWeekSettingConfigurations(DayOfWeek dayOfWeek, st { // Setup DateTime timeValue = new DateTime(2024, 1, 12); // Friday - var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, CalendarWeekRule.FirstDay, dayOfWeek); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue, now: null, CalendarWeekRule.FirstDay, dayOfWeek); // Act var resultWeekOfYear = helperResults.FirstOrDefault(x => x.Label.Equals("week of the year (calendar week, week number)", StringComparison.OrdinalIgnoreCase)); diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs index 46dcd127df11..ced748cedbf0 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs @@ -20,10 +20,11 @@ internal static class AvailableResultsList /// Required for UnitTest: Show time in long format /// Required for UnitTest: Show date in long format /// Use custom object to calculate results instead of the system date/time + /// Required for UnitTest: Reference "now" time used for relative/friendly formatting /// Required for UnitTest: Use custom first week of the year instead of the plugin setting. /// Required for UnitTest: Use custom first day of the week instead the plugin setting. /// List of results - internal static List GetList(bool isKeywordSearch, bool? timeLongFormat = null, bool? dateLongFormat = null, DateTime? timestamp = null, CalendarWeekRule? firstWeekOfYear = null, DayOfWeek? firstDayOfWeek = null) + internal static List GetList(bool isKeywordSearch, bool? timeLongFormat = null, bool? dateLongFormat = null, DateTime? timestamp = null, DateTime? now = null, CalendarWeekRule? firstWeekOfYear = null, DayOfWeek? firstDayOfWeek = null) { List results = new List(); Calendar calendar = CultureInfo.CurrentCulture.Calendar; @@ -32,6 +33,7 @@ internal static List GetList(bool isKeywordSearch, bool? timeLo bool dateExtended = dateLongFormat ?? TimeDateSettings.Instance.DateWithWeekday; bool isSystemDateTime = timestamp == null; DateTime dateTimeNow = timestamp ?? DateTime.Now; + DateTime dateTimeReferenceNow = now ?? DateTime.Now; DateTime dateTimeNowUtc = dateTimeNow.ToUniversalTime(); CalendarWeekRule firstWeekRule = firstWeekOfYear ?? TimeAndDateHelper.GetCalendarWeekRule(TimeDateSettings.Instance.CalendarFirstWeekRule); DayOfWeek firstDayOfTheWeek = firstDayOfWeek ?? TimeAndDateHelper.GetFirstDayOfWeek(TimeDateSettings.Instance.FirstDayOfWeek); @@ -72,6 +74,14 @@ internal static List GetList(bool isKeywordSearch, bool? timeLo string era = DateTimeFormatInfo.CurrentInfo.GetEraName(calendar.GetEra(dateTimeNow)); string eraShort = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedEraName(calendar.GetEra(dateTimeNow)); + results.Add(new AvailableResult() + { + Value = TimeAndDateHelper.GetFriendlyDateTime(dateTimeNow, dateTimeReferenceNow), + Label = Resources.Microsoft_plugin_timedate_Friendly, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFriendly"), + IconType = ResultIconType.DateTime, + }); + // Custom formats foreach (string f in TimeDateSettings.Instance.CustomFormats) { diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs index 75ffed195859..257264383e9b 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs @@ -417,6 +417,72 @@ internal static DayOfWeek GetFirstDayOfWeek(int pluginSetting) return DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek; } } + + /// + /// Returns a friendly human-readable representation of a timestamp relative to a reference "now". + /// Uses local date boundaries for Today / Yesterday / Tomorrow. + /// + internal static string GetFriendlyDateTime(DateTime target, DateTime referenceNow) + { + // Use local date boundaries. If the input carries UTC kind, convert for comparison/display purposes. + DateTime localTarget = target.Kind == DateTimeKind.Utc ? target.ToLocalTime() : target; + DateTime localNow = referenceNow.Kind == DateTimeKind.Utc ? referenceNow.ToLocalTime() : referenceNow; + + int dayDiff = (localTarget.Date - localNow.Date).Days; + if (dayDiff == 0) + { + return Resources.Microsoft_plugin_timedate_Friendly_Today; + } + + if (dayDiff == -1) + { + return Resources.Microsoft_plugin_timedate_Friendly_Yesterday; + } + + if (dayDiff == 1) + { + return Resources.Microsoft_plugin_timedate_Friendly_Tomorrow; + } + + TimeSpan span = localTarget - localNow; + bool isFuture = span.Ticks > 0; + TimeSpan abs = span.Duration(); + + if (abs.TotalSeconds < 10) + { + return Resources.Microsoft_plugin_timedate_Friendly_JustNow; + } + + if (abs.TotalMinutes < 60) + { + int minutes = (int)Math.Round(abs.TotalMinutes, MidpointRounding.AwayFromZero); + if (minutes <= 1) + { + return isFuture ? Resources.Microsoft_plugin_timedate_Friendly_InMinute : Resources.Microsoft_plugin_timedate_Friendly_MinuteAgo; + } + + return string.Format(CultureInfo.CurrentCulture, isFuture ? Resources.Microsoft_plugin_timedate_Friendly_InMinutes : Resources.Microsoft_plugin_timedate_Friendly_MinutesAgo, minutes); + } + + if (abs.TotalHours < 24) + { + int hours = (int)Math.Round(abs.TotalHours, MidpointRounding.AwayFromZero); + if (hours <= 1) + { + return isFuture ? Resources.Microsoft_plugin_timedate_Friendly_InHour : Resources.Microsoft_plugin_timedate_Friendly_HourAgo; + } + + return string.Format(CultureInfo.CurrentCulture, isFuture ? Resources.Microsoft_plugin_timedate_Friendly_InHours : Resources.Microsoft_plugin_timedate_Friendly_HoursAgo, hours); + } + + int days = (int)Math.Round(abs.TotalDays, MidpointRounding.AwayFromZero); + if (days <= 1) + { + return isFuture ? Resources.Microsoft_plugin_timedate_Friendly_InDay : Resources.Microsoft_plugin_timedate_Friendly_DayAgo; + } + + return string.Format(CultureInfo.CurrentCulture, isFuture ? Resources.Microsoft_plugin_timedate_Friendly_InDays : Resources.Microsoft_plugin_timedate_Friendly_DaysAgo, days); + } } /// diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs index b3016d9821fb..609649ea06fc 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs @@ -122,6 +122,159 @@ internal static string Microsoft_plugin_timedate_DayMonth { return ResourceManager.GetString("Microsoft_plugin_timedate_DayMonth", resourceCulture); } } + + /// + /// Looks up a localized string similar to Friendly. + /// + internal static string Microsoft_plugin_timedate_Friendly { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1 day ago. + /// + internal static string Microsoft_plugin_timedate_Friendly_DayAgo { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_DayAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} days ago. + /// + internal static string Microsoft_plugin_timedate_Friendly_DaysAgo { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_DaysAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1 hour ago. + /// + internal static string Microsoft_plugin_timedate_Friendly_HourAgo { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_HourAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} hours ago. + /// + internal static string Microsoft_plugin_timedate_Friendly_HoursAgo { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_HoursAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to in 1 day. + /// + internal static string Microsoft_plugin_timedate_Friendly_InDay { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_InDay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to in {0} days. + /// + internal static string Microsoft_plugin_timedate_Friendly_InDays { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_InDays", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to in 1 hour. + /// + internal static string Microsoft_plugin_timedate_Friendly_InHour { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_InHour", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to in {0} hours. + /// + internal static string Microsoft_plugin_timedate_Friendly_InHours { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_InHours", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to in 1 minute. + /// + internal static string Microsoft_plugin_timedate_Friendly_InMinute { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_InMinute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to in {0} minutes. + /// + internal static string Microsoft_plugin_timedate_Friendly_InMinutes { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_InMinutes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to just now. + /// + internal static string Microsoft_plugin_timedate_Friendly_JustNow { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_JustNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1 minute ago. + /// + internal static string Microsoft_plugin_timedate_Friendly_MinuteAgo { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_MinuteAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} minutes ago. + /// + internal static string Microsoft_plugin_timedate_Friendly_MinutesAgo { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_MinutesAgo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Today. + /// + internal static string Microsoft_plugin_timedate_Friendly_Today { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_Today", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tomorrow. + /// + internal static string Microsoft_plugin_timedate_Friendly_Tomorrow { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_Tomorrow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yesterday. + /// + internal static string Microsoft_plugin_timedate_Friendly_Yesterday { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Friendly_Yesterday", resourceCulture); + } + } /// /// Looks up a localized string similar to Day of the month. @@ -554,6 +707,15 @@ internal static string Microsoft_plugin_timedate_SearchTagFormat { return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagFormat", resourceCulture); } } + + /// + /// Looks up a localized string similar to friendly; relative; ago; yesterday; today; tomorrow. + /// + internal static string Microsoft_plugin_timedate_SearchTagFriendly { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagFriendly", resourceCulture); + } + } /// /// Looks up a localized string similar to Current date and time; Current time and date; Now. diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx index 84d81c1b96f5..8e1f556cd6cf 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx @@ -140,6 +140,57 @@ Month and day + + Friendly + + + Today + + + Yesterday + + + Tomorrow + + + just now + + + 1 minute ago + + + {0} minutes ago + + + in 1 minute + + + in {0} minutes + + + 1 hour ago + + + {0} hours ago + + + in 1 hour + + + in {0} hours + + + 1 day ago + + + {0} days ago + + + in 1 day + + + in {0} days + Day of the month @@ -246,6 +297,10 @@ Date and time; Time and Date Don't change order + + friendly; relative; ago; yesterday; today; tomorrow + Don't change order + Date and time; Time and Date; Custom format Don't change order