Skip to content

Commit 9934e14

Browse files
authored
Merge pull request #23 from sadespresso/master
Time Range localization attempt, beta 0
2 parents 15cf65b + c9bd249 commit 9934e14

19 files changed

+453
-64
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 2.2.1+beta.0
2+
3+
- Added `TimeRange` readable format.
4+
- Fixed German (de_DE) full abbreviations were in English
5+
- Added `DateTime.isMidnight` helper
6+
17
## 2.2.0
28

39
- Fixed `.endOf(DurationUnit.week)` was incorrectly returning 7 days ahead [#19](https://github.com/sadespresso/moment_dart/issues/19)

lib/src/extensions/benefits.dart

+3
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,9 @@ extension MomentBenefits on DateTime {
199199
isUtc,
200200
);
201201

202+
/// Whether it rquals [date]
203+
bool get isMidnight => date == this;
204+
202205
Moment toMoment({MomentLocalization? localization}) =>
203206
Moment(this, localization: localization);
204207

lib/src/localization.dart

+46
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,52 @@ abstract class MomentLocalization {
169169
);
170170
}
171171

172+
/// [useRelative] - When set to [true], returns relative strings whenever
173+
/// possible. For example, in en_US, "This week", "This month", "This year"
174+
/// whenever possible. Some localizations may not support relative, or non-relative
175+
/// in some cases.
176+
String range(TimeRange range, {DateTime? anchor, bool useRelative = true}) {
177+
final Moment from = range.from.toMoment(localization: this);
178+
final Moment to = range.to.toMoment(localization: this);
179+
180+
if (range is HourTimeRange) {
181+
return "${from.LT} - ${to.LT}, ${from.calendar(omitHours: true, reference: anchor)}";
182+
} else if (range is DayTimeRange) {
183+
return useRelative
184+
? from.calendar(omitHours: true, reference: anchor)
185+
: from.ll;
186+
} else if (range is LocalWeekTimeRange || range is IsoWeekTimeRange) {
187+
return useRelative
188+
? "${from.calendar(omitHours: true, reference: anchor)} - ${to.calendar(omitHours: true, reference: anchor)}"
189+
: "${from.ll} - ${to.ll}";
190+
} else if (range is MonthTimeRange) {
191+
return from.format("MMMM yyyy");
192+
} else if (range is YearTimeRange) {
193+
return from.format("YYYY");
194+
}
195+
196+
// CustomTimeRange or any other
197+
198+
final bool startless = range.from == Moment.minValue;
199+
final bool endless = range.to == Moment.maxValue;
200+
201+
if (startless && endless) {
202+
return "♾️";
203+
}
204+
205+
if (startless) {
206+
return "<= ${to.calendar(omitHours: to.isMidnight, reference: anchor)}";
207+
}
208+
209+
if (endless) {
210+
return ">= ${from.calendar(omitHours: from.isMidnight, reference: anchor)}";
211+
}
212+
213+
final bool omitHours = from.isMidnight && to.isMidnight;
214+
215+
return "${from.calendar(omitHours: omitHours, reference: anchor)} - ${to.calendar(omitHours: omitHours, reference: anchor)}";
216+
}
217+
172218
final FormatSetOptional defaultFormatters = {
173219
FormatterToken.M: (dateTime) => dateTime.month.toString(),
174220
FormatterToken.MM: (dateTime) => dateTime.month.toString().padLeft(2, '0'),

lib/src/localizations/de_DE.dart

+35-16
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:moment_dart/src/localizations/mixins/de_DE/units.dart';
55
import 'package:moment_dart/src/localizations/mixins/month_names.dart';
66
import 'package:moment_dart/src/localizations/mixins/ordinal_numbers.dart';
77
import 'package:moment_dart/src/localizations/mixins/simple_duration.dart';
8+
import 'package:moment_dart/src/localizations/mixins/simple_range.dart';
89
import 'package:moment_dart/src/localizations/mixins/simple_relative.dart';
910
import 'package:moment_dart/src/localizations/mixins/simple_units.dart';
1011
import 'package:moment_dart/src/localization.dart';
@@ -13,7 +14,13 @@ import 'package:moment_dart/src/types.dart';
1314
/// Language: German
1415
/// Country: Germany
1516
class LocalizationDeDe extends MomentLocalization
16-
with Ordinal, MonthNames, SimpleUnits, SimpleRelative, SimpleDuration {
17+
with
18+
Ordinal,
19+
MonthNames,
20+
SimpleUnits,
21+
SimpleRelative,
22+
SimpleDuration,
23+
SimpleRange {
1724
static LocalizationDeDe? _instance;
1825

1926
LocalizationDeDe._internal() : super();
@@ -150,82 +157,94 @@ class LocalizationDeDe extends MomentLocalization
150157
DurationInterval.aSecond: UnitStringDeDe(
151158
"einer Sekunde",
152159
"1 Sek.",
153-
"1s",
160+
"1 Sek.",
154161
standalone: "eine Sekunde",
155162
),
156163
DurationInterval.seconds: UnitStringDeDe(
157164
"$srDelta Sekunden",
158165
"$srDelta Sek.",
159-
"${srDelta}s",
166+
"$srDelta Sek.",
160167
),
161168
DurationInterval.aMinute: UnitStringDeDe(
162169
"einer Minute",
163170
"1 Min.",
164-
"1m",
171+
"1 Min.",
165172
standalone: "eine Minute",
166173
),
167174
DurationInterval.minutes: UnitStringDeDe(
168175
"$srDelta Minuten",
169176
"$srDelta Min.",
170-
"${srDelta}m",
177+
"$srDelta Min.",
171178
),
172179
DurationInterval.anHour: UnitStringDeDe(
173180
"einer Stunde",
174181
"1 Std.",
175-
"1h",
182+
"1 Std.",
176183
standalone: "eine Stunde",
177184
),
178185
DurationInterval.hours: UnitStringDeDe(
179186
"$srDelta Stunden",
180187
"$srDelta Std.",
181-
"${srDelta}h",
188+
"$srDelta Std.",
182189
),
183190
DurationInterval.aDay: UnitStringDeDe(
184191
"einem Tag",
185-
"einem Tg.",
186-
"1d",
192+
"1 Tg.",
193+
"1 T.",
187194
standalone: "ein Tag",
188195
),
189196
DurationInterval.days: UnitStringDeDe(
190197
"$srDelta Tagen",
191198
"$srDelta Tg.",
192-
"${srDelta}d",
199+
"$srDelta T.",
193200
standalone: "$srDelta Tage",
194201
),
195202
DurationInterval.aWeek: UnitStringDeDe(
196203
"einer Woche",
197204
"1 Woche",
198-
"1w",
205+
"1 W.",
199206
standalone: "eine Woche",
200207
),
201208
DurationInterval.weeks: UnitStringDeDe(
202209
"$srDelta Wochen",
203210
"$srDelta Wochen",
204-
"${srDelta}w",
211+
"$srDelta W.",
205212
),
206213
DurationInterval.aMonth: UnitStringDeDe(
207214
"einem Monat",
208215
"1 Mo.",
209-
"1mo",
216+
"1 Mo.",
210217
standalone: "ein Monat",
211218
),
212219
DurationInterval.months: UnitStringDeDe(
213220
"$srDelta Monaten",
214221
"$srDelta Mo.",
215-
"${srDelta}mo",
222+
"$srDelta Mo.",
216223
standalone: "$srDelta Monate",
217224
),
218225
DurationInterval.aYear: UnitStringDeDe(
219226
"einem Jahr",
220227
"1 Jr.",
221-
"1y",
228+
"1 J.",
222229
standalone: "ein Jahr",
223230
),
224231
DurationInterval.years: UnitStringDeDe(
225232
"$srDelta Jahren",
226233
"$srDelta Jr.",
227-
"${srDelta}y",
234+
"$srDelta J.",
228235
standalone: "$srDelta Jahre",
229236
),
230237
};
238+
239+
@override
240+
SimpleRangeData get simpleRangeData => SimpleRangeData(
241+
thisWeek: "Diese Woche",
242+
thisMonth: "Diesen Monat",
243+
thisYear: "Dieses Jahr",
244+
year: (range) => "Jahr ${range.year}",
245+
month: (range) => monthNames[range.month]!,
246+
customRangeAfter: (formattedDate) => "Nach $formattedDate",
247+
customRangeBefore: (formattedDate) => "Vor $formattedDate",
248+
customRangeAllTime: "Allzeit",
249+
);
231250
}

lib/src/localizations/en_US.dart

+15-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:moment_dart/src/localization.dart';
55
import 'package:moment_dart/src/localizations/mixins/english_like_ordinal.dart';
66
import 'package:moment_dart/src/localizations/mixins/month_names.dart';
77
import 'package:moment_dart/src/localizations/mixins/simple_duration.dart';
8+
import 'package:moment_dart/src/localizations/mixins/simple_range.dart';
89
import 'package:moment_dart/src/localizations/mixins/simple_relative.dart';
910
import 'package:moment_dart/src/localizations/mixins/simple_units.dart';
1011
import 'package:moment_dart/src/types.dart';
@@ -17,7 +18,8 @@ class LocalizationEnUs extends MomentLocalization
1718
EnglishLikeOrdinal,
1819
SimpleUnits,
1920
SimpleRelative,
20-
SimpleDuration {
21+
SimpleDuration,
22+
SimpleRange {
2123
static LocalizationEnUs? _instance;
2224

2325
LocalizationEnUs._internal() : super();
@@ -203,4 +205,16 @@ class LocalizationEnUs extends MomentLocalization
203205
"${srDelta}y",
204206
),
205207
};
208+
209+
@override
210+
SimpleRangeData get simpleRangeData => SimpleRangeData(
211+
thisWeek: "This week",
212+
thisMonth: "This month",
213+
thisYear: "This year",
214+
year: (range) => "Year ${range.year}",
215+
month: (range) => monthNames[range.month]!,
216+
customRangeAfter: (formattedDate) => "After $formattedDate",
217+
customRangeBefore: (formattedDate) => "Before $formattedDate",
218+
customRangeAllTime: "All time",
219+
);
206220
}

