diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart
index ed7b8c3de..31e051123 100644
--- a/lib/generated/intl/messages_en.dart
+++ b/lib/generated/intl/messages_en.dart
@@ -180,6 +180,9 @@ class MessageLookup extends MessageLookupByLibrary {
static String m37(email) => "This is ${email}\'s Verification ID";
+ static String m62(count) =>
+ "${Intl.plural(count, zero: '', one: '1 day', other: '${count} days')}";
+
static String m38(email) => "Verify ${email}";
static String m39(email) => "We have sent a mail to ${email}";
@@ -1151,6 +1154,7 @@ class MessageLookup extends MessageLookupByLibrary {
"total": MessageLookupByLibrary.simpleMessage("total"),
"totalSize": MessageLookupByLibrary.simpleMessage("Total size"),
"trash": MessageLookupByLibrary.simpleMessage("Trash"),
+ "trashDaysLeft": m62,
"tryAgain": MessageLookupByLibrary.simpleMessage("Try again"),
"turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage(
"Turn on backup to automatically upload files added to this device folder to ente."),
diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart
index 13d1c3467..6e22e786f 100644
--- a/lib/generated/l10n.dart
+++ b/lib/generated/l10n.dart
@@ -5199,6 +5199,20 @@ class S {
);
}
+ /// `{count, plural, =0 {} =1 {1 day} other {{count} days}}`
+ String trashDaysLeft(int count) {
+ return Intl.plural(
+ count,
+ zero: '',
+ one: '1 day',
+ other: '$count days',
+ name: 'trashDaysLeft',
+ desc:
+ 'Text to indicate number of days remaining before permanent deletion',
+ args: [count],
+ );
+ }
+
/// `Delete All`
String get deleteAll {
return Intl.message(
diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb
index 7ddca5cfb..06660d33f 100644
--- a/lib/l10n/intl_en.arb
+++ b/lib/l10n/intl_en.arb
@@ -736,6 +736,16 @@
"referFriendsAnd2xYourPlan": "Refer friends and 2x your plan",
"shareAlbumHint": "Open an album and tap the share button on the top right to share.",
"itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": "Items show the number of days remaining before permanent deletion",
+ "trashDaysLeft": "{count, plural, =0 {} =1 {1 day} other {{count} days}}",
+ "@trashDaysLeft": {
+ "description": "Text to indicate number of days remaining before permanent deletion",
+ "placeholders": {
+ "count": {
+ "example": "1|2|3",
+ "type": "int"
+ }
+ }
+ },
"deleteAll": "Delete All",
"renameAlbum": "Rename album",
"rename": "Rename",
diff --git a/lib/ui/account/sessions_page.dart b/lib/ui/account/sessions_page.dart
index 820bc8f44..b34fca071 100644
--- a/lib/ui/account/sessions_page.dart
+++ b/lib/ui/account/sessions_page.dart
@@ -6,7 +6,7 @@ import "package:photos/generated/l10n.dart";
import 'package:photos/models/sessions.dart';
import 'package:photos/services/user_service.dart';
import 'package:photos/ui/common/loading_widget.dart';
-import 'package:photos/utils/date_time_util.dart';
+import "package:photos/utils/date_time_util.dart";
import 'package:photos/utils/dialog_util.dart';
import 'package:photos/utils/toast_util.dart';
@@ -90,7 +90,7 @@ class _SessionsPageState extends State {
const Padding(padding: EdgeInsets.all(8)),
Flexible(
child: Text(
- getFormattedTime(lastUsedTime),
+ getFormattedTime(context, lastUsedTime),
style: TextStyle(
color: Theme.of(context)
.colorScheme
diff --git a/lib/ui/home/memories/full_screen_memory.dart b/lib/ui/home/memories/full_screen_memory.dart
index b032ec223..770648de5 100644
--- a/lib/ui/home/memories/full_screen_memory.dart
+++ b/lib/ui/home/memories/full_screen_memory.dart
@@ -2,13 +2,13 @@ import "dart:io";
import "package:flutter/cupertino.dart";
import "package:flutter/material.dart";
+import "package:intl/intl.dart";
import "package:photos/models/memory.dart";
import "package:photos/services/memories_service.dart";
import "package:photos/theme/text_style.dart";
import "package:photos/ui/actions/file/file_actions.dart";
import "package:photos/ui/extents_page_view.dart";
import "package:photos/ui/viewer/file/file_widget.dart";
-import "package:photos/utils/date_time_util.dart";
import "package:photos/utils/file_util.dart";
import "package:photos/utils/share_util.dart";
import "package:step_progress_indicator/step_progress_indicator.dart";
@@ -89,8 +89,11 @@ class _FullScreenMemoryState extends State {
),
),
Text(
- getFormattedDate(
- DateTime.fromMicrosecondsSinceEpoch(file.creationTime!),
+ DateFormat.yMMMd(Localizations.localeOf(context).languageCode)
+ .format(
+ DateTime.fromMicrosecondsSinceEpoch(
+ file.creationTime!,
+ ),
),
style: Theme.of(context).textTheme.subtitle1!.copyWith(
fontSize: 14,
diff --git a/lib/ui/sharing/manage_links_widget.dart b/lib/ui/sharing/manage_links_widget.dart
index 4f147c0fa..73c3d0818 100644
--- a/lib/ui/sharing/manage_links_widget.dart
+++ b/lib/ui/sharing/manage_links_widget.dart
@@ -116,6 +116,7 @@ class _ManageSharedLinkWidgetState extends State {
? S.of(context).expiredLinkInfo
: S.of(context).linkExpiresOn(
getFormattedTime(
+ context,
DateTime.fromMicrosecondsSinceEpoch(
url.validTill,
),
diff --git a/lib/ui/viewer/file/file_icons_widget.dart b/lib/ui/viewer/file/file_icons_widget.dart
index 11ec540c5..efdfb0a84 100644
--- a/lib/ui/viewer/file/file_icons_widget.dart
+++ b/lib/ui/viewer/file/file_icons_widget.dart
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:photos/ente_theme_data.dart';
+import "package:photos/generated/l10n.dart";
import 'package:photos/models/collection.dart';
import 'package:photos/models/trash_file.dart';
import 'package:photos/theme/colors.dart';
import 'package:photos/ui/sharing/user_avator_widget.dart';
-import 'package:photos/utils/date_time_util.dart';
class ThumbnailPlaceHolder extends StatelessWidget {
const ThumbnailPlaceHolder({Key? key}) : super(key: key);
@@ -135,6 +135,10 @@ class TrashedFileOverlayText extends StatelessWidget {
@override
Widget build(BuildContext context) {
+ final int daysLeft =
+ ((file.deleteBy - DateTime.now().microsecondsSinceEpoch) /
+ Duration.microsecondsPerDay)
+ .ceil();
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
@@ -146,7 +150,7 @@ class TrashedFileOverlayText extends StatelessWidget {
alignment: Alignment.bottomCenter,
padding: const EdgeInsets.only(bottom: 5),
child: Text(
- daysLeft(file.deleteBy),
+ S.of(context).trashDaysLeft(daysLeft),
style: Theme.of(context)
.textTheme
.subtitle2!
diff --git a/lib/ui/viewer/gallery/component/gallery_list_view_widget.dart b/lib/ui/viewer/gallery/component/gallery_list_view_widget.dart
index 86b286152..75f6f2624 100644
--- a/lib/ui/viewer/gallery/component/gallery_list_view_widget.dart
+++ b/lib/ui/viewer/gallery/component/gallery_list_view_widget.dart
@@ -1,4 +1,5 @@
import "package:flutter/material.dart";
+import "package:intl/intl.dart";
import "package:logging/logging.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/ente_theme_data.dart";
@@ -9,7 +10,6 @@ import "package:photos/ui/common/loading_widget.dart";
import "package:photos/ui/huge_listview/huge_listview.dart";
import "package:photos/ui/viewer/gallery/component/lazy_loading_gallery.dart";
import "package:photos/ui/viewer/gallery/gallery.dart";
-import "package:photos/utils/date_time_util.dart";
import "package:photos/utils/local_settings.dart";
import "package:scrollable_positioned_list/scrollable_positioned_list.dart";
@@ -112,7 +112,8 @@ class GalleryListView extends StatelessWidget {
},
labelTextBuilder: (int index) {
try {
- return getMonthAndYear(
+ return DateFormat.yMMM(Localizations.localeOf(context).languageCode)
+ .format(
DateTime.fromMicrosecondsSinceEpoch(
collatedFiles[index][0].creationTime!,
),
diff --git a/lib/utils/date_time_util.dart b/lib/utils/date_time_util.dart
index d6a99fc43..ce510398b 100644
--- a/lib/utils/date_time_util.dart
+++ b/lib/utils/date_time_util.dart
@@ -1,3 +1,4 @@
+import "package:flutter/cupertino.dart";
import 'package:flutter/foundation.dart';
import 'package:intl/intl.dart';
@@ -18,45 +19,9 @@ Map _months = {
12: "Dec",
};
-Map _fullMonths = {
- 1: "January",
- 2: "February",
- 3: "March",
- 4: "April",
- 5: "May",
- 6: "June",
- 7: "July",
- 8: "August",
- 9: "September",
- 10: "October",
- 11: "November",
- 12: "December",
-};
-
-Map _days = {
- 1: "Mon",
- 2: "Tue",
- 3: "Wed",
- 4: "Thu",
- 5: "Fri",
- 6: "Sat",
- 7: "Sun",
-};
-
final currentYear = DateTime.now().year;
const searchStartYear = 1970;
-//Jun 2022
-String getMonthAndYear(DateTime dateTime) {
- return _months[dateTime.month]! + " " + dateTime.year.toString();
-}
-
-int daysBetween(DateTime from, DateTime to) {
- from = DateTime(from.year, from.month, from.day);
- to = DateTime(to.year, to.month, to.day);
- return (to.difference(from).inHours / 24).round();
-}
-
bool areFromSameDay(int firstCreationTime, int secondCreationTime) {
final firstDate = DateTime.fromMicrosecondsSinceEpoch(firstCreationTime);
final secondDate = DateTime.fromMicrosecondsSinceEpoch(secondCreationTime);
@@ -91,65 +56,19 @@ String getNameForDateRange(int firstCreationTime, int secondCreationTime) {
return "${_months[endTime.month]!} ${endTime.day}, ${endTime.year}";
}
-String getDay(DateTime dateTime) {
- return _days[dateTime.weekday]!;
-}
-
-String getMonth(DateTime dateTime) {
- return _months[dateTime.month]!;
-}
-
-String getFullMonth(DateTime dateTime) {
- return _fullMonths[dateTime.month]!;
-}
-
-String getAbbreviationOfYear(DateTime dateTime) {
- return (dateTime.year % 100).toString();
-}
-
-//14:32
-String getTime(DateTime dateTime) {
- final hours = dateTime.hour > 9
- ? dateTime.hour.toString()
- : "0" + dateTime.hour.toString();
- final minutes = dateTime.minute > 9
- ? dateTime.minute.toString()
- : "0" + dateTime.minute.toString();
- return hours + ":" + minutes;
-}
-
//11:22 AM
String getTimeIn12hrFormat(DateTime dateTime) {
return DateFormat.jm().format(dateTime);
}
//Thu, Jun 30, 2022 - 14:32
-String getFormattedTime(DateTime dateTime) {
- return getDay(dateTime) +
- ", " +
- getMonth(dateTime) +
- " " +
- dateTime.day.toString() +
- ", " +
- dateTime.year.toString() +
- " - " +
- getTime(dateTime);
-}
-
-//30 Jun'22
-String getFormattedDate(DateTime dateTime) {
- return dateTime.day.toString() +
- " " +
- getMonth(dateTime) +
- "'" +
- getAbbreviationOfYear(dateTime);
-}
-
-String daysLeft(int futureTime) {
- final int daysLeft = ((futureTime - DateTime.now().microsecondsSinceEpoch) /
- Duration.microsecondsPerDay)
- .ceil();
- return '$daysLeft day' + (daysLeft <= 1 ? "" : "s");
+String getFormattedTime(BuildContext context, DateTime dateTime) {
+ return DateFormat(
+ 'E, MMM d, y - HH:mm',
+ Localizations.localeOf(context).languageCode,
+ ).format(
+ dateTime,
+ );
}
String formatDuration(Duration position) {
@@ -185,23 +104,6 @@ String formatDuration(Duration position) {
return formattedTime;
}
-bool isLeapYear(DateTime dateTime) {
- final year = dateTime.year;
- if (year % 4 == 0) {
- if (year % 100 == 0) {
- if (year % 400 == 0) {
- return true;
- } else {
- return false;
- }
- } else {
- return true;
- }
- } else {
- return false;
- }
-}
-
String secondsToHHMMSS(int value) {
int h, m, s;
h = value ~/ 3600;