lib/src/localizations/es_ES.dart

+20-1
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,21 @@ import 'package:moment_dart/moment_dart.dart';
66
import 'package:moment_dart/src/localizations/mixins/month_names.dart';
77
import 'package:moment_dart/src/localizations/mixins/ordinal_numbers.dart';
88
import 'package:moment_dart/src/localizations/mixins/simple_duration.dart';
9+
import 'package:moment_dart/src/localizations/mixins/simple_range.dart';
910
import 'package:moment_dart/src/localizations/mixins/simple_relative.dart';
1011
import 'package:moment_dart/src/localizations/mixins/simple_units.dart';
1112
import 'package:moment_dart/src/types.dart';
1213

1314
/// Language: Spanish
1415
/// Country: Spain
1516
class LocalizationEsEs extends MomentLocalization
16-
with MonthNames, Ordinal, SimpleUnits, SimpleRelative, SimpleDuration {
17+
with
18+
MonthNames,
19+
Ordinal,
20+
SimpleUnits,
21+
SimpleRelative,
22+
SimpleDuration,
23+
SimpleRange {
1724
static LocalizationEsEs? _instance;
1825

1926
LocalizationEsEs._internal() : super();
@@ -208,4 +215,16 @@ class LocalizationEsEs extends MomentLocalization
208215
"$srDelta años",
209216
),
210217
};
218+
219+
@override
220+
SimpleRangeData get simpleRangeData => SimpleRangeData(
221+
thisWeek: "Esta semana",
222+
thisMonth: "Este mes",
223+
thisYear: "Este año",
224+
year: (range) => "Año ${range.year}",
225+
month: (range) => monthNames[range.month]!,
226+
customRangeAfter: (formattedDate) => "Después $formattedDate",
227+
customRangeBefore: (formattedDate) => "Antes $formattedDate",
228+
customRangeAllTime: "Todo el tiempo",
229+
);
211230
}

lib/src/localizations/fr_FR.dart

+20-1
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,21 @@ import 'package:moment_dart/moment_dart.dart';
66
import 'package:moment_dart/src/localizations/mixins/month_names.dart';
77
import 'package:moment_dart/src/localizations/mixins/ordinal_numbers.dart';
88
import 'package:moment_dart/src/localizations/mixins/simple_duration.dart';
9+
import 'package:moment_dart/src/localizations/mixins/simple_range.dart';
910
import 'package:moment_dart/src/localizations/mixins/simple_relative.dart';
1011
import 'package:moment_dart/src/localizations/mixins/simple_units.dart';
1112
import 'package:moment_dart/src/types.dart';
1213

1314
/// Language: French
1415
/// Country: France
1516
class LocalizationFrFr extends MomentLocalization
16-
with MonthNames, Ordinal, SimpleUnits, SimpleRelative, SimpleDuration {
17+
with
18+
MonthNames,
19+
Ordinal,
20+
SimpleUnits,
21+
SimpleRelative,
22+
SimpleDuration,
23+
SimpleRange {
1724
static LocalizationFrFr? _instance;
1825

1926
LocalizationFrFr._internal() : super();
@@ -215,4 +222,16 @@ class LocalizationFrFr extends MomentLocalization
215222
"$srDelta ans",
216223
),
217224
};
225+
226+
@override
227+
SimpleRangeData get simpleRangeData => SimpleRangeData(
228+
thisWeek: "Cette semaine",
229+
thisMonth: "Ce mois-ci",
230+
thisYear: "Cette année",
231+
year: (range) => "Année ${range.year}",
232+
month: (range) => monthNames[range.month]!,
233+
customRangeAfter: (formattedDate) => "Après $formattedDate",
234+
customRangeBefore: (formattedDate) => "Avant $formattedDate",
235+
customRangeAllTime: "Tout le temps",
236+
);
218237
}

lib/src/localizations/it_IT.dart

+15-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:moment_dart/src/localizations/mixins/complex_calendar.dart';
66
import 'package:moment_dart/src/localizations/mixins/month_names.dart';
77
import 'package:moment_dart/src/localizations/mixins/ordinal_numbers.dart';
88
import 'package:moment_dart/src/localizations/mixins/simple_duration.dart';
9+
import 'package:moment_dart/src/localizations/mixins/simple_range.dart';
910
import 'package:moment_dart/src/localizations/mixins/simple_relative.dart';
1011
import 'package:moment_dart/src/localizations/mixins/simple_units.dart';
1112
import 'package:moment_dart/src/types.dart';
@@ -19,7 +20,8 @@ class LocalizationItIt extends MomentLocalization
1920
SimpleUnits,
2021
SimpleRelative,
2122
SimpleDuration,
22-
ComplexCalendar {
23+
ComplexCalendar,
24+
SimpleRange {
2325
static LocalizationItIt? _instance;
2426

2527
LocalizationItIt._internal() : super();
@@ -219,4 +221,16 @@ class LocalizationItIt extends MomentLocalization
219221
// 2: "dopodomani",
220222
},
221223
);
224+
225+
@override
226+
SimpleRangeData get simpleRangeData => SimpleRangeData(
227+
thisWeek: "Questa settimana",
228+
thisMonth: "Questo mese",
229+
thisYear: "Quest'anno",
230+
year: (range) => "Anno ${range.year}",
231+
month: (range) => monthNames[range.month]!,
232+
customRangeAfter: (formattedDate) => "Dopo $formattedDate",
233+
customRangeBefore: (formattedDate) => "Prima di $formattedDate",
234+
customRangeAllTime: "Tutto il tempo",
235+
);
222236
}

lib/src/localizations/ja_JP.dart

+19-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import 'package:moment_dart/src/extensions.dart';
55
import 'package:moment_dart/src/localizations/mixins/complex_calendar.dart';
66
import 'package:moment_dart/src/localizations/mixins/simple_duration.dart';
7+
import 'package:moment_dart/src/localizations/mixins/simple_range.dart';
78
import 'package:moment_dart/src/localizations/mixins/simple_relative.dart';
89
import 'package:moment_dart/src/localization.dart';
910
import 'package:moment_dart/src/localizations/mixins/simple_units.dart';
@@ -12,7 +13,12 @@ import 'package:moment_dart/src/types.dart';
1213
/// Language: Japanese
1314
/// Country: Japan
1415
class LocalizationJaJp extends MomentLocalization
15-
with SimpleUnits, SimpleRelative, SimpleDuration, ComplexCalendar {
16+
with
17+
SimpleUnits,
18+
SimpleRelative,
19+
SimpleDuration,
20+
ComplexCalendar,
21+
SimpleRange {
1622
static LocalizationJaJp? _instance;
1723

1824
LocalizationJaJp._internal() : super();
@@ -168,4 +174,16 @@ class LocalizationJaJp extends MomentLocalization
168174
},
169175
),
170176
);
177+
178+
@override
179+
SimpleRangeData get simpleRangeData => SimpleRangeData(
180+
thisWeek: "今週",
181+
thisMonth: "今月",
182+
thisYear: "今年",
183+
year: (range) => "${range.year}年",
184+
month: (range) => monthName(range.month),
185+
customRangeAfter: (formattedDate) => "$formattedDate以降",
186+
customRangeBefore: (formattedDate) => "$formattedDate以前",
187+
customRangeAllTime: '全ての時間',
188+
);
171189
}

0 commit comments

Comments
 (0)