Repository: jama5262/jiffy

Issue:
Add functionality to dynamically add custom locale
**Is your feature request related to a problem? Please describe.**

Currently, Jiffy has some limitations:

1. Users cannot customize or configure the start of the week.
2. Adding a new locale always requires opening a new PR.
3. Update docs
4. Add a how-to for adding or updating locale configurations in the discussion section of this PR

To address these issues, updates are needed to improve flexibility and streamline the localization process. 

Below also are the related issues that have been created:
#64 , #159 , #260 

And some PR, that will not be needed anymore, if this issue is fixed
#283 , #282 , #278 , #277 , #270 




Fix patch:
diff --git a/lib/jiffy.dart b/lib/jiffy.dart
index e17b4a78..0ee29b45 100644
--- a/lib/jiffy.dart
+++ b/lib/jiffy.dart
@@ -5,4 +5,7 @@ library jiffy;
 
 export 'src/enums/unit.dart';
 export 'src/enums/start_of_week.dart';
+export 'src/locale/locale.dart';
+export 'src/locale/ordinals.dart';
+export 'src/locale/relative_date_time.dart';
 export 'src/jiffy.dart';
diff --git a/lib/src/display.dart b/lib/src/display.dart
index 1853e760..8aa950b8 100644
--- a/lib/src/display.dart
+++ b/lib/src/display.dart
@@ -22,18 +22,17 @@ class Display {
           'cannot be blank');
     }
     final escapedPattern = _replaceEscapePattern(pattern);
-    final localeOrdinal = _getLocaleOrdinal(locale, _getter.date(dateTime));
-    final newPattern =
-        _replaceLocaleOrdinalDatePattern(escapedPattern, localeOrdinal);
+    final newPattern = _replaceLocaleOrdinalDatePattern(
+        escapedPattern, locale.ordinals.getOrdinal(_getter.date(dateTime)));
     return DateFormat(newPattern).format(dateTime);
   }
 
   String fromAsRelativeDateTime(DateTime firstDateTime, DateTime secondDateTime,
       Locale locale, bool withPrefixAndSuffix) {
     final isFirstDateTimeSameOrAfterSecondDateTime = _query.isSameOrAfter(
-        firstDateTime, secondDateTime, Unit.microsecond, locale.startOfWeek());
+        firstDateTime, secondDateTime, Unit.microsecond, locale.startOfWeek);
 
-    final relativeDateTime = locale.relativeDateTime();
+    final relativeDateTime = locale.relativeDateTime;
     String prefix, suffix;
 
     if (isFirstDateTimeSameOrAfterSecondDateTime) {
@@ -138,16 +137,6 @@ class Display {
     return asFloat ? diff : _asFloor(diff);
   }
 
-  String _getLocaleOrdinal(Locale locale, int date) {
-    final ordinals = locale.ordinals();
-    var suffix = ordinals.last;
-    final digit = date % 10;
-    if ((digit > 0 && digit < 4) && (date < 11 || date > 13)) {
-      suffix = ordinals[digit - 1];
-    }
-    return suffix;
-  }
-
   String _replaceEscapePattern(String input) {
     return input
         .replaceAll('\'', '\'\'')
diff --git a/lib/src/global/global_ordinals.dart b/lib/src/global/global_ordinals.dart
new file mode 100644
index 00000000..93c0e976
--- /dev/null
+++ b/lib/src/global/global_ordinals.dart
@@ -0,0 +1,51 @@
+import 'package:intl/intl.dart';
+
+import '../locale/ordinals.dart';
+import '../utils/jiffy_exception.dart';
+
+Map<String, Ordinals> _builtInOrdinals = {
+  'en': Ordinals(first: 'st', second: 'nd', third: 'rd', nth: 'th'),
+  'es': Ordinals(first: 'º', second: 'º', third: 'º', nth: 'º'),
+  'fr': Ordinals(first: 'er', second: '', third: '', nth: ''),
+  'zh': Ordinals(first: '日', second: '日', third: '日', nth: '日'),
+  'de': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+  'it': Ordinals(first: 'º', second: 'º', third: 'º', nth: 'º'),
+  'ar': Ordinals(first: '', second: '', third: '', nth: ''),
+  'az': Ordinals(first: '', second: '', third: '', nth: ''),
+  'id': Ordinals(first: '', second: '', third: '', nth: ''),
+  'ja': Ordinals(first: '日', second: '日', third: '日', nth: '日'),
+  'ko': Ordinals(first: '일', second: '일', third: '일', nth: '일'),
+  'ru': Ordinals(first: '', second: '', third: '', nth: ''),
+  'uk': Ordinals(first: '', second: '', third: '', nth: ''),
+  'hi': Ordinals(first: '', second: '', third: '', nth: ''),
+  'hu': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+  'pt': Ordinals(first: 'º', second: 'º', third: 'º', nth: 'º'),
+  'pl': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+  'tr': Ordinals(first: '', second: '', third: '', nth: ''),
+  'sv': Ordinals(first: '', second: '', third: '', nth: ''),
+  'nb': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+  'fa': Ordinals(first: 'م', second: 'م', third: 'م', nth: 'م'),
+  'bn': Ordinals(first: '', second: '', third: '', nth: ''),
+  'nl': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+  'th': Ordinals(first: '', second: '', third: '', nth: ''),
+  'sk': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+  'cs': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+};
+
+Ordinals? _defaultOrdinals;
+
+set defaultOrdinals(Ordinals? ordinals) {
+  _defaultOrdinals = ordinals;
+}
+
+Ordinals getOrdinals(String locale) {
+  if (_defaultOrdinals != null) {
+    return _defaultOrdinals!;
+  } else {
+    final ordinals = _builtInOrdinals[Intl.shortLocale(locale)];
+    if (ordinals == null) {
+      throw JiffyException("Locale `$locale` is not supported for ordinals.");
+    }
+    return ordinals;
+  }
+}
diff --git a/lib/src/global/global_relative_date_time.dart b/lib/src/global/global_relative_date_time.dart
new file mode 100644
index 00000000..b287c7dd
--- /dev/null
+++ b/lib/src/global/global_relative_date_time.dart
@@ -0,0 +1,63 @@
+import 'package:intl/intl.dart';
+
+import '../locale/relative_date_time.dart';
+import '../utils/jiffy_exception.dart';
+
+Map<String, RelativeDateTime> _relativeDateTime = {
+  'en': EnRelativeDateTime(),
+  'es': EsRelativeDateTime(),
+  'fr': FrRelativeDateTime(),
+  'zh': ZhRelativeDateTime(),
+  'zh_CN': ZhCnRelativeDateTime(),
+  'de': DeRelativeDateTime(),
+  'it': ItRelativeDateTime(),
+  'ar': ArRelativeDateTime(true),
+  'ar_LY': ArRelativeDateTime(false),
+  'ar_DZ': ArSaMaDzKwTnRelativeDateTime(false),
+  'ar_KW': ArSaMaDzKwTnRelativeDateTime(false),
+  'ar_SA': ArSaMaDzKwTnRelativeDateTime(true),
+  'ar_MA': ArSaMaDzKwTnRelativeDateTime(false),
+  'ar_TN': ArSaMaDzKwTnRelativeDateTime(false),
+  'az': AzRelativeDateTime(),
+  'id': IdRelativeDateTime(),
+  'ja': JaRelativeDateTime(),
+  'ko': KoRelativeDateTime(),
+  'ru': RuRelativeDateTime(),
+  'uk': UkRelativeDateTime(),
+  'hi': HiRelativeDateTime(),
+  'hu': HuRelativeDateTime(),
+  'pt': PtRelativeDateTime(),
+  'pl': PlRelativeDateTime(),
+  'tr': TrRelativeDateTime(),
+  'sv': SvRelativeDateTime(),
+  'nb': NbRelativeDateTime(),
+  'fa': FaRelativeDateTime(),
+  'bn': BnRelativeDateTime(),
+  'nl': NlRelativeDateTime(),
+  'th': ThRelativeDateTime(),
+  'sk': SkRelativeDateTime(),
+  'cs': CsRelativeDateTime(),
+};
+
+RelativeDateTime? _defaultRelativeDateTime;
+
+set defaultRelativeDateTime(RelativeDateTime? relativeDateTime) {
+  _defaultRelativeDateTime = relativeDateTime;
+}
+
+RelativeDateTime getRelativeDateTime(String locale) {
+  if (_defaultRelativeDateTime != null) {
+    return _defaultRelativeDateTime!;
+  } else {
+    final canonicalizedLocale = Intl.canonicalizedLocale(locale);
+    final rdt1 = _relativeDateTime[canonicalizedLocale];
+    if (rdt1 != null) return rdt1;
+
+    final shortLocale = Intl.shortLocale(locale);
+    final rdt2 = _relativeDateTime[shortLocale];
+    if (rdt2 != null) return rdt2;
+
+    throw JiffyException(
+        "Locale `$locale` is not supported for relative date formatting.");
+  }
+}
diff --git a/lib/src/global/global_start_of_week.dart b/lib/src/global/global_start_of_week.dart
new file mode 100644
index 00000000..6b1b886e
--- /dev/null
+++ b/lib/src/global/global_start_of_week.dart
@@ -0,0 +1,31 @@
+import 'package:intl/date_symbol_data_local.dart' as date_intl;
+import 'package:jiffy/src/utils/jiffy_exception.dart';
+
+import '../enums/start_of_week.dart';
+
+StartOfWeek? _defaultStartOfWeek;
+
+set defaultStartOfWeek(StartOfWeek? startOfWeek) {
+  _defaultStartOfWeek = startOfWeek;
+}
+
+StartOfWeek getStartOfWeek(String locale) {
+  if (_defaultStartOfWeek != null) {
+    return _defaultStartOfWeek!;
+  } else {
+    final supportedLocale = date_intl.dateTimeSymbolMap()[locale];
+
+    if (supportedLocale == null) {
+      throw JiffyException("The specified locale '$locale' is not supported.");
+    }
+
+    return switch (supportedLocale.FIRSTDAYOFWEEK) {
+      0 => StartOfWeek.monday,
+      5 => StartOfWeek.saturday,
+      6 => StartOfWeek.sunday,
+      _ => throw JiffyException(
+          "Start of week with index ${supportedLocale.FIRSTDAYOFWEEK} "
+          "not supported"),
+    };
+  }
+}
diff --git a/lib/src/jiffy.dart b/lib/src/jiffy.dart
index b1adba74..8441c8de 100644
--- a/lib/src/jiffy.dart
+++ b/lib/src/jiffy.dart
@@ -1,5 +1,5 @@
 import 'package:intl/intl.dart';
-import 'package:intl/date_symbol_data_local.dart';
+import 'package:intl/date_symbol_data_local.dart' as date_intl;
 
 import './default_display.dart';
 import './display.dart';
@@ -7,16 +7,19 @@ import './enums/start_of_week.dart';
 import './enums/unit.dart';
 import './getter.dart';
 import './locale/locale.dart';
-import './locale/locales/en_locale.dart';
-import './locale/supported_locales.dart' as supported_locales;
 import './manipulator.dart';
 import './parser.dart';
 import './query.dart';
 import './utils/jiffy_exception.dart';
-
-/// Jiffy is a Flutter (Android, IOS and Web) date time package inspired by
-/// [momentjs](https://momentjs.com/) for parsing, manipulating, querying and
-/// formatting dates
+import './global/global_ordinals.dart';
+import './global/global_relative_date_time.dart';
+import './global/global_start_of_week.dart';
+import 'locale/ordinals.dart';
+import 'locale/relative_date_time.dart';
+
+/// [Jiffy](https://github.com/jama5262/jiffy) is a
+/// Flutter (Android, IOS and Web) date time package for
+/// parsing, manipulating, querying and formatting dates
 class Jiffy {
   late final Getter _getter;
   late final DefaultDisplay _defaultDisplay;
@@ -28,12 +31,68 @@ class Jiffy {
   late Locale _locale;
   late final DateTime _dateTime;
 
-  Jiffy._internal(var input, {String? pattern, bool isUtc = false}) {
-    _initializeDependencies();
-    _initializeLocale();
-    _initializeDateTime(input, pattern, isUtc);
+  /// Sets the locale for this [Jiffy] instance based on the given [locale] string.
+  ///
+  /// If not provided, the default locale is `en_US`
+  ///
+  /// The [locale] parameter should be a valid string representation of a
+  /// supported locale, such as `'en_US'` or `'fr_FR'`. If the provided locale
+  /// is not supported, a [JiffyException] will be thrown.
+  ///
+  /// Example:
+  /// ```dart
+  /// await Jiffy.setLocale('en_US');
+  /// await Jiffy.setLocale('en_US', startOfWeek: StartOfWeek.monday);
+  /// ```
+  ///
+  /// Throws:
+  /// - [JiffyException] if the locale is not supported.
+  /// - [JiffyException] if an [ArgumentError] occurs during the process.
+  ///
+  /// Optional Parameters:
+  /// - [startOfWeek]: The first day of the week (e.g., `StartOfWeek.sunday`).
+  ///   If not provided, the default start of the week for the locale will be used.
+  /// - [ordinals]: A custom ordinal rule set for the locale.
+  ///   (e.g Ordinals(first: 'st', second: 'nd', third: 'rd', nth: 'th')).
+  ///   If not provided, the default ordinal rules will be used.
+  /// - [relativeDateTime]: Custom relative date-time formatting settings.
+  ///   (e.g, EnRelativeDateTime()). If not provided, the default relative
+  ///   date-time settings will be used.
+  static Future<void> setLocale(
+    String locale, {
+    StartOfWeek? startOfWeek,
+    Ordinals? ordinals,
+    RelativeDateTime? relativeDateTime,
+  }) async {
+    try {
+      final supportedLocale = Intl.verifiedLocale(locale,
+          (localeExists) => getSupportedLocales().contains(localeExists));
+
+      if (supportedLocale != null) {
+        Intl.defaultLocale = locale;
+        await date_intl.initializeDateFormatting();
+        defaultStartOfWeek = startOfWeek;
+        defaultOrdinals = ordinals;
+        defaultRelativeDateTime = relativeDateTime;
+      } else {
+        throw JiffyException('The locale `$locale` is not supported');
+      }
+    } on ArgumentError catch (e) {
+      throw JiffyException(e.message);
+    }
   }
 
+  /// Retrieves a list of supported locales in Jiffy.
+  ///
+  /// Example usage:
+  ///
+  /// ```dart
+  /// final supportLocales = Jiffy.getSupportedLocales();
+  /// print(supportLocales); // ['en_us', 'en', 'fr', ...]
+  /// ```
+  static List<String> getSupportedLocales() =>
+      date_intl.dateTimeSymbolMap().keys.toList();
+
   /// Constructs a new [Jiffy] instance by parsing a [String].
   ///
   /// If [pattern] is not provided, [string] must be in one of the following
@@ -44,13 +103,20 @@ class Jiffy {
   /// * `'1997-09-23 11:18:12.946621'`
   /// * `'1997-09-23T11:18:12.947031'`
   ///
-  /// If [pattern] is provided, [string] should match the specified format.
+  /// If [pattern] is provided, [string] should match the
+  /// specified pattern format.
+  ///
+  /// This method also includes an optional [isUtc] parameter:
+  /// - If [isUtc] is `true`, the parsed date-time will be treated as UTC.
+  /// - If [isUtc] is `false` (default), the parsed date-time will be
+  /// treated as local time.
   ///
   /// Example usage:
   ///
   /// ```dart
   /// final jiffy1 = Jiffy.parse('1997-09-23');
   /// final jiffy2 = Jiffy.parse('1997 Sep 23th', pattern: 'yyyy MMM do');
+  /// final jiffy3 = Jiffy.parse('1997 Sep 23th', isUtc: true);
   /// ```
   ///
   /// Throws a [JiffyException] if the input [string] cannot be parsed.
@@ -75,9 +141,8 @@ class Jiffy {
   /// Constructs a new [Jiffy] instance from an existing [Jiffy] object.
   ///
   /// The resulting [Jiffy] object will have the same date and time values as
-  /// the provided [Jiffy] object. This can be useful if you need to create a
-  /// new [Jiffy] object based on an existing one, for example, to apply a
-  /// time zone offset or to format the date and time differently.
+  /// the provided [Jiffy] object. This can be useful if you need to clone a
+  /// new [Jiffy] object based on an existing one.
   ///
   /// Example usage:
   ///
@@ -87,7 +152,7 @@ class Jiffy {
   /// ```
   ///
   /// Alternatively, you can use the `clone` method of a [Jiffy] object to
-  /// create a new [Jiffy] object with the same values as the original.
+  /// create a new [Jiffy] object.
   ///
   /// ```dart
   /// final jiffy1 = Jiffy.now();
@@ -109,12 +174,18 @@ class Jiffy {
   /// will default to 1 and, hour, minute, second, millisecond, and microsecond
   /// will default to 0 if not provided).
   ///
+  /// This method also includes an optional [isUtc] parameter:
+  /// - If [isUtc] is `true`, the parsed date-time will be treated as UTC.
+  /// - If [isUtc] is `false` (default), the parsed date-time will be
+  /// treated as local time.
+  ///
   /// Example usage:
   ///
   /// ```dart
-  /// final jiffy = Jiffy.parseFromList([1997, 9, 23]);
+  /// final jiffy1 = Jiffy.parseFromList([1997, 9, 23]);
+  /// final jiffy2 = Jiffy.parseFromList([1997, 9, 23], isUtc: true);
   /// ```
-  /// Throws a [JiffyException] if the input [list] is empty.
+  /// Throws a [JiffyException] if the input [list] is invalid.
   factory Jiffy.parseFromList(List<int> list, {bool isUtc = false}) {
     return Jiffy._internal(list, isUtc: isUtc);
   }
@@ -131,16 +202,29 @@ class Jiffy {
   /// 'UNIT.MICROSECOND') are not provided, they default to the current
   /// date time value.
   ///
+  /// This method also includes an optional [isUtc] parameter:
+  /// - If [isUtc] is `true`, the parsed date-time will be treated as UTC.
+  /// - If [isUtc] is `false` (default), the parsed date-time will be
+  /// treated as local time.
+  ///
   /// Example usage:
   ///
   /// ```dart
-  /// final jiffy = Jiffy.parseFromMap(
+  /// final jiffy1 = Jiffy.parseFromMap(
   ///   {
   ///     Unit.YEAR: 1997,
   ///     Unit.MONTH: 9,
   ///     Unit.DAY: 23,
   ///   }
   /// );
+  /// final jiffy2 = Jiffy.parseFromMap(
+  ///   {
+  ///     Unit.YEAR: 1997,
+  ///     Unit.MONTH: 9,
+  ///     Unit.DAY: 23,
+  ///   },
+  ///   isUtc: true
+  /// );
   /// ```
   ///
   /// Throws a [JiffyException] if the input [map] is empty.
@@ -154,9 +238,14 @@ class Jiffy {
   /// The [microsecondsSinceEpoch] represents the number of microseconds since
   /// epoch time, which is `January 1, 1970, 00:00:00 UTC`.
   ///
+  /// This method also includes an optional [isUtc] parameter:
+  /// - If [isUtc] is `true`, the parsed date-time will be treated as UTC.
+  /// - If [isUtc] is `false` (default), the parsed date-time will be
+  /// treated as local time.
+  ///
   /// ```dart
   /// final now = DateTime.now();
-  /// final jiffy = Jiffy.parseFromMicrosecondsSinceEpoch(now.microsecondsSinceEpoch);
+  /// final jiffy1 = Jiffy.parseFromMicrosecondsSinceEpoch(now.microsecondsSinceEpoch);
   /// ```
   factory Jiffy.parseFromMicrosecondsSinceEpoch(int microsecondsSinceEpoch,
       {bool isUtc = false}) {
@@ -171,6 +260,11 @@ class Jiffy {
   /// The [millisecondsSinceEpoch] represents the number of milliseconds since
   /// epoch time, which is `January 1, 1970, 00:00:00 UTC`.
   ///
+  /// This method also includes an optional [isUtc] parameter:
+  /// - If [isUtc] is `true`, the parsed date-time will be treated as UTC.
+  /// - If [isUtc] is `false` (default), the parsed date-time will be
+  /// treated as local time.
+  ///
   /// ```dart
   /// final now = DateTime.now();
   /// final jiffy = Jiffy.parseFromMillisecondsSinceEpoch(now.millisecondsSinceEpoch);
@@ -189,6 +283,12 @@ class Jiffy {
   /// ```
   factory Jiffy.now() => Jiffy._internal(DateTime.now());
 
+  Jiffy._internal(var input, {String? pattern, bool isUtc = false}) {
+    _initializeDependencies();
+    _initializeLocale();
+    _initializeDateTime(input, pattern, isUtc);
+  }
+
   void _initializeDependencies() {
     _getter = Getter();
     _defaultDisplay = DefaultDisplay();
@@ -198,6 +298,15 @@ class Jiffy {
     _display = Display(_getter, _manipulator, _query);
   }
 
+  void _initializeLocale() {
+    var currentLocale = Intl.getCurrentLocale();
+    _locale = Locale(
+        code: currentLocale,
+        startOfWeek: getStartOfWeek(currentLocale),
+        ordinals: getOrdinals(currentLocale),
+        relativeDateTime: getRelativeDateTime(currentLocale));
+  }
+
   void _initializeDateTime(var input, String? pattern, bool isUtc) {
     if (input is DateTime) {
       _dateTime = _getter.dateTime(input);
@@ -215,82 +324,35 @@ class Jiffy {
     }
   }
 
-  void _initializeLocale() {
-    var systemLocale = Intl.getCurrentLocale();
-
-    if (supported_locales.isLocalSupported(systemLocale)) {
-      _locale = supported_locales.getLocale(systemLocale);
-    } else {
-      // The locale `systemLocale` is not supported by Jiffy, hence '
-      // 'setting a default locale of `en_us`
-      _locale = EnUsLocale();
-    }
-  }
+  /// Returns the [Locale].
+  Locale get locale => _locale;
 
-  /// Returns the locale code for the current locale.
+  /// Returns the locale code for the current [Locale].
   ///
   /// The locale code is a string identifier that uniquely identifies a
-  /// Locale. Examples include "en-US" for English as used in the
-  /// United States, or "fr-CA" for French as used in Canada.
-  String get localeCode => _locale.code();
+  /// [Locale]. Examples include "en_US" for English as used in the
+  /// United States, or "fr_CA" for French as used in Canada.
+  @Deprecated("Use the [locale] to get the locale code")
+  String get localeCode => _locale.code;
 
   /// Returns a [StartOfWeek] enum value indicating the day on which the week
-  /// starts for the current locale.
+  /// starts for the current [Locale].
   ///
   /// The start of the week can vary by locale, with some starting on Sunday,
   /// and others starting on Monday or another day of the week.
-  StartOfWeek get localeStartOfWeek => _locale.startOfWeek();
+  @Deprecated("Use the [locale] to get the locale start of week")
+  StartOfWeek get localeStartOfWeek => _locale.startOfWeek;
 
-  /// Sets the locale for this [Jiffy] instance based on the [locale] provided.
+  /// Creates and returns a new [Jiffy] instance with the same date and time
+  /// as the original instance.
   ///
-  /// The [locale] parameter is expected to be a string representation of a
-  /// supported locale, such as 'en_US' or 'fr_FR'. If the [locale] provided
-  /// is not supported, a [JiffyException] will be thrown.
-  ///
-  /// ```dart
-  /// await Jiffy().setLocale('en_US');
-  /// ```
-  ///
-  /// Throws a [JiffyException] if the [locale] provided is not supported in
-  /// [Jiffy].
-  static Future<void> setLocale(String locale) async {
-    if (supported_locales.isLocalSupported(locale)) {
-      Intl.defaultLocale = locale;
-      await initializeDateFormatting();
-    } else {
-      // todo add github readme locale link to this exception and also
-      // update the doc comment
-      throw JiffyException('The locale `$locale` is not supported, '
-          'please check here for a list of supported locales');
-    }
-  }
-
-  /// Retrieves a list of supported locales in Jiffy.
-  ///
-  /// This static method returns a list of supported locales by invoking the
-  /// `getSupportedLocales()` method from the `supported_locales` module.
-  ///
-  /// The returned list contains strings representing the supported locales.
-  ///
-  /// Example usage:
-  ///
-  /// ```dart
-  /// final supportLocales = Jiffy.getSupportedLocales();
-  /// print(supportLocales); // ['en_us', 'en', 'fr', ...]
-  /// ```
-  static List<String> getSupportedLocales() =>
-      supported_locales.getSupportedLocales();
-
-  /// Returns a new [Jiffy] instance with the same date and time as the
-  /// original instance.
+  /// The cloned instance operates independently, meaning any modifications
+  /// to it will not affect the original.
   ///
   /// ```dart
   /// final originalJiffy = Jiffy();
   /// final newJiffy = originalJiffy.clone();
   /// ```
-  ///
-  /// The returned instance is not tied to the original instance, so
-  /// modifying the new instance will not affect the original.
   Jiffy clone() => Jiffy.parseFromDateTime(dateTime);
 
   Jiffy _clone(DateTime dateTime) =>
@@ -325,39 +387,38 @@ class Jiffy {
   /// Returns the date ranging from 1 to 31.
   int get date => _getter.date(dateTime);
 
-  /// Returns the day of the week according to the [Locale.startOfWeek()].
+  /// Returns the day of the week according to the [Locale.startOfWeek].
   ///
-  /// The return value is an integer between 1 and 7, where 1 represents the
-  /// [Locale.startOfWeek()]
+  /// The return value is an integer between 0 and 6, where index 0, is Monday
   ///
   /// By default, the day of the week is calculated based on the locale provided
-  /// during [Jiffy] initialization. If no locale was provided, it uses the
-  /// default `en_us` locale.
-  int get dayOfWeek => _getter.dayOfWeek(dateTime, _locale.startOfWeek());
+  /// on [Jiffy.setLocale(locale)]. If no locale was set, it uses the
+  /// default `en_US` locale.
+  int get dayOfWeek => _getter.dayOfWeek(dateTime, _locale.startOfWeek);
 
   /// Returns the number of days in the month.
   int get daysInMonth => _getter.daysInMonth(dateTime);
 
-  /// Returns the day of the year of this [Jiffy] instance.
+  /// Returns the day of the year.
   ///
   /// The returned value is an integer between 1 and 366, inclusive, where 1
   /// represents January 1st of the year and 366 represents December 31st of a
   /// leap year.
   int get dayOfYear => _getter.dayOfYear(dateTime);
 
-  /// Returns the week of the year based on the current [Locale]'s start of
-  /// week.
+  /// Returns the week number of the year based on the current [Locale]'s
+  /// defined start of the week.
   ///
-  /// The week of the year ranges from 1 to 53, where week 1 is the first week
-  /// that has at least [DateTime.daysPerWeek] days in the new year.
+  /// The week number ranges from 1 to 53, where week 1 is the first week
+  /// containing at least [DateTime.daysPerWeek] days in the new year.
   ///
-  /// For example, in the United States, weeks typically start on Sunday. If
-  /// date and time is a Monday in the second week of the year (For example,
-  /// 8 days after the start of the year), the method returns 2. On the other
-  /// hand, in France, weeks typically start on Monday. If date and time is a
-  /// Sunday in the first week of the year (For example, 6 days after the
-  /// start of the year), the method returns 1.
-  int get weekOfYear => _getter.weekOfYear(dateTime, _locale.startOfWeek());
+  /// Week calculation varies by locale:
+  /// - In the United States, weeks typically start on Sunday. For example,
+  ///   if the date falls on a Monday in the second week of the year (8 days
+  ///   after January 1st), this method returns `2`.
+  /// - In France, where weeks start on Monday, a date falling on a Sunday in
+  ///   the first week of the year (6 days after January 1st) would return `1`.
+  int get weekOfYear => _getter.weekOfYear(dateTime, _locale.startOfWeek);
 
   /// Returns the month of the year ranging from 1 to 12.
   int get month => _getter.month(dateTime);
@@ -473,7 +534,7 @@ class Jiffy {
   /// Returns a new [Jiffy] instance representing the start of the specified
   /// [unit] of time
   ///
-  /// [unit] must be one of the values in [Unit] enumeration.
+  /// [unit] must be one of the values in [Unit] enum.
   ///
   /// Example:
   ///
@@ -488,14 +549,14 @@ class Jiffy {
   /// ```
   Jiffy startOf(Unit unit) {
     final dateTime =
-        _manipulator.startOf(this.dateTime, unit, _locale.startOfWeek());
+        _manipulator.startOf(this.dateTime, unit, _locale.startOfWeek);
     return _clone(dateTime);
   }
 
   /// Returns a new [Jiffy] instance representing the end of the specified
   /// [unit] of time
   ///
-  /// [unit] must be one of the values in [Unit] enumeration.
+  /// [unit] must be one of the values in [Unit] enum.
   ///
   /// Example:
   ///
@@ -510,7 +571,7 @@ class Jiffy {
   /// ```
   Jiffy endOf(Unit unit) {
     final dateTime =
-        _manipulator.endOf(this.dateTime, unit, _locale.startOfWeek());
+        _manipulator.endOf(this.dateTime, unit, _locale.startOfWeek);
     return _clone(dateTime);
   }
 
@@ -814,10 +875,10 @@ class Jiffy {
   /// final jiffy2 = Jiffy(DateTime(2022, 2, 15, 12, 30, 0));
   ///
   /// // Calculate the difference between the two Jiffy instances in days
-  /// final diffInDays = jiffy1.diff(jiffy2, unit: Unit.DAY);
+  /// final diffInDays = jiffy2.diff(jiffy1, unit: Unit.DAY);
   ///
   /// print('Difference in days: $diffInDays');
-  /// // output: Difference in days: -14
+  /// // output: Difference in days: 14
   /// ```
   num diff(Jiffy jiffy, {Unit unit = Unit.microsecond, bool asFloat = false}) {
     return _display.diff(dateTime, jiffy.dateTime, unit, asFloat);
@@ -829,8 +890,7 @@ class Jiffy {
   /// The [unit] parameter specifies the unit of measurement to use when
   /// comparing the two instances. The default value is [Unit.microsecond].
   bool isBefore(Jiffy jiffy, {Unit unit = Unit.microsecond}) {
-    return _query.isBefore(
-        dateTime, jiffy.dateTime, unit, _locale.startOfWeek());
+    return _query.isBefore(dateTime, jiffy.dateTime, unit, _locale.startOfWeek);
   }
 
   /// Returns a boolean value indicating whether this [Jiffy] instance is
@@ -839,8 +899,7 @@ class Jiffy {
   /// The [unit] parameter specifies the unit of measurement to use when
   /// comparing the two instances. The default value is [Unit.microsecond].
   bool isAfter(Jiffy jiffy, {Unit unit = Unit.microsecond}) {
-    return _query.isAfter(
-        dateTime, jiffy.dateTime, unit, _locale.startOfWeek());
+    return _query.isAfter(dateTime, jiffy.dateTime, unit, _locale.startOfWeek);
   }
 
   /// Returns a boolean value indicating whether this [Jiffy] instance is
@@ -849,7 +908,7 @@ class Jiffy {
   /// The [unit] parameter specifies the unit of measurement to use when
   /// comparing the two instances. The default value is [Unit.microsecond].
   bool isSame(Jiffy jiffy, {Unit unit = Unit.microsecond}) {
-    return _query.isSame(dateTime, jiffy.dateTime, unit, _locale.startOfWeek());
+    return _query.isSame(dateTime, jiffy.dateTime, unit, _locale.startOfWeek);
   }
 
   /// Returns a boolean value indicating whether this [Jiffy] instance is
@@ -859,7 +918,7 @@ class Jiffy {
   /// comparing the two instances. The default value is [Unit.microsecond].
   bool isSameOrBefore(Jiffy jiffy, {Unit unit = Unit.microsecond}) {
     return _query.isSameOrBefore(
-        dateTime, jiffy.dateTime, unit, _locale.startOfWeek());
+        dateTime, jiffy.dateTime, unit, _locale.startOfWeek);
   }
 
   /// Returns a boolean value indicating whether this [Jiffy] instance is
@@ -869,7 +928,7 @@ class Jiffy {
   /// comparing the two instances. The default value is [Unit.microsecond].
   bool isSameOrAfter(Jiffy jiffy, {Unit unit = Unit.microsecond}) {
     return _query.isSameOrAfter(
-        dateTime, jiffy.dateTime, unit, _locale.startOfWeek());
+        dateTime, jiffy.dateTime, unit, _locale.startOfWeek);
   }
 
   /// Returns a boolean value indicating whether this [Jiffy] instance is
@@ -880,17 +939,17 @@ class Jiffy {
   bool isBetween(Jiffy jiffyFrom, Jiffy jiffyTo,
       {Unit unit = Unit.microsecond}) {
     return _query.isBetween(dateTime, jiffyFrom.dateTime, jiffyTo.dateTime,
-        unit, _locale.startOfWeek());
+        unit, _locale.startOfWeek);
   }
 
-  /// Returns a boolean value indicating whether this [Jiffy] instance
-  /// represents a local date and time.
-  bool get isLocal => !isUtc;
-
   /// Returns a boolean value indicating whether this [Jiffy] instance
   /// represents a UTC date and time.
   bool get isUtc => Query.isUtc(dateTime);
 
+  /// Returns a boolean value indicating whether this [Jiffy] instance
+  /// represents a local date and time.
+  bool get isLocal => !isUtc;
+
   /// Returns a boolean value indicating whether the [Jiffy] instance
   /// provided falls on a leap year.
   bool get isLeapYear => Query.isLeapYear(dateTime.year);
diff --git a/lib/src/locale/locale.dart b/lib/src/locale/locale.dart
index 6cd3843a..29d3706f 100644
--- a/lib/src/locale/locale.dart
+++ b/lib/src/locale/locale.dart
@@ -1,28 +1,36 @@
+import 'package:jiffy/src/locale/ordinals.dart';
+
 import '../enums/start_of_week.dart';
 import 'relative_date_time.dart';
 
-/// An abstract class representing a Locale in Dart.
-abstract class Locale {
+class Locale {
   /// Returns the locale code for this locale.
   ///
   /// The locale code is a string identifier that uniquely identifies a
-  /// Locale. Examples include "en-US" for English as used in the
-  /// United States, or "fr-CA" for French as used in Canada.
-  String code();
+  /// Locale. Examples include "en_US" for English as used in the
+  /// United States, or "fr_CA" for French as used in Canada.
+  final String code;
+
+  /// Returns the day on which the week starts for this locale.
+  final StartOfWeek startOfWeek;
 
   /// Returns a list of ordinal suffixes for this locale.
   ///
   /// Ordinal suffixes are used to format the ordinal number of a day
   /// (For example, "st", "nd", "rd", "th").
-  List<String> ordinals();
-
-  /// Returns the day on which the week starts for this locale.
-  StartOfWeek startOfWeek();
+  final Ordinals ordinals;
 
   /// Returns a [RelativeDateTime] instance for this locale.
   ///
   /// A [RelativeDateTime] instance encapsulates the rules for formatting
   /// relative date/time values (For example, "3 hours ago", "in 2 days") for
   /// a specific locale.
-  RelativeDateTime relativeDateTime();
+  final RelativeDateTime relativeDateTime;
+
+  Locale({
+    required this.code,
+    required this.ordinals,
+    required this.startOfWeek,
+    required this.relativeDateTime,
+  });
 }
diff --git a/lib/src/locale/locales/ar_locale.dart b/lib/src/locale/locales/ar_locale.dart
deleted file mode 100644
index 364af8b2..00000000
--- a/lib/src/locale/locales/ar_locale.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../../utils/replace.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class ArLocale extends Locale {
-  @override
-  String code() => 'ar';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.saturday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ArRelativeTime(true);
-}
-
-class ArLyLocale extends ArLocale {
-  @override
-  String code() => 'ar_ly';
-
-  @override
-  RelativeDateTime relativeDateTime() => ArRelativeTime(false);
-}
-
-class ArDzLocale extends ArLocale {
-  @override
-  String code() => 'ar_dz';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ArSaMaDzKwTnRelativeTime(false);
-}
-
-class ArKwLocale extends ArLocale {
-  @override
-  String code() => 'ar_kw';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ArSaMaDzKwTnRelativeTime(false);
-}
-
-class ArSaLocale extends ArLocale {
-  @override
-  String code() => 'ar_sa';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ArSaMaDzKwTnRelativeTime(true);
-}
-
-class ArMaLocale extends ArLocale {
-  @override
-  String code() => 'ar_ma';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.saturday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ArSaMaDzKwTnRelativeTime(false);
-}
-
-class ArTnLocale extends ArLocale {
-  @override
-  String code() => 'ar_tn';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.saturday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ArSaMaDzKwTnRelativeTime(false);
-}
-
-class ArRelativeTime extends RelativeDateTime {
-  bool replaceNum;
-  ArRelativeTime(this.replaceNum);
-
-  @override
-  String prefixAgo() => 'منذ';
-  @override
-  String prefixFromNow() => 'بعد';
-  @override
-  String suffixAgo() => '';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'ثانية واحدة';
-  @override
-  String aboutAMinute(int minutes) => 'دقيقة واحدة';
-  @override
-  String minutes(int minutes) {
-    String result;
-    if (minutes == 1) {
-      result = 'دقيقة واحدة';
-    } else if (minutes == 2) {
-      result = 'دقيقتين';
-    } else if (minutes > 2 && minutes < 11) {
-      result = '$minutes دقائق ';
-    } else if (minutes > 10) {
-      result = '$minutes دقيقة ';
-    } else {
-      result = '$minutes دقائق ';
-    }
-    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
-  }
-
-  @override
-  String aboutAnHour(int minutes) => 'ساعة واحدة';
-  @override
-  String hours(int hours) {
-    String result;
-    if (hours == 1) {
-      result = 'ساعة واحدة';
-    } else if (hours == 2) {
-      result = ' ساعتين';
-    } else if (hours > 2 && hours < 11) {
-      result = '$hours ساعات ';
-    } else if (hours > 10) {
-      result = '$hours ساعة ';
-    } else {
-      result = '$hours ساعات ';
-    }
-    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
-  }
-
-  @override
-  String aDay(int hours) => 'يوم واحد';
-  @override
-  String days(int days) {
-    String result;
-    if (days == 1) {
-      result = ' يوم واحد';
-    } else if (days == 2) {
-      result = ' يومين';
-    } else if (days > 2 && days < 11) {
-      result = '$days ايام ';
-    } else if (days > 10) {
-      result = '$days يوم ';
-    } else {
-      result = '$days ايام ';
-    }
-    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
-  }
-
-  @override
-  String aboutAMonth(int days) => 'شهر واحد';
-  @override
-  String months(int months) {
-    String result;
-    if (months == 1) {
-      result = 'شهر واحد';
-    } else if (months == 2) {
-      result = 'شهرين';
-    } else if (months > 2 && months < 11) {
-      result = '$months اشهر ';
-    } else if (months > 10) {
-      result = '$months شهر ';
-    } else {
-      result = '$months شهور ';
-    }
-    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
-  }
-
-  @override
-  String aboutAYear(int year) => 'عام واحد';
-  @override
-  String years(int years) {
-    String result;
-    if (years == 1) {
-      result = 'عام واحد';
-    } else if (years == 2) {
-      result = 'عامين';
-    } else if (years > 2 && years < 11) {
-      result = '$years أعوام ';
-    } else if (years > 10) {
-      result = '$years عامًا ';
-    } else {
-      result = '$years أعوام ';
-    }
-    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
-  }
-
-  @override
-  String wordSeparator() => ' ';
-}
-
-class ArSaMaDzKwTnRelativeTime extends RelativeDateTime {
-  bool replaceNum;
-  ArSaMaDzKwTnRelativeTime(this.replaceNum);
-
-  @override
-  String prefixAgo() => 'منذ';
-  @override
-  String prefixFromNow() => 'في';
-  @override
-  String suffixAgo() => '';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'ثوان';
-  @override
-  String aboutAMinute(int minutes) => 'دقيقة';
-  @override
-  String minutes(int minutes) {
-    return replaceNum
-        ? replaceToLocaleNum('$minutes دقائق ', 'ar')
-        : '$minutes دقائق ';
-  }
-
-  @override
-  String aboutAnHour(int minutes) => 'ساعة';
-  @override
-  String hours(int hours) {
-    return replaceNum
-        ? replaceToLocaleNum('$hours ساعات ', 'ar')
-        : '$hours ساعات ';
-  }
-
-  @override
-  String aDay(int hours) => 'يوم';
-  @override
-  String days(int days) {
-    return replaceNum ? replaceToLocaleNum('$days أيام ', 'ar') : '$days أيام ';
-  }
-
-  @override
-  String aboutAMonth(int days) => 'شهر';
-  @override
-  String months(int months) {
-    return replaceNum
-        ? replaceToLocaleNum('$months أشهر ', 'ar')
-        : '$months أشهر ';
-  }
-
-  @override
-  String aboutAYear(int year) => 'سنة';
-  @override
-  String years(int years) {
-    return replaceNum
-        ? replaceToLocaleNum('$years سنوات ', 'ar')
-        : '$years سنوات ';
-  }
-
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/az_locale.dart b/lib/src/locale/locales/az_locale.dart
deleted file mode 100644
index 0196f425..00000000
--- a/lib/src/locale/locales/az_locale.dart
+++ /dev/null
@@ -1,104 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class AzLocale extends Locale {
-  @override
-  String code() => 'az';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => AzRelativeTime();
-}
-
-class AzRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => 'geri';
-  @override
-  String suffixFromNow() => 'sonra';
-  @override
-  String lessThanOneMinute(int seconds) => 'bir neçə saniyə';
-  @override
-  String aboutAMinute(int minutes) => 'dəqiqə';
-  @override
-  String minutes(int minutes) => '$minutes ${_convert(minutes, 'minutes')}';
-  @override
-  String aboutAnHour(int minutes) => 'saat';
-  @override
-  String hours(int hours) => '$hours ${_convert(hours, 'hours')}';
-  @override
-  String aDay(int hours) => 'gün';
-  @override
-  String days(int days) => '$days ${_convert(days, 'days')}';
-  @override
-  String aboutAMonth(int days) => 'ay';
-  @override
-  String months(int months) => '$months ${_convert(months, 'months')}';
-  @override
-  String aboutAYear(int year) => 'il';
-  @override
-  String years(int years) => '$years ${_convert(years, 'years')}';
-  @override
-  String wordSeparator() => ' ';
-}
-
-String _convert(int number, String type) {
-  var mod = number % 10;
-  var modH = number % 100;
-
-  if (mod == 1 && modH != 11) {
-    switch (type) {
-      case 'minutes':
-        return 'dəqiqə';
-      case 'hours':
-        return 'saat';
-      case 'days':
-        return 'gün';
-      case 'months':
-        return 'ay';
-      case 'years':
-        return 'il';
-      default:
-        return '';
-    }
-  } else if (<int>[2, 3, 4].contains(mod) &&
-      !<int>[12, 13, 14].contains(modH)) {
-    switch (type) {
-      case 'minutes':
-        return 'dəqiqə';
-      case 'hours':
-        return 'saat';
-      case 'days':
-        return 'gün';
-      case 'months':
-        return 'ay';
-      case 'years':
-        return 'il';
-      default:
-        return '';
-    }
-  }
-  switch (type) {
-    case 'minutes':
-      return 'dəqiqə';
-    case 'hours':
-      return 'saat';
-    case 'days':
-      return 'gün';
-    case 'months':
-      return 'ay';
-    case 'years':
-      return 'il';
-    default:
-      return '';
-  }
-}
diff --git a/lib/src/locale/locales/bn_locale.dart b/lib/src/locale/locales/bn_locale.dart
deleted file mode 100644
index 803dc791..00000000
--- a/lib/src/locale/locales/bn_locale.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../../utils/replace.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class BnLocale extends Locale {
-  @override
-  String code() => 'bn';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => BnRelativeTime();
-}
-
-class BnRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => 'আগে';
-  @override
-  String suffixFromNow() => 'পরে';
-  @override
-  String lessThanOneMinute(int seconds) => 'কিছু মুহূর্ত';
-  @override
-  String aboutAMinute(int minutes) => 'এক মিনিট';
-  @override
-  String minutes(int minutes) => replaceToLocaleNum('$minutes মিনিট', 'bn');
-  @override
-  String aboutAnHour(int minutes) => 'এক ঘন্টা';
-  @override
-  String hours(int hours) => replaceToLocaleNum('$hours ঘন্টা', 'bn');
-  @override
-  String aDay(int hours) => 'এক দিন';
-  @override
-  String days(int days) => replaceToLocaleNum('$days দিন', 'bn');
-  @override
-  String aboutAMonth(int days) => 'এক মাস';
-  @override
-  String months(int months) => replaceToLocaleNum('$months মাস', 'bn');
-  @override
-  String aboutAYear(int year) => 'এক বছর';
-  @override
-  String years(int years) => replaceToLocaleNum('$years বছর', 'bn');
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/cs_locale.dart b/lib/src/locale/locales/cs_locale.dart
deleted file mode 100644
index 05e74d09..00000000
--- a/lib/src/locale/locales/cs_locale.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class CsLocale extends Locale {
-  @override
-  String code() => 'cs';
-
-  @override
-  List<String> ordinals() => List.from(['.', '.', '.', '.'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => CsRelativeTime();
-}
-
-class CsRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => 'před';
-
-  @override
-  String prefixFromNow() => 'za';
-
-  @override
-  String suffixAgo() => '';
-
-  @override
-  String suffixFromNow() => '';
-
-  @override
-  String lessThanOneMinute(int seconds) => 'pár sekundami';
-
-  @override
-  String aboutAMinute(int minutes) => 'minutou';
-
-  @override
-  String minutes(int minutes) => '$minutes minutami';
-
-  @override
-  String aboutAnHour(int minutes) => 'hodinou';
-
-  @override
-  String hours(int hours) => '$hours hodinami';
-
-  @override
-  String aDay(int hours) => 'dnem';
-
-  @override
-  String days(int days) => '$days dny';
-
-  @override
-  String aboutAMonth(int days) => 'měsícem';
-
-  @override
-  String months(int months) => '$months měsíci';
-
-  @override
-  String aboutAYear(int year) => 'rokem';
-
-  @override
-  String years(int years) => '$years lety';
-
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/de_locale.dart b/lib/src/locale/locales/de_locale.dart
deleted file mode 100644
index 9a9f807c..00000000
--- a/lib/src/locale/locales/de_locale.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class DeLocale extends Locale {
-  @override
-  String code() => 'de';
-
-  @override
-  List<String> ordinals() => List.from(['.', '.', '.', '.'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => DeRelativeTime();
-}
-
-class DeDeLocale extends DeLocale {
-  @override
-  String code() => 'de_de';
-}
-
-class DeAtLocale extends DeLocale {
-  @override
-  String code() => 'de_at';
-}
-
-class DeChLocale extends DeLocale {
-  @override
-  String code() => 'de_ch';
-}
-
-class DeRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => 'vor';
-  @override
-  String prefixFromNow() => 'in';
-  @override
-  String suffixAgo() => '';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'ein paar Sekunden';
-  @override
-  String aboutAMinute(int minutes) => 'einer Minute';
-  @override
-  String minutes(int minutes) => '$minutes Minuten';
-  @override
-  String aboutAnHour(int minutes) => 'einer Stunde';
-  @override
-  String hours(int hours) => '$hours Stunden';
-  @override
-  String aDay(int hours) => 'einem Tag';
-  @override
-  String days(int days) => '$days Tagen';
-  @override
-  String aboutAMonth(int days) => 'einem Monat';
-  @override
-  String months(int months) => '$months Monaten';
-  @override
-  String aboutAYear(int year) => 'einem Jahr';
-  @override
-  String years(int years) => '$years Jahren';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/en_locale.dart b/lib/src/locale/locales/en_locale.dart
deleted file mode 100644
index a89ecc7e..00000000
--- a/lib/src/locale/locales/en_locale.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class EnLocale extends Locale {
-  @override
-  String code() => 'en';
-
-  @override
-  List<String> ordinals() =>
-      List.from(['st', 'nd', 'rd', 'th'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => EnRelativeTime();
-}
-
-class EnUsLocale extends EnLocale {
-  @override
-  String code() => 'en_us';
-}
-
-class EnSgLocale extends EnLocale {
-  @override
-  String code() => 'en_sg';
-}
-
-class EnAuLocale extends EnLocale {
-  @override
-  String code() => 'en_au';
-}
-
-class EnCaLocale extends EnLocale {
-  @override
-  String code() => 'en_ca';
-}
-
-class EnGbLocale extends EnLocale {
-  @override
-  String code() => 'en_gb';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-}
-
-class EnIeLocale extends EnLocale {
-  @override
-  String code() => 'en_ie';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-}
-
-class EnIlLocale extends EnLocale {
-  @override
-  String code() => 'en_il';
-}
-
-class EnNzLocale extends EnLocale {
-  @override
-  String code() => 'en_nz';
-}
-
-class EnRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'in';
-  @override
-  String suffixAgo() => 'ago';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'a few seconds';
-  @override
-  String aboutAMinute(int minutes) => 'a minute';
-  @override
-  String minutes(int minutes) => '$minutes minutes';
-  @override
-  String aboutAnHour(int minutes) => 'an hour';
-  @override
-  String hours(int hours) => '$hours hours';
-  @override
-  String aDay(int hours) => 'a day';
-  @override
-  String days(int days) => '$days days';
-  @override
-  String aboutAMonth(int days) => 'a month';
-  @override
-  String months(int months) => '$months months';
-  @override
-  String aboutAYear(int year) => 'a year';
-  @override
-  String years(int years) => '$years years';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/es_locale.dart b/lib/src/locale/locales/es_locale.dart
deleted file mode 100644
index 4b14a102..00000000
--- a/lib/src/locale/locales/es_locale.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class EsLocale extends Locale {
-  @override
-  String code() => 'es';
-
-  @override
-  List<String> ordinals() => List.from(['º', 'º', 'º', 'º'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => EsRelativeTime();
-}
-
-class EsDoLocale extends EsLocale {
-  @override
-  String code() => 'es_do';
-}
-
-class EsUsLocale extends EsLocale {
-  @override
-  String code() => 'es_us';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-}
-
-class EsRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => 'hace';
-  @override
-  String prefixFromNow() => 'en';
-  @override
-  String suffixAgo() => '';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'un momento';
-  @override
-  String aboutAMinute(int minutes) => 'un minuto';
-  @override
-  String minutes(int minutes) => '$minutes minutos';
-  @override
-  String aboutAnHour(int minutes) => 'una hora';
-  @override
-  String hours(int hours) => '$hours horas';
-  @override
-  String aDay(int hours) => 'un día';
-  @override
-  String days(int days) => '$days días';
-  @override
-  String aboutAMonth(int days) => 'un mes';
-  @override
-  String months(int months) => '$months meses';
-  @override
-  String aboutAYear(int year) => 'un año';
-  @override
-  String years(int years) => '$years años';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/fa_locale.dart b/lib/src/locale/locales/fa_locale.dart
deleted file mode 100644
index 51a3ccfc..00000000
--- a/lib/src/locale/locales/fa_locale.dart
+++ /dev/null
@@ -1,78 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../../utils/replace.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class FaLocale extends Locale {
-  @override
-  String code() => 'fa';
-
-  @override
-  List<String> ordinals() => List.from(['م', 'م', 'م', 'م'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.saturday;
-
-  @override
-  RelativeDateTime relativeDateTime() => FaRelativeTime();
-}
-
-class FaRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => 'پیش';
-  @override
-  String suffixFromNow() => 'بعد';
-  @override
-  String lessThanOneMinute(int seconds) => 'چند ثانیه';
-  @override
-  String aboutAMinute(int minutes) => 'یک دقیقه';
-  @override
-  String minutes(int minutes) {
-    String result;
-    result = '$minutes دقیقه ';
-    return replaceToLocaleNum(result, 'fa');
-  }
-
-  @override
-  String aboutAnHour(int minutes) => 'یک ساعت';
-  @override
-  String hours(int hours) {
-    String result;
-    result = '$hours ساعت ';
-    return replaceToLocaleNum(result, 'fa');
-  }
-
-  @override
-  String aDay(int hours) => 'یک روز';
-  @override
-  String days(int days) {
-    String result;
-    result = '$days روز ';
-    return replaceToLocaleNum(result, 'fa');
-  }
-
-  @override
-  String aboutAMonth(int days) => 'یک ماه';
-  @override
-  String months(int months) {
-    String result;
-    result = '$months ماه ';
-    return replaceToLocaleNum(result, 'fa');
-  }
-
-  @override
-  String aboutAYear(int year) => 'یک سال';
-  @override
-  String years(int years) {
-    String result;
-    result = '$years سال ';
-    return replaceToLocaleNum(result, 'fa');
-  }
-
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/fr_locale.dart b/lib/src/locale/locales/fr_locale.dart
deleted file mode 100644
index 831222f8..00000000
--- a/lib/src/locale/locales/fr_locale.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class FrLocale extends Locale {
-  @override
-  String code() => 'fr';
-
-  @override
-  List<String> ordinals() => List.from(['er', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => FrRelativeTime();
-}
-
-class FrChLocale extends FrLocale {
-  @override
-  String code() => 'fr_ch';
-}
-
-class FrCaLocale extends FrLocale {
-  @override
-  String code() => 'fr_ca';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-}
-
-class FrRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => 'il y a';
-  @override
-  String prefixFromNow() => 'dans';
-  @override
-  String suffixAgo() => '';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'quelques secondes';
-  @override
-  String aboutAMinute(int minutes) => 'une minute';
-  @override
-  String minutes(int minutes) => '$minutes minutes';
-  @override
-  String aboutAnHour(int minutes) => 'une heure';
-  @override
-  String hours(int hours) => '$hours heures';
-  @override
-  String aDay(int hours) => 'un jour';
-  @override
-  String days(int days) => '$days jours';
-  @override
-  String aboutAMonth(int days) => 'un mois';
-  @override
-  String months(int months) => '$months mois';
-  @override
-  String aboutAYear(int year) => 'un an';
-  @override
-  String years(int years) => '$years ans';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/hi_locale.dart b/lib/src/locale/locales/hi_locale.dart
deleted file mode 100644
index 08d0cd5c..00000000
--- a/lib/src/locale/locales/hi_locale.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class HiLocale extends Locale {
-  @override
-  String code() => 'hi';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => HiRelativeTime();
-}
-
-class HiRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => 'पहले';
-  @override
-  String suffixFromNow() => 'में';
-  @override
-  String lessThanOneMinute(int seconds) => 'कुछ ही क्षण';
-  @override
-  String aboutAMinute(int minutes) => 'एक मिनट';
-  @override
-  String minutes(int minutes) => '$minutes मिनट';
-  @override
-  String aboutAnHour(int minutes) => 'एक घंटा';
-  @override
-  String hours(int hours) => '$hours घंटे';
-  @override
-  String aDay(int hours) => 'एक दिन';
-  @override
-  String days(int days) => '$days दिन';
-  @override
-  String aboutAMonth(int days) => 'एक महीने';
-  @override
-  String months(int months) => '$months महीने';
-  @override
-  String aboutAYear(int year) => 'एक वर्ष';
-  @override
-  String years(int years) => '$years वर्ष';
-
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/hu_locale.dart b/lib/src/locale/locales/hu_locale.dart
deleted file mode 100644
index 1c543519..00000000
--- a/lib/src/locale/locales/hu_locale.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class HuLocale extends Locale {
-  @override
-  String code() => 'hu';
-
-  @override
-  List<String> ordinals() => List.from(['.', '.', '.', '.'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => HuRelativeTime();
-}
-
-class HuHuLocale extends HuLocale {
-  @override
-  String code() => 'hu_hu';
-}
-
-class HuRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => 'ezelőtt';
-  @override
-  String suffixFromNow() => 'ezután';
-  @override
-  String lessThanOneMinute(int seconds) => 'néhány másodperccel';
-  @override
-  String aboutAMinute(int minutes) => 'egy perccel';
-  @override
-  String minutes(int minutes) => '$minutes perccel';
-  @override
-  String aboutAnHour(int minutes) => 'egy órával';
-  @override
-  String hours(int hours) => '$hours órával';
-  @override
-  String aDay(int hours) => 'egy nappal';
-  @override
-  String days(int days) => '$days nappal';
-  @override
-  String aboutAMonth(int days) => 'egy hónappal';
-  @override
-  String months(int months) => '$months hónappal';
-  @override
-  String aboutAYear(int year) => 'egy évvel';
-  @override
-  String years(int years) => '$years évvel';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/id_locale.dart b/lib/src/locale/locales/id_locale.dart
deleted file mode 100644
index b4bffc6a..00000000
--- a/lib/src/locale/locales/id_locale.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class IdLocale extends Locale {
-  @override
-  String code() => 'id';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => IdRelativeTime();
-}
-
-class IdRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'dalam';
-  @override
-  String suffixAgo() => 'yang lalu';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'beberapa detik';
-  @override
-  String aboutAMinute(int minutes) => 'satu menit';
-  @override
-  String minutes(int minutes) => '$minutes menit';
-  @override
-  String aboutAnHour(int minutes) => 'satu jam';
-  @override
-  String hours(int hours) => '$hours jam';
-  @override
-  String aDay(int hours) => 'satu hari';
-  @override
-  String days(int days) => '$days hari';
-  @override
-  String aboutAMonth(int days) => 'satu bulan';
-  @override
-  String months(int months) => '$months bulan';
-  @override
-  String aboutAYear(int year) => 'satu tahun';
-  @override
-  String years(int years) => '$years tahun';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/it_locale.dart b/lib/src/locale/locales/it_locale.dart
deleted file mode 100644
index 30918276..00000000
--- a/lib/src/locale/locales/it_locale.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class ItLocale extends Locale {
-  @override
-  String code() => 'it';
-
-  @override
-  List<String> ordinals() => List.from(['º', 'º', 'º', 'º'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ItRelativeTime();
-}
-
-class ItChLocale extends ItLocale {
-  @override
-  String code() => 'it_ch';
-}
-
-class ItRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'tra';
-  @override
-  String suffixAgo() => 'fa';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'alcuni secondi';
-  @override
-  String aboutAMinute(int minutes) => 'un minuto';
-  @override
-  String minutes(int minutes) => '$minutes minuti';
-  @override
-  String aboutAnHour(int minutes) => 'un\'ora';
-  @override
-  String hours(int hours) => '$hours ore';
-  @override
-  String aDay(int hours) => 'un giorno';
-  @override
-  String days(int days) => '$days giorni';
-  @override
-  String aboutAMonth(int days) => 'un mese';
-  @override
-  String months(int months) => '$months mesi';
-  @override
-  String aboutAYear(int year) => 'un anno';
-  @override
-  String years(int years) => '$years anni';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/ja_locale.dart b/lib/src/locale/locales/ja_locale.dart
deleted file mode 100644
index 8d80e657..00000000
--- a/lib/src/locale/locales/ja_locale.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class JaLocale extends Locale {
-  @override
-  String code() => 'ja';
-
-  @override
-  List<String> ordinals() => List.from(['日', '日', '日', '日'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => JaRelativeTime();
-}
-
-class JaRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => '前';
-  @override
-  String suffixFromNow() => '後';
-  @override
-  String lessThanOneMinute(int seconds) => '数秒';
-  @override
-  String aboutAMinute(int minutes) => '1分';
-  @override
-  String minutes(int minutes) => '$minutes分';
-  @override
-  String aboutAnHour(int minutes) => '1時間';
-  @override
-  String hours(int hours) => '$hours時間';
-  @override
-  String aDay(int hours) => '1日';
-  @override
-  String days(int days) => '$days日';
-  @override
-  String aboutAMonth(int days) => '1ヶ月';
-  @override
-  String months(int months) => '$monthsヶ月';
-  @override
-  String aboutAYear(int year) => '1年';
-  @override
-  String years(int years) => '$years年';
-  @override
-  String wordSeparator() => '';
-}
diff --git a/lib/src/locale/locales/ko_locale.dart b/lib/src/locale/locales/ko_locale.dart
deleted file mode 100644
index 9fcad645..00000000
--- a/lib/src/locale/locales/ko_locale.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class KoLocale extends Locale {
-  @override
-  String code() => 'ko';
-
-  @override
-  List<String> ordinals() => List.from(['일', '일', '일', '일'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => KoRelativeTime();
-}
-
-class KoRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => '전';
-  @override
-  String suffixFromNow() => '후';
-  @override
-  String lessThanOneMinute(int seconds) => '몇 초';
-  @override
-  String aboutAMinute(int minutes) => '1분';
-  @override
-  String minutes(int minutes) => '$minutes분';
-  @override
-  String aboutAnHour(int minutes) => '한 시간';
-  @override
-  String hours(int hours) => '$hours시간';
-  @override
-  String aDay(int hours) => '하루';
-  @override
-  String days(int days) => '$days일';
-  @override
-  String aboutAMonth(int days) => '한 달';
-  @override
-  String months(int months) => '$months달';
-  @override
-  String aboutAYear(int year) => '일 년';
-  @override
-  String years(int years) => '$years년';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/nb_locale.dart b/lib/src/locale/locales/nb_locale.dart
deleted file mode 100644
index 54ee4bc4..00000000
--- a/lib/src/locale/locales/nb_locale.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class NbLocale extends Locale {
-  @override
-  String code() => 'nb';
-
-  @override
-  List<String> ordinals() => List.from(['.', '.', '.', '.'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => NbRelativeTime();
-}
-
-class NbRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'om';
-  @override
-  String suffixAgo() => 'siden';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'noen sekunder';
-  @override
-  String aboutAMinute(int minutes) => 'ett minutt';
-  @override
-  String minutes(int minutes) => '$minutes minutter';
-  @override
-  String aboutAnHour(int minutes) => 'en time';
-  @override
-  String hours(int hours) => '$hours timer';
-  @override
-  String aDay(int hours) => 'en dag';
-  @override
-  String days(int days) => '$days dager';
-  @override
-  String aboutAMonth(int days) => 'en måned';
-  @override
-  String months(int months) => '$months måneder';
-  @override
-  String aboutAYear(int year) => 'ett år';
-  @override
-  String years(int years) => '$years år';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/nl_locale.dart b/lib/src/locale/locales/nl_locale.dart
deleted file mode 100644
index 05df4af8..00000000
--- a/lib/src/locale/locales/nl_locale.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class NlLocale extends Locale {
-  @override
-  String code() => 'nl';
-
-  @override
-  List<String> ordinals() => List.from(['.', '.', '.', '.'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => NlRelativeTime();
-}
-
-class NlRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => 'geleden';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) =>
-      seconds > 0 ? 'op dit moment' : 'een ogenblik';
-  @override
-  String aboutAMinute(int minutes) => 'een minuut';
-  @override
-  String minutes(int minutes) => '$minutes minuten';
-  @override
-  String aboutAnHour(int minutes) => 'een uur';
-  @override
-  String hours(int hours) => '$hours uur';
-  @override
-  String aDay(int hours) => 'een dag';
-  @override
-  String days(int days) => '$days dagen';
-  @override
-  String aboutAMonth(int days) => 'een maand';
-  @override
-  String months(int months) => '$months maanden';
-  @override
-  String aboutAYear(int year) => 'een jaar';
-  @override
-  String years(int years) => '$years jaar';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/pl_locale.dart b/lib/src/locale/locales/pl_locale.dart
deleted file mode 100644
index adfc47a3..00000000
--- a/lib/src/locale/locales/pl_locale.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class PlLocale extends Locale {
-  @override
-  String code() => 'pl';
-
-  @override
-  List<String> ordinals() => List.from(['.', '.', '.', '.'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => PlRelativeTime();
-}
-
-class PlRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'za';
-  @override
-  String suffixAgo() => 'temu';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'kilka sekund';
-  @override
-  String aboutAMinute(int minutes) => 'minutę';
-  @override
-  String minutes(int minutes) {
-    String result;
-    if (minutes >= 1 && minutes <= 4) {
-      result = 'minuty';
-    } else {
-      result = 'minut';
-    }
-    return '$minutes $result';
-  }
-
-  @override
-  String aboutAnHour(int minutes) => 'godzinę';
-  @override
-  String hours(int hours) {
-    String result;
-    if (hours >= 1 && hours <= 4) {
-      result = 'godziny';
-    } else {
-      result = 'godzin';
-    }
-    return '$hours $result';
-  }
-
-  @override
-  String aDay(int hours) => '1 dzień';
-  @override
-  String days(int days) => '$days dni';
-  @override
-  String aboutAMonth(int days) => 'miesiąc';
-  @override
-  String months(int months) {
-    String result;
-    if (months >= 1 && months <= 4) {
-      result = 'miesiące';
-    } else {
-      result = 'miesięcy';
-    }
-    return '$months $result';
-  }
-
-  @override
-  String aboutAYear(int year) => 'rok';
-  @override
-  String years(int years) {
-    String result;
-    if (years >= 1 && years <= 4) {
-      result = 'lata';
-    } else {
-      result = 'lat';
-    }
-    return '$years $result';
-  }
-
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/pt_locale.dart b/lib/src/locale/locales/pt_locale.dart
deleted file mode 100644
index a9318d50..00000000
--- a/lib/src/locale/locales/pt_locale.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class PtLocale extends Locale {
-  @override
-  String code() => 'pt';
-
-  @override
-  List<String> ordinals() => List.from(['º', 'º', 'º', 'º'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => PtRelativeTime();
-}
-
-class PtBrLocale extends PtLocale {
-  @override
-  String code() => 'pt_br';
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-}
-
-class PtRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => 'há';
-  @override
-  String prefixFromNow() => 'em';
-  @override
-  String suffixAgo() => '';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'segundos';
-  @override
-  String aboutAMinute(int minutes) => 'um minuto';
-  @override
-  String minutes(int minutes) => '$minutes minutos';
-  @override
-  String aboutAnHour(int minutes) => 'uma hora';
-  @override
-  String hours(int hours) => '$hours horas';
-  @override
-  String aDay(int hours) => 'um dia';
-  @override
-  String days(int days) => '$days dias';
-  @override
-  String aboutAMonth(int days) => 'um mês';
-  @override
-  String months(int months) => '$months meses';
-  @override
-  String aboutAYear(int year) => 'um ano';
-  @override
-  String years(int years) => '$years anos';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/ru_locale.dart b/lib/src/locale/locales/ru_locale.dart
deleted file mode 100644
index 87c8c096..00000000
--- a/lib/src/locale/locales/ru_locale.dart
+++ /dev/null
@@ -1,104 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class RuLocale extends Locale {
-  @override
-  String code() => 'ru';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => RuRelativeTime();
-}
-
-class RuRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'через';
-  @override
-  String suffixAgo() => 'назад';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'несколько секунд';
-  @override
-  String aboutAMinute(int minutes) => 'минуту';
-  @override
-  String minutes(int minutes) => '$minutes ${_convert(minutes, 'minutes')}';
-  @override
-  String aboutAnHour(int minutes) => 'час';
-  @override
-  String hours(int hours) => '$hours ${_convert(hours, 'hours')}';
-  @override
-  String aDay(int hours) => 'день';
-  @override
-  String days(int days) => '$days ${_convert(days, 'days')}';
-  @override
-  String aboutAMonth(int days) => 'месяц';
-  @override
-  String months(int months) => '$months ${_convert(months, 'months')}';
-  @override
-  String aboutAYear(int year) => 'год';
-  @override
-  String years(int years) => '$years ${_convert(years, 'years')}';
-  @override
-  String wordSeparator() => ' ';
-}
-
-String _convert(int number, String type) {
-  var mod = number % 10;
-  var modH = number % 100;
-
-  if (mod == 1 && modH != 11) {
-    switch (type) {
-      case 'minutes':
-        return 'минуту';
-      case 'hours':
-        return 'час';
-      case 'days':
-        return 'день';
-      case 'months':
-        return 'месяц';
-      case 'years':
-        return 'год';
-      default:
-        return '';
-    }
-  } else if (<int>[2, 3, 4].contains(mod) &&
-      !<int>[12, 13, 14].contains(modH)) {
-    switch (type) {
-      case 'minutes':
-        return 'минуты';
-      case 'hours':
-        return 'часа';
-      case 'days':
-        return 'дня';
-      case 'months':
-        return 'месяца';
-      case 'years':
-        return 'года';
-      default:
-        return '';
-    }
-  }
-  switch (type) {
-    case 'minutes':
-      return 'минут';
-    case 'hours':
-      return 'часов';
-    case 'days':
-      return 'дней';
-    case 'months':
-      return 'месяцев';
-    case 'years':
-      return 'лет';
-    default:
-      return '';
-  }
-}
diff --git a/lib/src/locale/locales/sk_locale.dart b/lib/src/locale/locales/sk_locale.dart
deleted file mode 100644
index db30a9e6..00000000
--- a/lib/src/locale/locales/sk_locale.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-import 'package:jiffy/src/enums/start_of_week.dart';
-import 'package:jiffy/src/locale/locale.dart';
-import 'package:jiffy/src/locale/relative_date_time.dart';
-
-class SkLocale extends Locale {
-  @override
-  String code() => 'sk';
-
-  @override
-  List<String> ordinals() => List.from(['.', '.', '.', '.'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => SkRelativeTime();
-}
-
-class SkRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => 'pred';
-
-  @override
-  String prefixFromNow() => 'za';
-
-  @override
-  String suffixAgo() => '';
-
-  @override
-  String suffixFromNow() => '';
-
-  @override
-  String lessThanOneMinute(int seconds) => 'pár sekundami';
-
-  @override
-  String aboutAMinute(int minutes) => 'minútou';
-
-  @override
-  String minutes(int minutes) => '$minutes minútami';
-
-  @override
-  String aboutAnHour(int minutes) => 'hodinou';
-
-  @override
-  String hours(int hours) => '$hours hodinami';
-
-  @override
-  String aDay(int hours) => 'dňom';
-
-  @override
-  String days(int days) => '$days dňami';
-
-  @override
-  String aboutAMonth(int days) => 'mesiacom';
-
-  @override
-  String months(int months) => '$months mesiacmi';
-
-  @override
-  String aboutAYear(int year) => 'rokom';
-
-  @override
-  String years(int years) => '$years rokmi';
-
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/sv_locale.dart b/lib/src/locale/locales/sv_locale.dart
deleted file mode 100644
index d663c8c4..00000000
--- a/lib/src/locale/locales/sv_locale.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class SvLocale extends Locale {
-  @override
-  String code() => 'sv';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => SvRelativeTime();
-}
-
-class SvRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'om';
-  @override
-  String suffixAgo() => 'sedan';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'några sekunder';
-  @override
-  String aboutAMinute(int minutes) => 'en minut';
-  @override
-  String minutes(int minutes) => '$minutes minuter';
-  @override
-  String aboutAnHour(int minutes) => 'en timme';
-  @override
-  String hours(int hours) => '$hours timmar';
-  @override
-  String aDay(int hours) => 'en dag';
-  @override
-  String days(int days) => '$days dagar';
-  @override
-  String aboutAMonth(int days) => 'en månad';
-  @override
-  String months(int months) => '$months månader';
-  @override
-  String aboutAYear(int year) => 'ett år';
-  @override
-  String years(int years) => '$years år';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/th_locale.dart b/lib/src/locale/locales/th_locale.dart
deleted file mode 100644
index c66da3aa..00000000
--- a/lib/src/locale/locales/th_locale.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class ThLocale extends Locale {
-  @override
-  String code() => 'th';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ThRelativeTime();
-}
-
-class ThRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'อีก';
-  @override
-  String suffixAgo() => 'ที่แล้ว';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'ไม่กี่วินาที';
-  @override
-  String aboutAMinute(int minutes) => '1 นาที';
-  @override
-  String minutes(int minutes) => '$minutes นาที';
-  @override
-  String aboutAnHour(int minutes) => '1 ชั่วโมง';
-  @override
-  String hours(int hours) => '$hours ชั่วโมง';
-  @override
-  String aDay(int hours) => '1 วัน';
-  @override
-  String days(int days) => '$days วัน';
-  @override
-  String aboutAMonth(int days) => '1 เดือน';
-  @override
-  String months(int months) => '$months เดือน';
-  @override
-  String aboutAYear(int year) => '1 ปี';
-  @override
-  String years(int years) => '$years ปี';
-  @override
-  String wordSeparator() => '';
-}
diff --git a/lib/src/locale/locales/tr_locale.dart b/lib/src/locale/locales/tr_locale.dart
deleted file mode 100644
index 9f8f6a12..00000000
--- a/lib/src/locale/locales/tr_locale.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class TrLocale extends Locale {
-  @override
-  String code() => 'tr';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => TrRelativeTime();
-}
-
-class TrRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => 'önce';
-  @override
-  String suffixFromNow() => 'içinde';
-  @override
-  String lessThanOneMinute(int seconds) => 'birkaç saniye';
-  @override
-  String aboutAMinute(int minutes) => 'bir dakika';
-  @override
-  String minutes(int minutes) => '$minutes dakika';
-  @override
-  String aboutAnHour(int minutes) => 'bir saat';
-  @override
-  String hours(int hours) => '$hours saat';
-  @override
-  String aDay(int hours) => 'bir gün';
-  @override
-  String days(int days) => '$days gün';
-  @override
-  String aboutAMonth(int days) => 'bir ay';
-  @override
-  String months(int months) => '$months ay';
-  @override
-  String aboutAYear(int year) => 'bir yıl';
-  @override
-  String years(int years) => '$years yıl';
-  @override
-  String wordSeparator() => ' ';
-}
diff --git a/lib/src/locale/locales/uk_locale.dart b/lib/src/locale/locales/uk_locale.dart
deleted file mode 100644
index 589fb3b5..00000000
--- a/lib/src/locale/locales/uk_locale.dart
+++ /dev/null
@@ -1,104 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class UkLocale extends Locale {
-  @override
-  String code() => 'uk';
-
-  @override
-  List<String> ordinals() => List.from(['', '', '', ''], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => UkRelativeTime();
-}
-
-class UkRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => 'через';
-  @override
-  String suffixAgo() => 'тому';
-  @override
-  String suffixFromNow() => '';
-  @override
-  String lessThanOneMinute(int seconds) => 'декілька секунд';
-  @override
-  String aboutAMinute(int minutes) => 'хвилину';
-  @override
-  String minutes(int minutes) => '$minutes ${_convert(minutes, 'minutes')}';
-  @override
-  String aboutAnHour(int minutes) => 'годину';
-  @override
-  String hours(int hours) => '$hours ${_convert(hours, 'hours')}';
-  @override
-  String aDay(int hours) => 'день';
-  @override
-  String days(int days) => '$days ${_convert(days, 'days')}';
-  @override
-  String aboutAMonth(int days) => 'місяць';
-  @override
-  String months(int months) => '$months ${_convert(months, 'months')}';
-  @override
-  String aboutAYear(int year) => 'рік';
-  @override
-  String years(int years) => '$years ${_convert(years, 'years')}';
-  @override
-  String wordSeparator() => ' ';
-}
-
-String _convert(int number, String type) {
-  var mod = number % 10;
-  var modH = number % 100;
-
-  if (mod == 1 && modH != 11) {
-    switch (type) {
-      case 'minutes':
-        return 'хвилину';
-      case 'hours':
-        return 'годину';
-      case 'days':
-        return 'день';
-      case 'months':
-        return 'місяць';
-      case 'years':
-        return 'рік';
-      default:
-        return '';
-    }
-  } else if (<int>[2, 3, 4].contains(mod) &&
-      !<int>[12, 13, 14].contains(modH)) {
-    switch (type) {
-      case 'minutes':
-        return 'хвилини';
-      case 'hours':
-        return 'години';
-      case 'days':
-        return 'дні';
-      case 'months':
-        return 'місяці';
-      case 'years':
-        return 'роки';
-      default:
-        return '';
-    }
-  }
-  switch (type) {
-    case 'minutes':
-      return 'хвилин';
-    case 'hours':
-      return 'годин';
-    case 'days':
-      return 'днів';
-    case 'months':
-      return 'місяців';
-    case 'years':
-      return 'років';
-    default:
-      return '';
-  }
-}
diff --git a/lib/src/locale/locales/zh_locale.dart b/lib/src/locale/locales/zh_locale.dart
deleted file mode 100644
index 91d75b8d..00000000
--- a/lib/src/locale/locales/zh_locale.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-import '../../enums/start_of_week.dart';
-import '../locale.dart';
-import '../relative_date_time.dart';
-
-class ZhLocale extends Locale {
-  @override
-  String code() => 'zh';
-
-  @override
-  List<String> ordinals() => List.from(['日', '日', '日', '日'], growable: false);
-
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.sunday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ZhRelativeTime();
-}
-
-class ZhCnLocale extends ZhLocale {
-  @override
-  String code() => 'zh_cn';
-
-  /// Per https://www.unicode.org/cldr/charts/42/supplemental/territory_information.html
-  /// China	First day of week is monday
-  @override
-  StartOfWeek startOfWeek() => StartOfWeek.monday;
-
-  @override
-  RelativeDateTime relativeDateTime() => ZhCnRelativeTime();
-}
-
-class ZhHkLocale extends ZhLocale {
-  @override
-  String code() => 'zh_hk';
-}
-
-class ZhTwLocale extends ZhLocale {
-  @override
-  String code() => 'zh_tw';
-}
-
-class ZhRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => '前';
-  @override
-  String suffixFromNow() => '内';
-  @override
-  String lessThanOneMinute(int seconds) => '幾秒';
-  @override
-  String aboutAMinute(int minutes) => '1 分鐘';
-  @override
-  String minutes(int minutes) => '$minutes 分鐘';
-  @override
-  String aboutAnHour(int minutes) => '1 小時';
-  @override
-  String hours(int hours) => '$hours 小時';
-  @override
-  String aDay(int hours) => '1 天';
-  @override
-  String days(int days) => '$days 天';
-  @override
-  String aboutAMonth(int days) => '1 個月';
-  @override
-  String months(int months) => '$months 個月';
-  @override
-  String aboutAYear(int year) => '1 年';
-  @override
-  String years(int years) => '$years 年';
-  @override
-  String wordSeparator() => '';
-}
-
-class ZhCnRelativeTime extends RelativeDateTime {
-  @override
-  String prefixAgo() => '';
-  @override
-  String prefixFromNow() => '';
-  @override
-  String suffixAgo() => '前';
-  @override
-  String suffixFromNow() => '内';
-  @override
-  String lessThanOneMinute(int seconds) => '几秒';
-  @override
-  String aboutAMinute(int minutes) => '1 分钟';
-  @override
-  String minutes(int minutes) => '$minutes 分钟';
-  @override
-  String aboutAnHour(int minutes) => '1 小时';
-  @override
-  String hours(int hours) => '$hours 小时';
-  @override
-  String aDay(int hours) => '1 天';
-  @override
-  String days(int days) => '$days 天';
-  @override
-  String aboutAMonth(int days) => '1 个月';
-  @override
-  String months(int months) => '$months 个月';
-  @override
-  String aboutAYear(int year) => '1 年';
-  @override
-  String years(int years) => '$years 年';
-  @override
-  String wordSeparator() => '';
-}
diff --git a/lib/src/locale/ordinals.dart b/lib/src/locale/ordinals.dart
new file mode 100644
index 00000000..a724f523
--- /dev/null
+++ b/lib/src/locale/ordinals.dart
@@ -0,0 +1,41 @@
+import 'package:jiffy/src/utils/jiffy_exception.dart';
+import 'package:quiver/core.dart';
+
+class Ordinals {
+  final String first;
+  final String second;
+  final String third;
+  final String nth;
+
+  Ordinals({
+    required this.first,
+    required this.second,
+    required this.third,
+    required this.nth,
+  });
+
+  String getOrdinal(int date) {
+    if (date <= 0) throw JiffyException('The date must be a positive integer.');
+    final ordinals = asList();
+    var suffix = ordinals.last;
+    final digit = date % 10;
+    if ((digit > 0 && digit < 4) && (date < 11 || date > 13)) {
+      suffix = ordinals[digit - 1];
+    }
+    return suffix;
+  }
+
+  List<String> asList() =>
+      List.from([first, second, third, nth], growable: false);
+
+  @override
+  bool operator ==(Object other) => (other is Ordinals)
+      ? (first == other.first &&
+          second == other.second &&
+          third == other.third &&
+          nth == other.nth)
+      : false;
+
+  @override
+  int get hashCode => hash4(first, second, third, nth);
+}
diff --git a/lib/src/locale/relative_date_time.dart b/lib/src/locale/relative_date_time.dart
index e9fe6dfb..ac750bfc 100644
--- a/lib/src/locale/relative_date_time.dart
+++ b/lib/src/locale/relative_date_time.dart
@@ -1,18 +1,1746 @@
+import 'package:quiver/core.dart';
+import '../../jiffy.dart';
+import '../utils/replace.dart';
+
 abstract class RelativeDateTime {
   String prefixAgo();
+
   String prefixFromNow();
+
   String suffixAgo();
+
   String suffixFromNow();
+
   String lessThanOneMinute(int seconds);
+
   String aboutAMinute(int minutes);
+
   String minutes(int minutes);
+
   String aboutAnHour(int minutes);
+
   String hours(int hours);
+
   String aDay(int hours);
+
   String days(int days);
+
   String aboutAMonth(int days);
+
   String months(int months);
+
   String aboutAYear(int year);
+
   String years(int years);
+
   String wordSeparator();
+
+  @override
+  bool operator ==(Object other) => (other is RelativeDateTime);
+
+  @override
+  int get hashCode => hashObjects([this]);
+}
+
+class EnRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'in';
+
+  @override
+  String suffixAgo() => 'ago';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'a few seconds';
+
+  @override
+  String aboutAMinute(int minutes) => 'a minute';
+
+  @override
+  String minutes(int minutes) => '$minutes minutes';
+
+  @override
+  String aboutAnHour(int minutes) => 'an hour';
+
+  @override
+  String hours(int hours) => '$hours hours';
+
+  @override
+  String aDay(int hours) => 'a day';
+
+  @override
+  String days(int days) => '$days days';
+
+  @override
+  String aboutAMonth(int days) => 'a month';
+
+  @override
+  String months(int months) => '$months months';
+
+  @override
+  String aboutAYear(int year) => 'a year';
+
+  @override
+  String years(int years) => '$years years';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class EsRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => 'hace';
+
+  @override
+  String prefixFromNow() => 'en';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'un momento';
+
+  @override
+  String aboutAMinute(int minutes) => 'un minuto';
+
+  @override
+  String minutes(int minutes) => '$minutes minutos';
+
+  @override
+  String aboutAnHour(int minutes) => 'una hora';
+
+  @override
+  String hours(int hours) => '$hours horas';
+
+  @override
+  String aDay(int hours) => 'un día';
+
+  @override
+  String days(int days) => '$days días';
+
+  @override
+  String aboutAMonth(int days) => 'un mes';
+
+  @override
+  String months(int months) => '$months meses';
+
+  @override
+  String aboutAYear(int year) => 'un año';
+
+  @override
+  String years(int years) => '$years años';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class FrRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => 'il y a';
+
+  @override
+  String prefixFromNow() => 'dans';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'quelques secondes';
+
+  @override
+  String aboutAMinute(int minutes) => 'une minute';
+
+  @override
+  String minutes(int minutes) => '$minutes minutes';
+
+  @override
+  String aboutAnHour(int minutes) => 'une heure';
+
+  @override
+  String hours(int hours) => '$hours heures';
+
+  @override
+  String aDay(int hours) => 'un jour';
+
+  @override
+  String days(int days) => '$days jours';
+
+  @override
+  String aboutAMonth(int days) => 'un mois';
+
+  @override
+  String months(int months) => '$months mois';
+
+  @override
+  String aboutAYear(int year) => 'un an';
+
+  @override
+  String years(int years) => '$years ans';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class ZhRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => '前';
+
+  @override
+  String suffixFromNow() => '内';
+
+  @override
+  String lessThanOneMinute(int seconds) => '幾秒';
+
+  @override
+  String aboutAMinute(int minutes) => '1 分鐘';
+
+  @override
+  String minutes(int minutes) => '$minutes 分鐘';
+
+  @override
+  String aboutAnHour(int minutes) => '1 小時';
+
+  @override
+  String hours(int hours) => '$hours 小時';
+
+  @override
+  String aDay(int hours) => '1 天';
+
+  @override
+  String days(int days) => '$days 天';
+
+  @override
+  String aboutAMonth(int days) => '1 個月';
+
+  @override
+  String months(int months) => '$months 個月';
+
+  @override
+  String aboutAYear(int year) => '1 年';
+
+  @override
+  String years(int years) => '$years 年';
+
+  @override
+  String wordSeparator() => '';
+}
+
+class ZhCnRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => '前';
+
+  @override
+  String suffixFromNow() => '内';
+
+  @override
+  String lessThanOneMinute(int seconds) => '几秒';
+
+  @override
+  String aboutAMinute(int minutes) => '1 分钟';
+
+  @override
+  String minutes(int minutes) => '$minutes 分钟';
+
+  @override
+  String aboutAnHour(int minutes) => '1 小时';
+
+  @override
+  String hours(int hours) => '$hours 小时';
+
+  @override
+  String aDay(int hours) => '1 天';
+
+  @override
+  String days(int days) => '$days 天';
+
+  @override
+  String aboutAMonth(int days) => '1 个月';
+
+  @override
+  String months(int months) => '$months 个月';
+
+  @override
+  String aboutAYear(int year) => '1 年';
+
+  @override
+  String years(int years) => '$years 年';
+
+  @override
+  String wordSeparator() => '';
+}
+
+class DeRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => 'vor';
+
+  @override
+  String prefixFromNow() => 'in';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'ein paar Sekunden';
+
+  @override
+  String aboutAMinute(int minutes) => 'einer Minute';
+
+  @override
+  String minutes(int minutes) => '$minutes Minuten';
+
+  @override
+  String aboutAnHour(int minutes) => 'einer Stunde';
+
+  @override
+  String hours(int hours) => '$hours Stunden';
+
+  @override
+  String aDay(int hours) => 'einem Tag';
+
+  @override
+  String days(int days) => '$days Tagen';
+
+  @override
+  String aboutAMonth(int days) => 'einem Monat';
+
+  @override
+  String months(int months) => '$months Monaten';
+
+  @override
+  String aboutAYear(int year) => 'einem Jahr';
+
+  @override
+  String years(int years) => '$years Jahren';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class ItRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'tra';
+
+  @override
+  String suffixAgo() => 'fa';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'alcuni secondi';
+
+  @override
+  String aboutAMinute(int minutes) => 'un minuto';
+
+  @override
+  String minutes(int minutes) => '$minutes minuti';
+
+  @override
+  String aboutAnHour(int minutes) => 'un\'ora';
+
+  @override
+  String hours(int hours) => '$hours ore';
+
+  @override
+  String aDay(int hours) => 'un giorno';
+
+  @override
+  String days(int days) => '$days giorni';
+
+  @override
+  String aboutAMonth(int days) => 'un mese';
+
+  @override
+  String months(int months) => '$months mesi';
+
+  @override
+  String aboutAYear(int year) => 'un anno';
+
+  @override
+  String years(int years) => '$years anni';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class ArRelativeDateTime extends RelativeDateTime {
+  bool replaceNum;
+
+  ArRelativeDateTime(this.replaceNum);
+
+  @override
+  String prefixAgo() => 'منذ';
+
+  @override
+  String prefixFromNow() => 'بعد';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'ثانية واحدة';
+
+  @override
+  String aboutAMinute(int minutes) => 'دقيقة واحدة';
+
+  @override
+  String minutes(int minutes) {
+    String result;
+    if (minutes == 1) {
+      result = 'دقيقة واحدة';
+    } else if (minutes == 2) {
+      result = 'دقيقتين';
+    } else if (minutes > 2 && minutes < 11) {
+      result = '$minutes دقائق ';
+    } else if (minutes > 10) {
+      result = '$minutes دقيقة ';
+    } else {
+      result = '$minutes دقائق ';
+    }
+    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
+  }
+
+  @override
+  String aboutAnHour(int minutes) => 'ساعة واحدة';
+
+  @override
+  String hours(int hours) {
+    String result;
+    if (hours == 1) {
+      result = 'ساعة واحدة';
+    } else if (hours == 2) {
+      result = ' ساعتين';
+    } else if (hours > 2 && hours < 11) {
+      result = '$hours ساعات ';
+    } else if (hours > 10) {
+      result = '$hours ساعة ';
+    } else {
+      result = '$hours ساعات ';
+    }
+    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
+  }
+
+  @override
+  String aDay(int hours) => 'يوم واحد';
+
+  @override
+  String days(int days) {
+    String result;
+    if (days == 1) {
+      result = ' يوم واحد';
+    } else if (days == 2) {
+      result = ' يومين';
+    } else if (days > 2 && days < 11) {
+      result = '$days ايام ';
+    } else if (days > 10) {
+      result = '$days يوم ';
+    } else {
+      result = '$days ايام ';
+    }
+    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
+  }
+
+  @override
+  String aboutAMonth(int days) => 'شهر واحد';
+
+  @override
+  String months(int months) {
+    String result;
+    if (months == 1) {
+      result = 'شهر واحد';
+    } else if (months == 2) {
+      result = 'شهرين';
+    } else if (months > 2 && months < 11) {
+      result = '$months اشهر ';
+    } else if (months > 10) {
+      result = '$months شهر ';
+    } else {
+      result = '$months شهور ';
+    }
+    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
+  }
+
+  @override
+  String aboutAYear(int year) => 'عام واحد';
+
+  @override
+  String years(int years) {
+    String result;
+    if (years == 1) {
+      result = 'عام واحد';
+    } else if (years == 2) {
+      result = 'عامين';
+    } else if (years > 2 && years < 11) {
+      result = '$years أعوام ';
+    } else if (years > 10) {
+      result = '$years عامًا ';
+    } else {
+      result = '$years أعوام ';
+    }
+    return replaceNum ? replaceToLocaleNum(result, 'ar') : result;
+  }
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class ArSaMaDzKwTnRelativeDateTime extends RelativeDateTime {
+  bool replaceNum;
+
+  ArSaMaDzKwTnRelativeDateTime(this.replaceNum);
+
+  @override
+  String prefixAgo() => 'منذ';
+
+  @override
+  String prefixFromNow() => 'في';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'ثوان';
+
+  @override
+  String aboutAMinute(int minutes) => 'دقيقة';
+
+  @override
+  String minutes(int minutes) {
+    return replaceNum
+        ? replaceToLocaleNum('$minutes دقائق ', 'ar')
+        : '$minutes دقائق ';
+  }
+
+  @override
+  String aboutAnHour(int minutes) => 'ساعة';
+
+  @override
+  String hours(int hours) {
+    return replaceNum
+        ? replaceToLocaleNum('$hours ساعات ', 'ar')
+        : '$hours ساعات ';
+  }
+
+  @override
+  String aDay(int hours) => 'يوم';
+
+  @override
+  String days(int days) {
+    return replaceNum ? replaceToLocaleNum('$days أيام ', 'ar') : '$days أيام ';
+  }
+
+  @override
+  String aboutAMonth(int days) => 'شهر';
+
+  @override
+  String months(int months) {
+    return replaceNum
+        ? replaceToLocaleNum('$months أشهر ', 'ar')
+        : '$months أشهر ';
+  }
+
+  @override
+  String aboutAYear(int year) => 'سنة';
+
+  @override
+  String years(int years) {
+    return replaceNum
+        ? replaceToLocaleNum('$years سنوات ', 'ar')
+        : '$years سنوات ';
+  }
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class AzRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => 'geri';
+
+  @override
+  String suffixFromNow() => 'sonra';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'bir neçə saniyə';
+
+  @override
+  String aboutAMinute(int minutes) => 'dəqiqə';
+
+  @override
+  String minutes(int minutes) => '$minutes ${_convert(minutes, Unit.minute)}';
+
+  @override
+  String aboutAnHour(int minutes) => 'saat';
+
+  @override
+  String hours(int hours) => '$hours ${_convert(hours, Unit.hour)}';
+
+  @override
+  String aDay(int hours) => 'gün';
+
+  @override
+  String days(int days) => '$days ${_convert(days, Unit.day)}';
+
+  @override
+  String aboutAMonth(int days) => 'ay';
+
+  @override
+  String months(int months) => '$months ${_convert(months, Unit.month)}';
+
+  @override
+  String aboutAYear(int year) => 'il';
+
+  @override
+  String years(int years) => '$years ${_convert(years, Unit.year)}';
+
+  @override
+  String wordSeparator() => ' ';
+
+  String _convert(int number, Unit unit) {
+    var mod = number % 10;
+    var modH = number % 100;
+    if (mod == 1 && modH != 11) {
+      switch (unit) {
+        case Unit.minute:
+          return 'dəqiqə';
+        case Unit.hour:
+          return 'saat';
+        case Unit.day:
+          return 'gün';
+        case Unit.month:
+          return 'ay';
+        case Unit.year:
+          return 'il';
+        default:
+          return '';
+      }
+    } else if (<int>[2, 3, 4].contains(mod) &&
+        !<int>[12, 13, 14].contains(modH)) {
+      switch (unit) {
+        case Unit.minute:
+          return 'dəqiqə';
+        case Unit.hour:
+          return 'saat';
+        case Unit.day:
+          return 'gün';
+        case Unit.month:
+          return 'ay';
+        case Unit.year:
+          return 'il';
+        default:
+          return '';
+      }
+    }
+    switch (unit) {
+      case Unit.minute:
+        return 'dəqiqə';
+      case Unit.hour:
+        return 'saat';
+      case Unit.day:
+        return 'gün';
+      case Unit.month:
+        return 'ay';
+      case Unit.year:
+        return 'il';
+      default:
+        return '';
+    }
+  }
+}
+
+class IdRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'dalam';
+
+  @override
+  String suffixAgo() => 'yang lalu';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'beberapa detik';
+
+  @override
+  String aboutAMinute(int minutes) => 'satu menit';
+
+  @override
+  String minutes(int minutes) => '$minutes menit';
+
+  @override
+  String aboutAnHour(int minutes) => 'satu jam';
+
+  @override
+  String hours(int hours) => '$hours jam';
+
+  @override
+  String aDay(int hours) => 'satu hari';
+
+  @override
+  String days(int days) => '$days hari';
+
+  @override
+  String aboutAMonth(int days) => 'satu bulan';
+
+  @override
+  String months(int months) => '$months bulan';
+
+  @override
+  String aboutAYear(int year) => 'satu tahun';
+
+  @override
+  String years(int years) => '$years tahun';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class JaRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => '前';
+
+  @override
+  String suffixFromNow() => '後';
+
+  @override
+  String lessThanOneMinute(int seconds) => '数秒';
+
+  @override
+  String aboutAMinute(int minutes) => '1分';
+
+  @override
+  String minutes(int minutes) => '$minutes分';
+
+  @override
+  String aboutAnHour(int minutes) => '1時間';
+
+  @override
+  String hours(int hours) => '$hours時間';
+
+  @override
+  String aDay(int hours) => '1日';
+
+  @override
+  String days(int days) => '$days日';
+
+  @override
+  String aboutAMonth(int days) => '1ヶ月';
+
+  @override
+  String months(int months) => '$monthsヶ月';
+
+  @override
+  String aboutAYear(int year) => '1年';
+
+  @override
+  String years(int years) => '$years年';
+
+  @override
+  String wordSeparator() => '';
+}
+
+class KoRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => '전';
+
+  @override
+  String suffixFromNow() => '후';
+
+  @override
+  String lessThanOneMinute(int seconds) => '몇 초';
+
+  @override
+  String aboutAMinute(int minutes) => '1분';
+
+  @override
+  String minutes(int minutes) => '$minutes분';
+
+  @override
+  String aboutAnHour(int minutes) => '한 시간';
+
+  @override
+  String hours(int hours) => '$hours시간';
+
+  @override
+  String aDay(int hours) => '하루';
+
+  @override
+  String days(int days) => '$days일';
+
+  @override
+  String aboutAMonth(int days) => '한 달';
+
+  @override
+  String months(int months) => '$months달';
+
+  @override
+  String aboutAYear(int year) => '일 년';
+
+  @override
+  String years(int years) => '$years년';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class RuRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'через';
+
+  @override
+  String suffixAgo() => 'назад';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'несколько секунд';
+
+  @override
+  String aboutAMinute(int minutes) => 'минуту';
+
+  @override
+  String minutes(int minutes) => '$minutes ${_convert(minutes, Unit.minute)}';
+
+  @override
+  String aboutAnHour(int minutes) => 'час';
+
+  @override
+  String hours(int hours) => '$hours ${_convert(hours, Unit.hour)}';
+
+  @override
+  String aDay(int hours) => 'день';
+
+  @override
+  String days(int days) => '$days ${_convert(days, Unit.day)}';
+
+  @override
+  String aboutAMonth(int days) => 'месяц';
+
+  @override
+  String months(int months) => '$months ${_convert(months, Unit.month)}';
+
+  @override
+  String aboutAYear(int year) => 'год';
+
+  @override
+  String years(int years) => '$years ${_convert(years, Unit.year)}';
+
+  @override
+  String wordSeparator() => ' ';
+
+  String _convert(int number, Unit unit) {
+    var mod = number % 10;
+    var modH = number % 100;
+    if (mod == 1 && modH != 11) {
+      switch (unit) {
+        case Unit.minute:
+          return 'минуту';
+        case Unit.hour:
+          return 'час';
+        case Unit.day:
+          return 'день';
+        case Unit.month:
+          return 'месяц';
+        case Unit.year:
+          return 'год';
+        default:
+          return '';
+      }
+    } else if (<int>[2, 3, 4].contains(mod) &&
+        !<int>[12, 13, 14].contains(modH)) {
+      switch (unit) {
+        case Unit.minute:
+          return 'минуты';
+        case Unit.hour:
+          return 'часа';
+        case Unit.day:
+          return 'дня';
+        case Unit.month:
+          return 'месяца';
+        case Unit.year:
+          return 'года';
+        default:
+          return '';
+      }
+    } else {
+      switch (unit) {
+        case Unit.minute:
+          return 'минут';
+        case Unit.hour:
+          return 'часов';
+        case Unit.day:
+          return 'дней';
+        case Unit.month:
+          return 'месяцев';
+        case Unit.year:
+          return 'лет';
+        default:
+          return '';
+      }
+    }
+  }
+}
+
+class UkRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'через';
+
+  @override
+  String suffixAgo() => 'тому';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'декілька секунд';
+
+  @override
+  String aboutAMinute(int minutes) => 'хвилину';
+
+  @override
+  String minutes(int minutes) => '$minutes ${_convert(minutes, Unit.minute)}';
+
+  @override
+  String aboutAnHour(int minutes) => 'годину';
+
+  @override
+  String hours(int hours) => '$hours ${_convert(hours, Unit.hour)}';
+
+  @override
+  String aDay(int hours) => 'день';
+
+  @override
+  String days(int days) => '$days ${_convert(days, Unit.day)}';
+
+  @override
+  String aboutAMonth(int days) => 'місяць';
+
+  @override
+  String months(int months) => '$months ${_convert(months, Unit.month)}';
+
+  @override
+  String aboutAYear(int year) => 'рік';
+
+  @override
+  String years(int years) => '$years ${_convert(years, Unit.year)}';
+
+  @override
+  String wordSeparator() => ' ';
+
+  String _convert(int number, Unit unit) {
+    var mod = number % 10;
+    var modH = number % 100;
+    if (mod == 1 && modH != 11) {
+      switch (unit) {
+        case Unit.minute:
+          return 'хвилину';
+        case Unit.hour:
+          return 'годину';
+        case Unit.day:
+          return 'день';
+        case Unit.month:
+          return 'місяць';
+        case Unit.year:
+          return 'рік';
+        default:
+          return '';
+      }
+    } else if (<int>[2, 3, 4].contains(mod) &&
+        !<int>[12, 13, 14].contains(modH)) {
+      switch (unit) {
+        case Unit.minute:
+          return 'хвилини';
+        case Unit.hour:
+          return 'години';
+        case Unit.day:
+          return 'дні';
+        case Unit.month:
+          return 'місяці';
+        case Unit.year:
+          return 'роки';
+        default:
+          return '';
+      }
+    }
+    switch (unit) {
+      case Unit.minute:
+        return 'хвилин';
+      case Unit.hour:
+        return 'годин';
+      case Unit.day:
+        return 'днів';
+      case Unit.month:
+        return 'місяців';
+      case Unit.year:
+        return 'років';
+      default:
+        return '';
+    }
+  }
+}
+
+class HiRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => 'पहले';
+
+  @override
+  String suffixFromNow() => 'में';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'कुछ ही क्षण';
+
+  @override
+  String aboutAMinute(int minutes) => 'एक मिनट';
+
+  @override
+  String minutes(int minutes) => '$minutes मिनट';
+
+  @override
+  String aboutAnHour(int minutes) => 'एक घंटा';
+
+  @override
+  String hours(int hours) => '$hours घंटे';
+
+  @override
+  String aDay(int hours) => 'एक दिन';
+
+  @override
+  String days(int days) => '$days दिन';
+
+  @override
+  String aboutAMonth(int days) => 'एक महीने';
+
+  @override
+  String months(int months) => '$months महीने';
+
+  @override
+  String aboutAYear(int year) => 'एक वर्ष';
+
+  @override
+  String years(int years) => '$years वर्ष';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class HuRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => 'ezelőtt';
+
+  @override
+  String suffixFromNow() => 'ezután';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'néhány másodperccel';
+
+  @override
+  String aboutAMinute(int minutes) => 'egy perccel';
+
+  @override
+  String minutes(int minutes) => '$minutes perccel';
+
+  @override
+  String aboutAnHour(int minutes) => 'egy órával';
+
+  @override
+  String hours(int hours) => '$hours órával';
+
+  @override
+  String aDay(int hours) => 'egy nappal';
+
+  @override
+  String days(int days) => '$days nappal';
+
+  @override
+  String aboutAMonth(int days) => 'egy hónappal';
+
+  @override
+  String months(int months) => '$months hónappal';
+
+  @override
+  String aboutAYear(int year) => 'egy évvel';
+
+  @override
+  String years(int years) => '$years évvel';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class PtRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => 'há';
+
+  @override
+  String prefixFromNow() => 'em';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'segundos';
+
+  @override
+  String aboutAMinute(int minutes) => 'um minuto';
+
+  @override
+  String minutes(int minutes) => '$minutes minutos';
+
+  @override
+  String aboutAnHour(int minutes) => 'uma hora';
+
+  @override
+  String hours(int hours) => '$hours horas';
+
+  @override
+  String aDay(int hours) => 'um dia';
+
+  @override
+  String days(int days) => '$days dias';
+
+  @override
+  String aboutAMonth(int days) => 'um mês';
+
+  @override
+  String months(int months) => '$months meses';
+
+  @override
+  String aboutAYear(int year) => 'um ano';
+
+  @override
+  String years(int years) => '$years anos';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class PlRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'za';
+
+  @override
+  String suffixAgo() => 'temu';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'kilka sekund';
+
+  @override
+  String aboutAMinute(int minutes) => 'minutę';
+
+  @override
+  String minutes(int minutes) {
+    String result;
+    if (minutes >= 1 && minutes <= 4) {
+      result = 'minuty';
+    } else {
+      result = 'minut';
+    }
+    return '$minutes $result';
+  }
+
+  @override
+  String aboutAnHour(int minutes) => 'godzinę';
+
+  @override
+  String hours(int hours) {
+    String result;
+    if (hours >= 1 && hours <= 4) {
+      result = 'godziny';
+    } else {
+      result = 'godzin';
+    }
+    return '$hours $result';
+  }
+
+  @override
+  String aDay(int hours) => '1 dzień';
+
+  @override
+  String days(int days) => '$days dni';
+
+  @override
+  String aboutAMonth(int days) => 'miesiąc';
+
+  @override
+  String months(int months) {
+    String result;
+    if (months >= 1 && months <= 4) {
+      result = 'miesiące';
+    } else {
+      result = 'miesięcy';
+    }
+    return '$months $result';
+  }
+
+  @override
+  String aboutAYear(int year) => 'rok';
+
+  @override
+  String years(int years) {
+    String result;
+    if (years >= 1 && years <= 4) {
+      result = 'lata';
+    } else {
+      result = 'lat';
+    }
+    return '$years $result';
+  }
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class TrRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => 'önce';
+
+  @override
+  String suffixFromNow() => 'içinde';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'birkaç saniye';
+
+  @override
+  String aboutAMinute(int minutes) => 'bir dakika';
+
+  @override
+  String minutes(int minutes) => '$minutes dakika';
+
+  @override
+  String aboutAnHour(int minutes) => 'bir saat';
+
+  @override
+  String hours(int hours) => '$hours saat';
+
+  @override
+  String aDay(int hours) => 'bir gün';
+
+  @override
+  String days(int days) => '$days gün';
+
+  @override
+  String aboutAMonth(int days) => 'bir ay';
+
+  @override
+  String months(int months) => '$months ay';
+
+  @override
+  String aboutAYear(int year) => 'bir yıl';
+
+  @override
+  String years(int years) => '$years yıl';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class SvRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'om';
+
+  @override
+  String suffixAgo() => 'sedan';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'några sekunder';
+
+  @override
+  String aboutAMinute(int minutes) => 'en minut';
+
+  @override
+  String minutes(int minutes) => '$minutes minuter';
+
+  @override
+  String aboutAnHour(int minutes) => 'en timme';
+
+  @override
+  String hours(int hours) => '$hours timmar';
+
+  @override
+  String aDay(int hours) => 'en dag';
+
+  @override
+  String days(int days) => '$days dagar';
+
+  @override
+  String aboutAMonth(int days) => 'en månad';
+
+  @override
+  String months(int months) => '$months månader';
+
+  @override
+  String aboutAYear(int year) => 'ett år';
+
+  @override
+  String years(int years) => '$years år';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class NbRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'om';
+
+  @override
+  String suffixAgo() => 'siden';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'noen sekunder';
+
+  @override
+  String aboutAMinute(int minutes) => 'ett minutt';
+
+  @override
+  String minutes(int minutes) => '$minutes minutter';
+
+  @override
+  String aboutAnHour(int minutes) => 'en time';
+
+  @override
+  String hours(int hours) => '$hours timer';
+
+  @override
+  String aDay(int hours) => 'en dag';
+
+  @override
+  String days(int days) => '$days dager';
+
+  @override
+  String aboutAMonth(int days) => 'en måned';
+
+  @override
+  String months(int months) => '$months måneder';
+
+  @override
+  String aboutAYear(int year) => 'ett år';
+
+  @override
+  String years(int years) => '$years år';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class FaRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => 'پیش';
+
+  @override
+  String suffixFromNow() => 'بعد';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'چند ثانیه';
+
+  @override
+  String aboutAMinute(int minutes) => 'یک دقیقه';
+
+  @override
+  String minutes(int minutes) {
+    String result;
+    result = '$minutes دقیقه ';
+    return replaceToLocaleNum(result, 'fa');
+  }
+
+  @override
+  String aboutAnHour(int minutes) => 'یک ساعت';
+
+  @override
+  String hours(int hours) {
+    String result;
+    result = '$hours ساعت ';
+    return replaceToLocaleNum(result, 'fa');
+  }
+
+  @override
+  String aDay(int hours) => 'یک روز';
+
+  @override
+  String days(int days) {
+    String result;
+    result = '$days روز ';
+    return replaceToLocaleNum(result, 'fa');
+  }
+
+  @override
+  String aboutAMonth(int days) => 'یک ماه';
+
+  @override
+  String months(int months) {
+    String result;
+    result = '$months ماه ';
+    return replaceToLocaleNum(result, 'fa');
+  }
+
+  @override
+  String aboutAYear(int year) => 'یک سال';
+
+  @override
+  String years(int years) {
+    String result;
+    result = '$years سال ';
+    return replaceToLocaleNum(result, 'fa');
+  }
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class BnRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => 'আগে';
+
+  @override
+  String suffixFromNow() => 'পরে';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'কিছু মুহূর্ত';
+
+  @override
+  String aboutAMinute(int minutes) => 'এক মিনিট';
+
+  @override
+  String minutes(int minutes) => replaceToLocaleNum('$minutes মিনিট', 'bn');
+
+  @override
+  String aboutAnHour(int minutes) => 'এক ঘন্টা';
+
+  @override
+  String hours(int hours) => replaceToLocaleNum('$hours ঘন্টা', 'bn');
+
+  @override
+  String aDay(int hours) => 'এক দিন';
+
+  @override
+  String days(int days) => replaceToLocaleNum('$days দিন', 'bn');
+
+  @override
+  String aboutAMonth(int days) => 'এক মাস';
+
+  @override
+  String months(int months) => replaceToLocaleNum('$months মাস', 'bn');
+
+  @override
+  String aboutAYear(int year) => 'এক বছর';
+
+  @override
+  String years(int years) => replaceToLocaleNum('$years বছর', 'bn');
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class NlRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => '';
+
+  @override
+  String suffixAgo() => 'geleden';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) =>
+      seconds > 0 ? 'op dit moment' : 'een ogenblik';
+
+  @override
+  String aboutAMinute(int minutes) => 'een minuut';
+
+  @override
+  String minutes(int minutes) => '$minutes minuten';
+
+  @override
+  String aboutAnHour(int minutes) => 'een uur';
+
+  @override
+  String hours(int hours) => '$hours uur';
+
+  @override
+  String aDay(int hours) => 'een dag';
+
+  @override
+  String days(int days) => '$days dagen';
+
+  @override
+  String aboutAMonth(int days) => 'een maand';
+
+  @override
+  String months(int months) => '$months maanden';
+
+  @override
+  String aboutAYear(int year) => 'een jaar';
+
+  @override
+  String years(int years) => '$years jaar';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class ThRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => '';
+
+  @override
+  String prefixFromNow() => 'อีก';
+
+  @override
+  String suffixAgo() => 'ที่แล้ว';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'ไม่กี่วินาที';
+
+  @override
+  String aboutAMinute(int minutes) => '1 นาที';
+
+  @override
+  String minutes(int minutes) => '$minutes นาที';
+
+  @override
+  String aboutAnHour(int minutes) => '1 ชั่วโมง';
+
+  @override
+  String hours(int hours) => '$hours ชั่วโมง';
+
+  @override
+  String aDay(int hours) => '1 วัน';
+
+  @override
+  String days(int days) => '$days วัน';
+
+  @override
+  String aboutAMonth(int days) => '1 เดือน';
+
+  @override
+  String months(int months) => '$months เดือน';
+
+  @override
+  String aboutAYear(int year) => '1 ปี';
+
+  @override
+  String years(int years) => '$years ปี';
+
+  @override
+  String wordSeparator() => '';
+}
+
+class SkRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => 'pred';
+
+  @override
+  String prefixFromNow() => 'za';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'pár sekundami';
+
+  @override
+  String aboutAMinute(int minutes) => 'minútou';
+
+  @override
+  String minutes(int minutes) => '$minutes minútami';
+
+  @override
+  String aboutAnHour(int minutes) => 'hodinou';
+
+  @override
+  String hours(int hours) => '$hours hodinami';
+
+  @override
+  String aDay(int hours) => 'dňom';
+
+  @override
+  String days(int days) => '$days dňami';
+
+  @override
+  String aboutAMonth(int days) => 'mesiacom';
+
+  @override
+  String months(int months) => '$months mesiacmi';
+
+  @override
+  String aboutAYear(int year) => 'rokom';
+
+  @override
+  String years(int years) => '$years rokmi';
+
+  @override
+  String wordSeparator() => ' ';
+}
+
+class CsRelativeDateTime extends RelativeDateTime {
+  @override
+  String prefixAgo() => 'před';
+
+  @override
+  String prefixFromNow() => 'za';
+
+  @override
+  String suffixAgo() => '';
+
+  @override
+  String suffixFromNow() => '';
+
+  @override
+  String lessThanOneMinute(int seconds) => 'pár sekundami';
+
+  @override
+  String aboutAMinute(int minutes) => 'minutou';
+
+  @override
+  String minutes(int minutes) => '$minutes minutami';
+
+  @override
+  String aboutAnHour(int minutes) => 'hodinou';
+
+  @override
+  String hours(int hours) => '$hours hodinami';
+
+  @override
+  String aDay(int hours) => 'dnem';
+
+  @override
+  String days(int days) => '$days dny';
+
+  @override
+  String aboutAMonth(int days) => 'měsícem';
+
+  @override
+  String months(int months) => '$months měsíci';
+
+  @override
+  String aboutAYear(int year) => 'rokem';
+
+  @override
+  String years(int years) => '$years lety';
+
+  @override
+  String wordSeparator() => ' ';
 }
diff --git a/lib/src/locale/supported_locales.dart b/lib/src/locale/supported_locales.dart
deleted file mode 100644
index 67a0437d..00000000
--- a/lib/src/locale/supported_locales.dart
+++ /dev/null
@@ -1,95 +0,0 @@
-import 'locale.dart';
-import 'locales/ar_locale.dart';
-import 'locales/cs_locale.dart';
-import 'locales/de_locale.dart';
-import 'locales/en_locale.dart';
-import 'locales/es_locale.dart';
-import 'locales/fa_locale.dart';
-import 'locales/fr_locale.dart';
-import 'locales/hi_locale.dart';
-import 'locales/hu_locale.dart';
-import 'locales/id_locale.dart';
-import 'locales/it_locale.dart';
-import 'locales/ja_locale.dart';
-import 'locales/ko_locale.dart';
-import 'locales/nb_locale.dart';
-import 'locales/nl_locale.dart';
-import 'locales/pl_locale.dart';
-import 'locales/pt_locale.dart';
-import 'locales/ru_locale.dart';
-import 'locales/sk_locale.dart';
-import 'locales/th_locale.dart';
-import 'locales/uk_locale.dart';
-import 'locales/az_locale.dart';
-import 'locales/sv_locale.dart';
-import 'locales/tr_locale.dart';
-import 'locales/zh_locale.dart';
-import 'locales/bn_locale.dart';
-
-Map<String, Locale> _supportedLocales = {
-  'en': EnLocale(),
-  'en_us': EnUsLocale(),
-  'en_sg': EnSgLocale(),
-  'en_au': EnAuLocale(),
-  'en_ca': EnCaLocale(),
-  'en_gb': EnGbLocale(),
-  'en_ie': EnIeLocale(),
-  'en_il': EnIlLocale(),
-  'en_nz': EnNzLocale(),
-  'es': EsLocale(),
-  'es_do': EsDoLocale(),
-  'es_us': EsUsLocale(),
-  'fr': FrLocale(),
-  'fr_ch': FrChLocale(),
-  'fr_ca': FrCaLocale(),
-  'zh': ZhLocale(),
-  'zh_cn': ZhCnLocale(),
-  'zh_hk': ZhHkLocale(),
-  'zh_tw': ZhTwLocale(),
-  'de': DeLocale(),
-  'de_de': DeDeLocale(),
-  'de_at': DeAtLocale(),
-  'de_ch': DeChLocale(),
-  'it': ItLocale(),
-  'it_ch': ItChLocale(),
-  'ar': ArLocale(),
-  'ar_ly': ArLyLocale(),
-  'ar_dz': ArDzLocale(),
-  'ar_kw': ArKwLocale(),
-  'ar_sa': ArSaLocale(),
-  'ar_ma': ArMaLocale(),
-  'ar_tn': ArTnLocale(),
-  'az': AzLocale(),
-  'id': IdLocale(),
-  'ja': JaLocale(),
-  'ko': KoLocale(),
-  'ru': RuLocale(),
-  'uk': UkLocale(),
-  'hi': HiLocale(),
-  'hu': HuLocale(),
-  'hu_hu': HuHuLocale(),
-  'pt': PtLocale(),
-  'pt_br': PtBrLocale(),
-  'pl': PlLocale(),
-  'tr': TrLocale(),
-  'sv': SvLocale(),
-  'nb': NbLocale(),
-  'fa': FaLocale(),
-  'bn': BnLocale(),
-  'nl': NlLocale(),
-  'th': ThLocale(),
-  'sk': SkLocale(),
-  'cs': CsLocale(),
-};
-
-Locale getLocale(String locale) {
-  return _supportedLocales[locale.toLowerCase()] ?? _supportedLocales['en_us']!;
-}
-
-bool isLocalSupported(String locale) {
-  return _supportedLocales.containsKey(locale.toLowerCase());
-}
-
-List<String> getSupportedLocales() {
-  return _supportedLocales.keys.toList();
-}
diff --git a/lib/src/parser.dart b/lib/src/parser.dart
index f292e535..bfc0dda1 100644
--- a/lib/src/parser.dart
+++ b/lib/src/parser.dart
@@ -1,4 +1,5 @@
 import 'package:intl/intl.dart';
+import 'package:jiffy/src/locale/ordinals.dart';
 
 import 'enums/unit.dart';
 import 'getter.dart';
@@ -17,7 +18,7 @@ class Parser {
         throw JiffyException('The provided pattern for input `$input` cannot '
             'be blank');
       }
-      final ordinals = locale.ordinals();
+      final ordinals = locale.ordinals;
       return _parseString(_replaceParseInput(input, ordinals),
               _replacePatternInput(pattern))
           .copyWith(isUtc: isUtc);
@@ -83,17 +84,18 @@ class Parser {
     return pattern.replaceFirst('do', 'd');
   }
 
-  String _replaceParseInput(String input, List<String> ordinals) {
+  String _replaceParseInput(String input, Ordinals ordinals) {
     return input
         .replaceFirst(' pm', ' PM')
         .replaceFirst(' am', ' AM')
         .replaceFirst(_matchesOrdinalDates(input, ordinals), '');
   }
 
-  String _matchesOrdinalDates(String input, List<String> ordinals) {
+  String _matchesOrdinalDates(String input, Ordinals ordinals) {
     final matches =
         // ignore: prefer_interpolation_to_compose_strings
-        RegExp(r'\d+\s*(' + ordinals.join('|') + ')').allMatches(input);
+        RegExp(r'\d+\s*(' + ordinals.asList().join('|') + ')')
+            .allMatches(input);
     return matches.isNotEmpty ? matches.first.group(1) ?? '' : '';
   }
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 33c377d0..ef25cd68 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,6 +11,7 @@ environment:
 
 dependencies:
   intl: ">=0.19.0 <0.21.0"
+  quiver: "^3.2.2"
 
 dev_dependencies:
   lints: ">=2.0.1 <4.0.0"


Test patch:
diff --git a/test/src/display_test.dart b/test/src/display_test.dart
index 055070f1..0982a598 100644
--- a/test/src/display_test.dart
+++ b/test/src/display_test.dart
@@ -1,8 +1,6 @@
 import 'package:jiffy/jiffy.dart';
 import 'package:jiffy/src/display.dart';
-import 'package:jiffy/src/enums/unit.dart';
 import 'package:jiffy/src/getter.dart';
-import 'package:jiffy/src/locale/locales/en_locale.dart';
 import 'package:jiffy/src/manipulator.dart';
 import 'package:jiffy/src/query.dart';
 import 'package:jiffy/src/utils/jiffy_exception.dart';
@@ -15,6 +13,12 @@ void main() {
 
   final underTest = Display(getter, manipulator, query);
 
+  final locale = Locale(
+      code: "en",
+      ordinals: Ordinals(first: "st", second: "nd", third: "rd", nth: "th"),
+      startOfWeek: StartOfWeek.sunday,
+      relativeDateTime: EnRelativeDateTime());
+
   test('Should successfully format datetime is iso when pattern not provided',
       () {
     // Setup
@@ -32,9 +36,6 @@ void main() {
   group('Test format with pattern', () {
     for (var testData in formatWithPatternDateTimeTestData()) {
       test('Should successfully format datetime when pattern is provided', () {
-        // Setup
-        final locale = EnLocale();
-
         // Execute
         final actualFormat =
             underTest.format(testData['dateTime'], testData['pattern'], locale);
@@ -46,9 +47,6 @@ void main() {
 
     for (var testData in formatWithEscapedPatternDateTimeTestData()) {
       test('Should successfully format datetime with escaped pattern', () {
-        // Setup
-        final locale = EnLocale();
-
         // Execute
         final actualFormat =
             underTest.format(testData['dateTime'], testData['pattern'], locale);
@@ -60,9 +58,6 @@ void main() {
 
     for (var testData in formatWithOrdinalPatternDateTimeTestData()) {
       test('Should successfully format datetime with ordinal pattern', () {
-        // Setup
-        final locale = EnLocale();
-
         // Execute
         final actualFormat =
             underTest.format(testData['dateTime'], testData['pattern'], locale);
@@ -76,7 +71,6 @@ void main() {
       // Setup
       final dateTime = DateTime(1997, 9, 23, 12, 11, 22, 123, 456);
       final pattern = '';
-      final locale = EnLocale();
 
       final expectedExceptionMessage = 'The provided pattern for datetime '
           '`$dateTime` cannot be blank';
@@ -92,14 +86,14 @@ void main() {
   group('Test from as relative between two datetime', () {
     for (var testData in fromAsRelativeDateTimeTestData()) {
       test('Should successfully get from as relative datetime', () {
-        final locale = EnLocale();
-
+        // Execute
         final actualFromAsRelativeDateTime = underTest.fromAsRelativeDateTime(
             testData['firstDateTime'],
             testData['secondDateTime'],
             locale,
             true);
 
+        // Verify
         expect(actualFromAsRelativeDateTime,
             testData['expectedFromAsRelativeDateTime']);
       });
@@ -108,7 +102,6 @@ void main() {
     test(
         'Should successfully get from as relative datetime without prefix and suffix',
         () {
-      final locale = EnLocale();
       final firstDateTime = DateTime(1997, 10, 23, 12, 11, 22, 123, 456);
       final secondDateTime = DateTime(1998, 10, 23, 12, 11, 22, 123, 457);
       final withPrefixAndSuffix = false;
@@ -123,8 +116,6 @@ void main() {
 
     for (var testData in toAsRelativeDateTimeTestData()) {
       test('Should successfully get to as relative datetime', () {
-        final locale = EnLocale();
-
         final actualToAsRelativeDateTime = underTest.toAsRelativeDateTime(
             testData['firstDateTime'],
             testData['secondDateTime'],
@@ -139,7 +130,6 @@ void main() {
     test(
         'Should successfully get to as relative datetime without prefix and suffix',
         () {
-      final locale = EnLocale();
       final firstDateTime = DateTime(1997, 10, 23, 12, 11, 22, 123, 456);
       final secondDateTime = DateTime(1998, 10, 23, 12, 11, 22, 123, 457);
       final withPrefixAndSuffix = false;
diff --git a/test/src/global/global_ordinals_test.dart b/test/src/global/global_ordinals_test.dart
new file mode 100644
index 00000000..e03727d4
--- /dev/null
+++ b/test/src/global/global_ordinals_test.dart
@@ -0,0 +1,87 @@
+import 'package:jiffy/src/global/global_ordinals.dart';
+import 'package:jiffy/src/locale/ordinals.dart';
+import 'package:jiffy/src/utils/jiffy_exception.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('getOrdinals', () {
+    setUp(() async {
+      defaultOrdinals = null;
+    });
+
+    test('Should return default ordinals if defaultOrdinals is set', () {
+      // Setup
+      final ordinals = Ordinals(first: 'a', second: 'b', third: 'c', nth: 'd');
+      defaultOrdinals = ordinals;
+
+      // Execute
+      final result = getOrdinals('en');
+
+      // Verify
+      expect(result, ordinals);
+    });
+
+    test('Should return built-in ordinals for supported short locale', () {
+      // Setup
+      final expectedOrdinals =
+          Ordinals(first: 'st', second: 'nd', third: 'rd', nth: 'th');
+
+      // Execute
+      final result = getOrdinals('en_US');
+
+      // Verify
+      expect(result, expectedOrdinals);
+    });
+
+    test('Should throw JiffyException for unsupported locale', () {
+      // Setup
+      final unsupportedLocale = 'xyz';
+
+      // Execute & Verify
+      expect(
+          () => getOrdinals(unsupportedLocale),
+          throwsA(isA<JiffyException>().having(
+              (e) => e.toString(),
+              'message',
+              contains(
+                  "Locale `$unsupportedLocale` is not supported for ordinals."))));
+    });
+
+    test('Should return ordinals for various supported locales', () {
+      // Setup
+      final locales = {
+        'en': Ordinals(first: 'st', second: 'nd', third: 'rd', nth: 'th'),
+        'es': Ordinals(first: 'º', second: 'º', third: 'º', nth: 'º'),
+        'fr': Ordinals(first: 'er', second: '', third: '', nth: ''),
+        'zh': Ordinals(first: '日', second: '日', third: '日', nth: '日'),
+        'de': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+        'it': Ordinals(first: 'º', second: 'º', third: 'º', nth: 'º'),
+        'ar': Ordinals(first: '', second: '', third: '', nth: ''),
+        'az': Ordinals(first: '', second: '', third: '', nth: ''),
+        'id': Ordinals(first: '', second: '', third: '', nth: ''),
+        'ja': Ordinals(first: '日', second: '日', third: '日', nth: '日'),
+        'ko': Ordinals(first: '일', second: '일', third: '일', nth: '일'),
+        'ru': Ordinals(first: '', second: '', third: '', nth: ''),
+        'uk': Ordinals(first: '', second: '', third: '', nth: ''),
+        'hi': Ordinals(first: '', second: '', third: '', nth: ''),
+        'hu': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+        'pt': Ordinals(first: 'º', second: 'º', third: 'º', nth: 'º'),
+        'pl': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+        'tr': Ordinals(first: '', second: '', third: '', nth: ''),
+        'sv': Ordinals(first: '', second: '', third: '', nth: ''),
+        'nb': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+        'fa': Ordinals(first: 'م', second: 'م', third: 'م', nth: 'م'),
+        'bn': Ordinals(first: '', second: '', third: '', nth: ''),
+        'nl': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+        'th': Ordinals(first: '', second: '', third: '', nth: ''),
+        'sk': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+        'cs': Ordinals(first: '.', second: '.', third: '.', nth: '.'),
+      };
+
+      // Execute & Verify
+      for (var entry in locales.entries) {
+        expect(getOrdinals(entry.key), entry.value);
+      }
+    });
+  });
+}
diff --git a/test/src/global/global_relative_date_time_test.dart b/test/src/global/global_relative_date_time_test.dart
new file mode 100644
index 00000000..ac464875
--- /dev/null
+++ b/test/src/global/global_relative_date_time_test.dart
@@ -0,0 +1,105 @@
+import 'package:jiffy/src/global/global_relative_date_time.dart';
+import 'package:jiffy/src/locale/relative_date_time.dart';
+import 'package:jiffy/src/utils/jiffy_exception.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('getRelativeDateTime', () {
+    setUp(() async {
+      defaultRelativeDateTime = null;
+    });
+
+    test('Should return default RelativeDateTime if set', () {
+      // Setup
+      final mockRdt = MockRelativeDateTime();
+      defaultRelativeDateTime = mockRdt;
+
+      // Execute
+      final result = getRelativeDateTime('en');
+
+      // Verify
+      expect(result, mockRdt);
+    });
+
+    test('Should return RelativeDateTime for supported locale (canonicalized)',
+        () {
+      // Execute
+      final result = getRelativeDateTime('zh_CN');
+
+      // Verify
+      expect(result, isA<ZhCnRelativeDateTime>());
+    });
+
+    test('Should return RelativeDateTime for supported locale (short)', () {
+      // Execute
+      final result = getRelativeDateTime('zh_CH');
+
+      // Verify
+      expect(result, isA<ZhRelativeDateTime>());
+    });
+
+    test('Should return RelativeDateTime for specific locale', () {
+      // Setup
+      final relativeDateTimes = {
+        'en': EnRelativeDateTime(),
+        'es': EsRelativeDateTime(),
+        'fr': FrRelativeDateTime(),
+        'zh': ZhRelativeDateTime(),
+        'zh_CN': ZhCnRelativeDateTime(),
+        'de': DeRelativeDateTime(),
+        'it': ItRelativeDateTime(),
+        'ar': ArRelativeDateTime(true),
+        'ar_LY': ArRelativeDateTime(false),
+        'ar_DZ': ArSaMaDzKwTnRelativeDateTime(false),
+        'ar_KW': ArSaMaDzKwTnRelativeDateTime(false),
+        'ar_SA': ArSaMaDzKwTnRelativeDateTime(true),
+        'ar_MA': ArSaMaDzKwTnRelativeDateTime(false),
+        'ar_TN': ArSaMaDzKwTnRelativeDateTime(false),
+        'az': AzRelativeDateTime(),
+        'id': IdRelativeDateTime(),
+        'ja': JaRelativeDateTime(),
+        'ko': KoRelativeDateTime(),
+        'ru': RuRelativeDateTime(),
+        'uk': UkRelativeDateTime(),
+        'hi': HiRelativeDateTime(),
+        'hu': HuRelativeDateTime(),
+        'pt': PtRelativeDateTime(),
+        'pl': PlRelativeDateTime(),
+        'tr': TrRelativeDateTime(),
+        'sv': SvRelativeDateTime(),
+        'nb': NbRelativeDateTime(),
+        'fa': FaRelativeDateTime(),
+        'bn': BnRelativeDateTime(),
+        'nl': NlRelativeDateTime(),
+        'th': ThRelativeDateTime(),
+        'sk': SkRelativeDateTime(),
+        'cs': CsRelativeDateTime(),
+      };
+
+      // Execute & Verify
+      for (var entry in relativeDateTimes.entries) {
+        expect(getRelativeDateTime(entry.key), entry.value);
+      }
+    });
+
+    test('Should throw JiffyException for unsupported locale', () {
+      // Setup
+      final unsupportedLocale = 'xyz';
+
+      // Execute & Verify
+      expect(
+          () => getRelativeDateTime(unsupportedLocale),
+          throwsA(isA<JiffyException>().having(
+              (e) => e.toString(),
+              'message',
+              contains(
+                  "Locale `$unsupportedLocale` is not supported for relative date formatting."))));
+    });
+  });
+}
+
+class MockRelativeDateTime extends EnRelativeDateTime {
+  String fromNow(DateTime dateTime) => "Mock fromNow";
+
+  String fromDateTime(DateTime from, DateTime to) => "Mock fromDateTime";
+}
diff --git a/test/src/global/global_start_of_week_test.dart b/test/src/global/global_start_of_week_test.dart
new file mode 100644
index 00000000..47eb958a
--- /dev/null
+++ b/test/src/global/global_start_of_week_test.dart
@@ -0,0 +1,51 @@
+import 'package:jiffy/src/enums/start_of_week.dart';
+import 'package:jiffy/src/global/global_start_of_week.dart';
+import 'package:jiffy/src/utils/jiffy_exception.dart';
+import 'package:test/test.dart';
+
+void main() {
+  setUp(() async {
+    defaultStartOfWeek = null;
+  });
+
+  group('getStartOfWeek', () {
+    test('Should return default StartOfWeek if set', () {
+      // Setup
+      defaultStartOfWeek = StartOfWeek.monday;
+
+      // Execute
+      final result = getStartOfWeek('en_US');
+
+      // Verify
+      expect(result, StartOfWeek.monday);
+    });
+
+    test('Should return correct start of week for locale', () {
+      // Setup
+      final startOfWeekTestData = {
+        "fa": StartOfWeek.saturday,
+        "af": StartOfWeek.sunday,
+        "de_AT": StartOfWeek.monday,
+      };
+
+      // Execute and Verify
+      for (var entry in startOfWeekTestData.entries) {
+        expect(getStartOfWeek(entry.key), entry.value);
+      }
+    });
+
+    test('Should throw JiffyException for unsupported locale', () {
+      // Setup
+      final unsupportedLocale = 'unsupported_locale';
+
+      // Execute & Verify
+      expect(
+          () => getStartOfWeek(unsupportedLocale),
+          throwsA(isA<JiffyException>().having(
+              (e) => e.toString(),
+              'message',
+              contains(
+                  "The specified locale '$unsupportedLocale' is not supported."))));
+    });
+  });
+}
diff --git a/test/src/jiffy_test.dart b/test/src/jiffy_test.dart
index 74679bbf..428a4cda 100644
--- a/test/src/jiffy_test.dart
+++ b/test/src/jiffy_test.dart
@@ -1,35 +1,21 @@
+import 'package:intl/date_symbol_data_local.dart';
 import 'package:jiffy/jiffy.dart';
-import 'package:jiffy/src/locale/locales/ar_locale.dart';
-import 'package:jiffy/src/locale/locales/az_locale.dart';
-import 'package:jiffy/src/locale/locales/bn_locale.dart';
-import 'package:jiffy/src/locale/locales/de_locale.dart';
-import 'package:jiffy/src/locale/locales/en_locale.dart';
-import 'package:jiffy/src/locale/locales/es_locale.dart';
-import 'package:jiffy/src/locale/locales/fa_locale.dart';
-import 'package:jiffy/src/locale/locales/fr_locale.dart';
-import 'package:jiffy/src/locale/locales/hi_locale.dart';
-import 'package:jiffy/src/locale/locales/hu_locale.dart';
-import 'package:jiffy/src/locale/locales/id_locale.dart';
-import 'package:jiffy/src/locale/locales/it_locale.dart';
-import 'package:jiffy/src/locale/locales/ja_locale.dart';
-import 'package:jiffy/src/locale/locales/ko_locale.dart';
-import 'package:jiffy/src/locale/locales/nb_locale.dart';
-import 'package:jiffy/src/locale/locales/nl_locale.dart';
-import 'package:jiffy/src/locale/locales/pl_locale.dart';
-import 'package:jiffy/src/locale/locales/pt_locale.dart';
-import 'package:jiffy/src/locale/locales/ru_locale.dart';
-import 'package:jiffy/src/locale/locales/sv_locale.dart';
-import 'package:jiffy/src/locale/locales/th_locale.dart';
-import 'package:jiffy/src/locale/locales/tr_locale.dart';
-import 'package:jiffy/src/locale/locales/uk_locale.dart';
-import 'package:jiffy/src/locale/locales/zh_locale.dart';
 import 'package:jiffy/src/utils/jiffy_exception.dart';
 import 'package:test/expect.dart';
 import 'package:test/scaffolding.dart';
 
-import 'locale/supported_locales_test.dart';
+class UpdatedJpRelativeDateTime extends JaRelativeDateTime {
+  @override
+  String aboutAMonth(int days) {
+    return "some months ago";
+  }
+}
 
 void main() {
+  setUp(() async {
+    Jiffy.setLocale("en_US");
+  });
+
   group('Test parsing and creating a Jiffy instance', () {
     test('Should successfully parse from string', () {
       // Setup
@@ -236,7 +222,76 @@ void main() {
   });
 
   group('Test getting and setting locales', () {
-    test('Should successfully get locale', () async {
+    test('Should successfully set locale', () async {
+      // Setup
+      await Jiffy.setLocale('ja');
+      final jiffy = Jiffy.now();
+
+      final expectedLocaleCode = 'ja';
+      final expectedLocaleStartOfWeek = StartOfWeek.sunday;
+      final expectedLocaleOrdinals =
+          Ordinals(first: '日', second: '日', third: '日', nth: '日');
+      final expectedLocaleRelativeDateTime = JaRelativeDateTime();
+
+      // Execute
+      final actualLocale = jiffy.locale;
+
+      // Verify
+      expect(actualLocale.code, expectedLocaleCode);
+      expect(actualLocale.startOfWeek, expectedLocaleStartOfWeek);
+      expect(actualLocale.ordinals, equals(expectedLocaleOrdinals));
+      expect(actualLocale.relativeDateTime,
+          equals(expectedLocaleRelativeDateTime));
+    });
+
+    test('Should successfully configure start of week', () async {
+      // Setup
+      await Jiffy.setLocale('ja');
+
+      // Verify default start of week before changing
+      expect(Jiffy.now().locale.startOfWeek, StartOfWeek.sunday);
+
+      // Execute
+      await Jiffy.setLocale('ja', startOfWeek: StartOfWeek.monday);
+
+      // Verify
+      expect(Jiffy.now().locale.startOfWeek, StartOfWeek.monday);
+    });
+
+    test('Should successfully configure ordinals', () async {
+      // Setup
+      await Jiffy.setLocale('en_US');
+
+      // Verify default ordinal before changing
+      expect(Jiffy.now().locale.ordinals,
+          Ordinals(first: 'st', second: 'nd', third: 'rd', nth: 'th'));
+
+      // Execute
+      final newOrdinal =
+          Ordinals(first: 'bla', second: 'bla', third: 'bla', nth: 'bla..bla');
+      await Jiffy.setLocale('ja', ordinals: newOrdinal);
+
+      // Verify
+      expect(Jiffy.now().locale.ordinals, newOrdinal);
+    });
+
+    test('Should successfully configure relative date time', () async {
+      // Setup
+      await Jiffy.setLocale('ja');
+
+      // Verify default relative date time before changing
+      expect(Jiffy.now().locale.relativeDateTime, JaRelativeDateTime());
+
+      // Execute
+      await Jiffy.setLocale('ja',
+          relativeDateTime: UpdatedJpRelativeDateTime());
+
+      // Verify
+      expect(Jiffy.now().locale.relativeDateTime.aboutAMonth(1),
+          "some months ago");
+    });
+
+    test('Should successfully get locale code', () async {
       // Setup
       await Jiffy.setLocale('ja');
       final jiffy = Jiffy.now();
@@ -253,7 +308,7 @@ void main() {
     group('Test available locales', () {
       test('Should successfully return a list of available locales', () {
         // Setup
-        final expectedSupportedLocales = supportedLocales();
+        final expectedSupportedLocales = dateTimeSymbolMap().keys.toList();
 
         // Execute
         final actualSupportedLocales = Jiffy.getSupportedLocales();
@@ -280,23 +335,10 @@ void main() {
       expect(actualLocaleStartOfWeek, expectedStartOfWeek);
     });
 
-    for (var testData in localeTestData()) {
-      test('Should successfully set expectedLocale', () async {
-        // Execute
-        await Jiffy.setLocale(testData['localeCode']);
-        final jiffy = Jiffy.now();
-
-        // Verify
-        final actualLocaleCode = jiffy.localeCode;
-        expect(actualLocaleCode, testData['expectedLocale'].code());
-      });
-    }
-
     test('Should throw Jiffy exception if locale is not supported', () async {
       // Setup
       final unknownLocaleCode = 'unknown_locale';
-      final expectedExceptionMessage = 'The locale `$unknownLocaleCode` is not '
-          'supported, please check here for a list of supported locales';
+      final expectedExceptionMessage = 'Invalid locale "$unknownLocaleCode"';
 
       // Execute and Verify
       expect(
@@ -425,7 +467,7 @@ void main() {
 
     test('Should successfully get day of week', () async {
       // Setup
-      await Jiffy.setLocale('en_us');
+      await Jiffy.setLocale('en_US');
       final jiffy = Jiffy.parseFromList([2022, 12, 5]);
 
       final expectedDayOfWeek = 2;
@@ -1103,215 +1145,6 @@ void main() {
   });
 }
 
-List<Map<String, dynamic>> localeTestData() {
-  return [
-    {
-      'localeCode': 'en',
-      'expectedLocale': EnLocale(),
-    },
-    {
-      'localeCode': 'en_us',
-      'expectedLocale': EnUsLocale(),
-    },
-    {
-      'localeCode': 'en_sg',
-      'expectedLocale': EnSgLocale(),
-    },
-    {
-      'localeCode': 'en_au',
-      'expectedLocale': EnAuLocale(),
-    },
-    {
-      'localeCode': 'en_ca',
-      'expectedLocale': EnCaLocale(),
-    },
-    {
-      'localeCode': 'en_gb',
-      'expectedLocale': EnGbLocale(),
-    },
-    {
-      'localeCode': 'en_ie',
-      'expectedLocale': EnIeLocale(),
-    },
-    {
-      'localeCode': 'en_il',
-      'expectedLocale': EnIlLocale(),
-    },
-    {
-      'localeCode': 'en_nz',
-      'expectedLocale': EnNzLocale(),
-    },
-    {
-      'localeCode': 'es',
-      'expectedLocale': EsLocale(),
-    },
-    {
-      'localeCode': 'es_do',
-      'expectedLocale': EsDoLocale(),
-    },
-    {
-      'localeCode': 'es_us',
-      'expectedLocale': EsUsLocale(),
-    },
-    {
-      'localeCode': 'fr',
-      'expectedLocale': FrLocale(),
-    },
-    {
-      'localeCode': 'fr_ch',
-      'expectedLocale': FrChLocale(),
-    },
-    {
-      'localeCode': 'fr_ca',
-      'expectedLocale': FrCaLocale(),
-    },
-    {
-      'localeCode': 'zh',
-      'expectedLocale': ZhLocale(),
-    },
-    {
-      'localeCode': 'zh_cn',
-      'expectedLocale': ZhCnLocale(),
-    },
-    {
-      'localeCode': 'zh_hk',
-      'expectedLocale': ZhHkLocale(),
-    },
-    {
-      'localeCode': 'zh_tw',
-      'expectedLocale': ZhTwLocale(),
-    },
-    {
-      'localeCode': 'de',
-      'expectedLocale': DeLocale(),
-    },
-    {
-      'localeCode': 'de_de',
-      'expectedLocale': DeDeLocale(),
-    },
-    {
-      'localeCode': 'de_at',
-      'expectedLocale': DeAtLocale(),
-    },
-    {
-      'localeCode': 'de_ch',
-      'expectedLocale': DeChLocale(),
-    },
-    {
-      'localeCode': 'it',
-      'expectedLocale': ItLocale(),
-    },
-    {
-      'localeCode': 'it_ch',
-      'expectedLocale': ItChLocale(),
-    },
-    {
-      'localeCode': 'ar',
-      'expectedLocale': ArLocale(),
-    },
-    {
-      'localeCode': 'ar_ly',
-      'expectedLocale': ArLyLocale(),
-    },
-    {
-      'localeCode': 'ar_dz',
-      'expectedLocale': ArDzLocale(),
-    },
-    {
-      'localeCode': 'ar_kw',
-      'expectedLocale': ArKwLocale(),
-    },
-    {
-      'localeCode': 'ar_sa',
-      'expectedLocale': ArSaLocale(),
-    },
-    {
-      'localeCode': 'ar_ma',
-      'expectedLocale': ArMaLocale(),
-    },
-    {
-      'localeCode': 'ar_tn',
-      'expectedLocale': ArTnLocale(),
-    },
-    {
-      'localeCode': 'az',
-      'expectedLocale': AzLocale(),
-    },
-    {
-      'localeCode': 'id',
-      'expectedLocale': IdLocale(),
-    },
-    {
-      'localeCode': 'ja',
-      'expectedLocale': JaLocale(),
-    },
-    {
-      'localeCode': 'ko',
-      'expectedLocale': KoLocale(),
-    },
-    {
-      'localeCode': 'ru',
-      'expectedLocale': RuLocale(),
-    },
-    {
-      'localeCode': 'uk',
-      'expectedLocale': UkLocale(),
-    },
-    {
-      'localeCode': 'hi',
-      'expectedLocale': HiLocale(),
-    },
-    {
-      'localeCode': 'hu',
-      'expectedLocale': HuLocale(),
-    },
-    {
-      'localeCode': 'hu_hu',
-      'expectedLocale': HuHuLocale(),
-    },
-    {
-      'localeCode': 'pt',
-      'expectedLocale': PtLocale(),
-    },
-    {
-      'localeCode': 'pt_br',
-      'expectedLocale': PtBrLocale(),
-    },
-    {
-      'localeCode': 'pl',
-      'expectedLocale': PlLocale(),
-    },
-    {
-      'localeCode': 'tr',
-      'expectedLocale': TrLocale(),
-    },
-    {
-      'localeCode': 'sv',
-      'expectedLocale': SvLocale(),
-    },
-    {
-      'localeCode': 'nb',
-      'expectedLocale': NbLocale(),
-    },
-    {
-      'localeCode': 'fa',
-      'expectedLocale': FaLocale(),
-    },
-    {
-      'localeCode': 'bn',
-      'expectedLocale': BnLocale(),
-    },
-    {
-      'localeCode': 'nl',
-      'expectedLocale': NlLocale(),
-    },
-    {
-      'localeCode': 'th',
-      'expectedLocale': ThLocale(),
-    },
-  ];
-}
-
 List<Map<String, dynamic>> defaultDisplayDateTimeFormatsTestData() {
   return [
     {
diff --git a/test/src/locale/ordinals_test.dart b/test/src/locale/ordinals_test.dart
new file mode 100644
index 00000000..a5079606
--- /dev/null
+++ b/test/src/locale/ordinals_test.dart
@@ -0,0 +1,134 @@
+import 'package:jiffy/src/locale/ordinals.dart';
+import 'package:jiffy/src/utils/jiffy_exception.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group('Ordinals', () {
+    test('Should correctly return first for 1', () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Execute
+      final result = ordinals.getOrdinal(1);
+
+      // Verify
+      expect(result, "st");
+    });
+
+    test('Should correctly return second for 2', () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Execute
+      final result = ordinals.getOrdinal(2);
+
+      // Verify
+      expect(result, "nd");
+    });
+
+    test('Should correctly return third for 3', () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Execute
+      final result = ordinals.getOrdinal(3);
+
+      // Verify
+      expect(result, "rd");
+    });
+
+    test(
+        'Should correctly return nth for numbers greater than 3 and less than 11',
+        () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Execute & Verify
+      expect(ordinals.getOrdinal(4), "th");
+      expect(ordinals.getOrdinal(10), "th");
+      expect(ordinals.getOrdinal(11), "th");
+    });
+
+    test('Should correctly return nth for numbers greater than 13', () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Execute & Verify
+      expect(ordinals.getOrdinal(14), "th");
+      expect(ordinals.getOrdinal(20), "th");
+      expect(ordinals.getOrdinal(100), "th");
+    });
+
+    test(
+        'Should correctly return st, nd, rd for numbers 1,2,3 after 10,20,30 etc',
+        () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Execute & Verify
+      expect(ordinals.getOrdinal(21), "st");
+      expect(ordinals.getOrdinal(32), "nd");
+      expect(ordinals.getOrdinal(43), "rd");
+    });
+
+    test('Should throw JiffyException for zero or negative numbers', () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Execute & Verify
+      expect(
+          () => ordinals.getOrdinal(0),
+          throwsA(isA<JiffyException>().having((e) => e.toString(), 'message',
+              contains("The date must be a positive integer."))));
+      expect(
+          () => ordinals.getOrdinal(-5),
+          throwsA(isA<JiffyException>().having((e) => e.toString(), 'message',
+              contains("The date must be a positive integer."))));
+    });
+
+    test('Should correctly create Ordinals object', () {
+      // Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+
+      // Verify
+      expect(ordinals.first, "st");
+      expect(ordinals.second, "nd");
+      expect(ordinals.third, "rd");
+      expect(ordinals.nth, "th");
+    });
+
+    test('Should correctly implement equals and hashcode', () {
+      // Setup
+      final ordinals1 =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+      final ordinals2 =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+      final ordinals3 = Ordinals(first: "a", second: "b", third: "c", nth: "d");
+
+      // Verify
+      expect(ordinals1, equals(ordinals2));
+      expect(ordinals1.hashCode, equals(ordinals2.hashCode));
+      expect(ordinals1, isNot(equals(ordinals3)));
+    });
+
+    test('asList should return a correct list', () {
+      //Setup
+      final ordinals =
+          Ordinals(first: "st", second: "nd", third: "rd", nth: "th");
+      //Execute
+      final list = ordinals.asList();
+
+      //Verify
+      expect(list, equals(["st", "nd", "rd", "th"]));
+      expect(list.length, 4);
+    });
+  });
+}
diff --git a/test/src/locale/locales/locales_test.dart b/test/src/locale/relative_date_time_test.dart
similarity index 77%
rename from test/src/locale/locales/locales_test.dart
rename to test/src/locale/relative_date_time_test.dart
index a44d18d5..f06ebd49 100644
--- a/test/src/locale/locales/locales_test.dart
+++ b/test/src/locale/relative_date_time_test.dart
@@ -1,56 +1,15 @@
+import 'package:jiffy/src/locale/ordinals.dart';
+import 'package:jiffy/src/locale/relative_date_time.dart';
+import 'package:jiffy/src/manipulator.dart';
 import 'package:jiffy/src/display.dart';
 import 'package:jiffy/src/enums/start_of_week.dart';
 import 'package:jiffy/src/getter.dart';
 import 'package:jiffy/src/locale/locale.dart';
-import 'package:jiffy/src/locale/locales/ar_locale.dart';
-import 'package:jiffy/src/locale/locales/az_locale.dart';
-import 'package:jiffy/src/locale/locales/bn_locale.dart';
-import 'package:jiffy/src/locale/locales/cs_locale.dart';
-import 'package:jiffy/src/locale/locales/de_locale.dart';
-import 'package:jiffy/src/locale/locales/en_locale.dart';
-import 'package:jiffy/src/locale/locales/es_locale.dart';
-import 'package:jiffy/src/locale/locales/fa_locale.dart';
-import 'package:jiffy/src/locale/locales/fr_locale.dart';
-import 'package:jiffy/src/locale/locales/hi_locale.dart';
-import 'package:jiffy/src/locale/locales/hu_locale.dart';
-import 'package:jiffy/src/locale/locales/id_locale.dart';
-import 'package:jiffy/src/locale/locales/it_locale.dart';
-import 'package:jiffy/src/locale/locales/ja_locale.dart';
-import 'package:jiffy/src/locale/locales/ko_locale.dart';
-import 'package:jiffy/src/locale/locales/nb_locale.dart';
-import 'package:jiffy/src/locale/locales/nl_locale.dart';
-import 'package:jiffy/src/locale/locales/pl_locale.dart';
-import 'package:jiffy/src/locale/locales/pt_locale.dart';
-import 'package:jiffy/src/locale/locales/ru_locale.dart';
-import 'package:jiffy/src/locale/locales/sk_locale.dart';
-import 'package:jiffy/src/locale/locales/sv_locale.dart';
-import 'package:jiffy/src/locale/locales/th_locale.dart';
-import 'package:jiffy/src/locale/locales/tr_locale.dart';
-import 'package:jiffy/src/locale/locales/uk_locale.dart';
-import 'package:jiffy/src/locale/locales/zh_locale.dart';
-import 'package:jiffy/src/manipulator.dart';
 import 'package:jiffy/src/query.dart';
-import 'package:test/expect.dart';
-import 'package:test/scaffolding.dart';
-
-void main() {
-  group('Test locale properties', () {
-    for (var testData in localesTestData()) {
-      test('Should successfully check locale properties are correct', () {
-        // Setup
-        final locale = testData['locale'] as Locale;
 
-        // Verify
-        expect(locale.code(), testData['code']);
-        expect(locale.ordinals().length, 4);
-        expect(locale.ordinals(), testData['ordinals']);
-        expect(locale.startOfWeek(), testData['startOfWeek']);
-        expect(locale.relativeDateTime().runtimeType,
-            testData['relativeTime'].runtimeType);
-      });
-    }
-  });
+import 'package:test/test.dart';
 
+void main() {
   group('Test locale relative date time', () {
     final getter = Getter();
     final manipulator = Manipulator(getter);
@@ -59,11 +18,19 @@ void main() {
 
     for (var testData in localesRelativeDateTimeTestData()) {
       test('Should successfully return correct relative date time', () {
+        // Setup
+        final locale = Locale(
+            code: "en",
+            ordinals:
+                Ordinals(first: "st", second: "nd", third: "rd", nth: "th"),
+            startOfWeek: StartOfWeek.monday,
+            relativeDateTime: testData['relativeDateTime']);
+
         // Execute
         final actualRelativeDateTime = display.toAsRelativeDateTime(
             testData['firstDateTime'],
             testData['secondDateTime'],
-            testData['locale'],
+            locale,
             true);
 
         // Verify
@@ -73,939 +40,563 @@ void main() {
   });
 }
 
-List<Map<String, dynamic>> localesTestData() {
-  return [
-    {
-      'locale': EnLocale(),
-      'code': 'en',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnUsLocale(),
-      'code': 'en_us',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnSgLocale(),
-      'code': 'en_sg',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnAuLocale(),
-      'code': 'en_au',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnCaLocale(),
-      'code': 'en_ca',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnGbLocale(),
-      'code': 'en_gb',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnIeLocale(),
-      'code': 'en_ie',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnIlLocale(),
-      'code': 'en_il',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EnNzLocale(),
-      'code': 'en_nz',
-      'ordinals': ['st', 'nd', 'rd', 'th'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EnRelativeTime()
-    },
-    {
-      'locale': EsLocale(),
-      'code': 'es',
-      'ordinals': ['º', 'º', 'º', 'º'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': EsRelativeTime()
-    },
-    {
-      'locale': EsDoLocale(),
-      'code': 'es_do',
-      'ordinals': ['º', 'º', 'º', 'º'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': EsRelativeTime()
-    },
-    {
-      'locale': EsUsLocale(),
-      'code': 'es_us',
-      'ordinals': ['º', 'º', 'º', 'º'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': EsRelativeTime()
-    },
-    {
-      'locale': FrLocale(),
-      'code': 'fr',
-      'ordinals': ['er', '', '', ''],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': FrRelativeTime()
-    },
-    {
-      'locale': FrChLocale(),
-      'code': 'fr_ch',
-      'ordinals': ['er', '', '', ''],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': FrRelativeTime()
-    },
-    {
-      'locale': FrCaLocale(),
-      'code': 'fr_ca',
-      'ordinals': ['er', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': FrRelativeTime()
-    },
-    {
-      'locale': ZhLocale(),
-      'code': 'zh',
-      'ordinals': ['日', '日', '日', '日'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': ZhRelativeTime()
-    },
-    {
-      'locale': ZhCnLocale(),
-      'code': 'zh_cn',
-      'ordinals': ['日', '日', '日', '日'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': ZhCnRelativeTime()
-    },
-    {
-      'locale': ZhHkLocale(),
-      'code': 'zh_hk',
-      'ordinals': ['日', '日', '日', '日'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': ZhRelativeTime()
-    },
-    {
-      'locale': ZhTwLocale(),
-      'code': 'zh_tw',
-      'ordinals': ['日', '日', '日', '日'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': ZhRelativeTime()
-    },
-    {
-      'locale': DeLocale(),
-      'code': 'de',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': DeRelativeTime()
-    },
-    {
-      'locale': DeDeLocale(),
-      'code': 'de_de',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': DeRelativeTime()
-    },
-    {
-      'locale': DeAtLocale(),
-      'code': 'de_at',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': DeRelativeTime()
-    },
-    {
-      'locale': DeChLocale(),
-      'code': 'de_ch',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': DeRelativeTime()
-    },
-    {
-      'locale': ItLocale(),
-      'code': 'it',
-      'ordinals': ['º', 'º', 'º', 'º'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': ItRelativeTime()
-    },
-    {
-      'locale': ItChLocale(),
-      'code': 'it_ch',
-      'ordinals': ['º', 'º', 'º', 'º'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': ItRelativeTime()
-    },
-    {
-      'locale': ArLocale(),
-      'code': 'ar',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.saturday,
-      'relativeTime': ArRelativeTime(true)
-    },
-    {
-      'locale': ArLyLocale(),
-      'code': 'ar_ly',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.saturday,
-      'relativeTime': ArRelativeTime(false)
-    },
-    {
-      'locale': ArDzLocale(),
-      'code': 'ar_dz',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': ArSaMaDzKwTnRelativeTime(false)
-    },
-    {
-      'locale': ArKwLocale(),
-      'code': 'ar_kw',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': ArSaMaDzKwTnRelativeTime(false)
-    },
-    {
-      'locale': ArSaLocale(),
-      'code': 'ar_sa',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': ArSaMaDzKwTnRelativeTime(true)
-    },
-    {
-      'locale': ArMaLocale(),
-      'code': 'ar_ma',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.saturday,
-      'relativeTime': ArSaMaDzKwTnRelativeTime(false)
-    },
-    {
-      'locale': ArTnLocale(),
-      'code': 'ar_tn',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.saturday,
-      'relativeTime': ArSaMaDzKwTnRelativeTime(false)
-    },
-    {
-      'locale': AzLocale(),
-      'code': 'az',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': AzRelativeTime()
-    },
-    {
-      'locale': IdLocale(),
-      'code': 'id',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': IdRelativeTime()
-    },
-    {
-      'locale': JaLocale(),
-      'code': 'ja',
-      'ordinals': ['日', '日', '日', '日'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': JaRelativeTime()
-    },
-    {
-      'locale': KoLocale(),
-      'code': 'ko',
-      'ordinals': ['일', '일', '일', '일'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': KoRelativeTime()
-    },
-    {
-      'locale': RuLocale(),
-      'code': 'ru',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': RuRelativeTime()
-    },
-    {
-      'locale': UkLocale(),
-      'code': 'uk',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': UkRelativeTime()
-    },
-    {
-      'locale': HiLocale(),
-      'code': 'hi',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': HiRelativeTime()
-    },
-    {
-      'locale': HuLocale(),
-      'code': 'hu',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': HuRelativeTime()
-    },
-    {
-      'locale': HuHuLocale(),
-      'code': 'hu_hu',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': HuRelativeTime()
-    },
-    {
-      'locale': PtLocale(),
-      'code': 'pt',
-      'ordinals': ['º', 'º', 'º', 'º'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': PtRelativeTime()
-    },
-    {
-      'locale': PtBrLocale(),
-      'code': 'pt_br',
-      'ordinals': ['º', 'º', 'º', 'º'],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': PtRelativeTime()
-    },
-    {
-      'locale': PlLocale(),
-      'code': 'pl',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': PlRelativeTime()
-    },
-    {
-      'locale': TrLocale(),
-      'code': 'tr',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': TrRelativeTime()
-    },
-    {
-      'locale': SvLocale(),
-      'code': 'sv',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': SvRelativeTime()
-    },
-    {
-      'locale': NbLocale(),
-      'code': 'nb',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': NbRelativeTime()
-    },
-    {
-      'locale': FaLocale(),
-      'code': 'fa',
-      'ordinals': ['م', 'م', 'م', 'م'],
-      'startOfWeek': StartOfWeek.saturday,
-      'relativeTime': FaRelativeTime()
-    },
-    {
-      'locale': BnLocale(),
-      'code': 'bn',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': BnRelativeTime()
-    },
-    {
-      'locale': NlLocale(),
-      'code': 'nl',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': NlRelativeTime()
-    },
-    {
-      'locale': ThLocale(),
-      'code': 'th',
-      'ordinals': ['', '', '', ''],
-      'startOfWeek': StartOfWeek.sunday,
-      'relativeTime': ThRelativeTime()
-    },
-    {
-      'locale': SkLocale(),
-      'code': 'sk',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': SkRelativeTime(),
-    },
-    {
-      'locale': CsLocale(),
-      'code': 'cs',
-      'ordinals': ['.', '.', '.', '.'],
-      'startOfWeek': StartOfWeek.monday,
-      'relativeTime': CsRelativeTime(),
-    },
-  ];
-}
-
 List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
   return [
-    // EnLocale
+    // EnRelativeDateTime
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'in a few seconds',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'in a few seconds',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'a few seconds ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'in a minute',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'a minute ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'in 2 minutes',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 minutes ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'in an hour',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'an hour ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'in 2 hours',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 hours ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'in a day',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'a day ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'in 3 days',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 days ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'in a month',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'a month ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'in 2 months',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 months ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'in a year',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'a year ago',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'in 3 years',
     },
     {
-      'locale': EnLocale(),
+      'relativeDateTime': EnRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 years ago',
     },
 
-    // EsLocale
+    // EsRelativeDateTime
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'en un momento',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'en un momento',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'hace un momento',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'en un minuto',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'hace un minuto',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'en 2 minutos',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'hace 2 minutos',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'en una hora',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'hace una hora',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'en 2 horas',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'hace 2 horas',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'en un día',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'hace un día',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'en 3 días',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'hace 3 días',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'en un mes',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'hace un mes',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'en 2 meses',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'hace 2 meses',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'en un año',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'hace un año',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'en 3 años',
     },
     {
-      'locale': EsLocale(),
+      'relativeDateTime': EsRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'hace 3 años',
     },
 
-    // FrLocale
+    // FrRelativeDateTime
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'dans quelques secondes',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'dans quelques secondes',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'il y a quelques secondes',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'dans une minute',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'il y a une minute',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'dans 2 minutes',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'il y a 2 minutes',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'dans une heure',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'il y a une heure',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'dans 2 heures',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'il y a 2 heures',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'dans un jour',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'il y a un jour',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'dans 3 jours',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'il y a 3 jours',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'dans un mois',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'il y a un mois',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'dans 2 mois',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'il y a 2 mois',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'dans un an',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'il y a un an',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'dans 3 ans',
     },
     {
-      'locale': FrLocale(),
+      'relativeDateTime': FrRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'il y a 3 ans',
     },
 
-    // ZhLocale
+    // ZhRelativeDateTime
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '幾秒内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': '幾秒内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '幾秒前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': '1 分鐘内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': '1 分鐘前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2 分鐘内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 分鐘前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': '1 小時内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': '1 小時前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2 小時内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 小時前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '1 天内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': '1 天前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3 天内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 天前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': '1 個月内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': '1 個月前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2 個月内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 個月前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '1 年内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': '1 年前',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3 年内',
     },
     {
-      'locale': ZhLocale(),
+      'relativeDateTime': ZhRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 年前',
@@ -1013,139 +604,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // ZhCnLocale
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '几秒内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': '几秒内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '几秒前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': '1 分钟内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': '1 分钟前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2 分钟内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 分钟前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': '1 小时内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': '1 小时前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2 小时内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 小时前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '1 天内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': '1 天前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3 天内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 天前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': '1 个月内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': '1 个月前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2 个月内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 个月前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '1 年内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': '1 年前',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3 年内',
     },
     {
-      'locale': ZhCnLocale(),
+      'relativeDateTime': ZhCnRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 年前',
@@ -1153,139 +744,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // DeLocale
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'in ein paar Sekunden',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'in ein paar Sekunden',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'vor ein paar Sekunden',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'in einer Minute',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'vor einer Minute',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'in 2 Minuten',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'vor 2 Minuten',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'in einer Stunde',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'vor einer Stunde',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'in 2 Stunden',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'vor 2 Stunden',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'in einem Tag',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'vor einem Tag',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'in 3 Tagen',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'vor 3 Tagen',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'in einem Monat',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'vor einem Monat',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'in 2 Monaten',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'vor 2 Monaten',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'in einem Jahr',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'vor einem Jahr',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'in 3 Jahren',
     },
     {
-      'locale': DeLocale(),
+      'relativeDateTime': DeRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'vor 3 Jahren',
@@ -1293,139 +884,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // ItLocale
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'tra alcuni secondi',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'tra alcuni secondi',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'alcuni secondi fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'tra un minuto',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'un minuto fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'tra 2 minuti',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 minuti fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'tra un\'ora',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'un\'ora fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'tra 2 ore',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 ore fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'tra un giorno',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'un giorno fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'tra 3 giorni',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 giorni fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'tra un mese',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'un mese fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'tra 2 mesi',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 mesi fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'tra un anno',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'un anno fa',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'tra 3 anni',
     },
     {
-      'locale': ItLocale(),
+      'relativeDateTime': ItRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 anni fa',
@@ -1433,139 +1024,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // ArLocale
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'بعد ثانية واحدة',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'بعد ثانية واحدة',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'منذ ثانية واحدة',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'بعد دقيقة واحدة',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'منذ دقيقة واحدة',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'بعد دقيقتين',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'منذ دقيقتين',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'بعد ساعة واحدة',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'منذ ساعة واحدة',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'بعد  ساعتين',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'منذ  ساعتين',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'بعد يوم واحد',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'منذ يوم واحد',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'بعد ۳ ايام ',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'منذ ۳ ايام ',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'بعد شهر واحد',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'منذ شهر واحد',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'بعد شهرين',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'منذ شهرين',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'بعد عام واحد',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'منذ عام واحد',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'بعد ۳ أعوام ',
     },
     {
-      'locale': ArLocale(),
+      'relativeDateTime': ArRelativeDateTime(true),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'منذ ۳ أعوام ',
@@ -1573,139 +1164,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // ArSaLocale
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'في ثوان',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'في ثوان',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'منذ ثوان',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'في دقيقة',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'منذ دقيقة',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'في ۲ دقائق ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'منذ ۲ دقائق ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'في ساعة',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'منذ ساعة',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'في ۲ ساعات ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'منذ ۲ ساعات ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'في يوم',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'منذ يوم',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'في ۳ أيام ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'منذ ۳ أيام ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'في شهر',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'منذ شهر',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'في ۲ أشهر ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'منذ ۲ أشهر ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'في سنة',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'منذ سنة',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'في ۳ سنوات ',
     },
     {
-      'locale': ArSaLocale(),
+      'relativeDateTime': ArSaMaDzKwTnRelativeDateTime(true),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'منذ ۳ سنوات ',
@@ -1713,139 +1304,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // AzLocale
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'bir neçə saniyə sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'bir neçə saniyə sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'bir neçə saniyə geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'dəqiqə sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'dəqiqə geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2 dəqiqə sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 dəqiqə geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'saat sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'saat geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2 saat sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 saat geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'gün sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'gün geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3 gün sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 gün geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'ay sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'ay geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2 ay sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 ay geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'il sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'il geri',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3 il sonra',
     },
     {
-      'locale': AzLocale(),
+      'relativeDateTime': AzRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 il geri',
@@ -1853,139 +1444,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // IdLocale
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'dalam beberapa detik',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'dalam beberapa detik',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'beberapa detik yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'dalam satu menit',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'satu menit yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'dalam 2 menit',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 menit yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'dalam satu jam',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'satu jam yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'dalam 2 jam',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 jam yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'dalam satu hari',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'satu hari yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'dalam 3 hari',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 hari yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'dalam satu bulan',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'satu bulan yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'dalam 2 bulan',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 bulan yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'dalam satu tahun',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'satu tahun yang lalu',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'dalam 3 tahun',
     },
     {
-      'locale': IdLocale(),
+      'relativeDateTime': IdRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 tahun yang lalu',
@@ -1993,139 +1584,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // JaLocale
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '数秒後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': '数秒後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '数秒前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': '1分後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': '1分前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2分後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2分前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': '1時間後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': '1時間前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2時間後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2時間前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '1日後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': '1日前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3日後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3日前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': '1ヶ月後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': '1ヶ月前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2ヶ月後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2ヶ月前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '1年後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': '1年前',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3年後',
     },
     {
-      'locale': JaLocale(),
+      'relativeDateTime': JaRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3年前',
@@ -2133,139 +1724,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // KoLocale
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '몇 초 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': '몇 초 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': '몇 초 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': '1분 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': '1분 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2분 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2분 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': '한 시간 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': '한 시간 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2시간 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2시간 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '하루 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': '하루 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3일 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3일 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': '한 달 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': '한 달 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2달 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2달 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '일 년 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': '일 년 전',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3년 후',
     },
     {
-      'locale': KoLocale(),
+      'relativeDateTime': KoRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3년 전',
@@ -2273,139 +1864,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // RuLocale
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'через несколько секунд',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'через несколько секунд',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'несколько секунд назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'через минуту',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'минуту назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'через 2 минуты',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 минуты назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'через час',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'час назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'через 2 часа',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 часа назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'через день',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'день назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'через 3 дня',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 дня назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'через месяц',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'месяц назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'через 2 месяца',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 месяца назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'через год',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'год назад',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'через 3 года',
     },
     {
-      'locale': RuLocale(),
+      'relativeDateTime': RuRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 года назад',
@@ -2413,139 +2004,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // UkLocale
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'через декілька секунд',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'через декілька секунд',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'декілька секунд тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'через хвилину',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'хвилину тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'через 2 хвилини',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 хвилини тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'через годину',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'годину тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'через 2 години',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 години тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'через день',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'день тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'через 3 дні',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 дні тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'через місяць',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'місяць тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'через 2 місяці',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 місяці тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'через рік',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'рік тому',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'через 3 роки',
     },
     {
-      'locale': UkLocale(),
+      'relativeDateTime': UkRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 роки тому',
@@ -2553,139 +2144,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // HiLocale
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'कुछ ही क्षण में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'कुछ ही क्षण में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'कुछ ही क्षण पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'एक मिनट में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'एक मिनट पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2 मिनट में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 मिनट पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'एक घंटा में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'एक घंटा पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2 घंटे में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 घंटे पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'एक दिन में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'एक दिन पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3 दिन में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 दिन पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'एक महीने में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'एक महीने पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2 महीने में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 महीने पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'एक वर्ष में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'एक वर्ष पहले',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3 वर्ष में',
     },
     {
-      'locale': HiLocale(),
+      'relativeDateTime': HiRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 वर्ष पहले',
@@ -2693,139 +2284,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // HuLocale
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'néhány másodperccel ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'néhány másodperccel ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'néhány másodperccel ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'egy perccel ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'egy perccel ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2 perccel ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 perccel ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'egy órával ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'egy órával ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2 órával ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 órával ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'egy nappal ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'egy nappal ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3 nappal ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 nappal ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'egy hónappal ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'egy hónappal ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2 hónappal ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 hónappal ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'egy évvel ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'egy évvel ezelőtt',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3 évvel ezután',
     },
     {
-      'locale': HuLocale(),
+      'relativeDateTime': HuRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 évvel ezelőtt',
@@ -2833,139 +2424,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // PtLocale
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'em segundos',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'em segundos',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'há segundos',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'em um minuto',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'há um minuto',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'em 2 minutos',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'há 2 minutos',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'em uma hora',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'há uma hora',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'em 2 horas',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'há 2 horas',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'em um dia',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'há um dia',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'em 3 dias',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'há 3 dias',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'em um mês',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'há um mês',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'em 2 meses',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'há 2 meses',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'em um ano',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'há um ano',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'em 3 anos',
     },
     {
-      'locale': PtLocale(),
+      'relativeDateTime': PtRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'há 3 anos',
@@ -2973,139 +2564,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // PlLocale
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'za kilka sekund',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'za kilka sekund',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'kilka sekund temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'za minutę',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'minutę temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'za 2 minuty',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 minuty temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'za godzinę',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'godzinę temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'za 2 godziny',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 godziny temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'za 1 dzień',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': '1 dzień temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'za 3 dni',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 dni temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'za miesiąc',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'miesiąc temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'za 2 miesiące',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 miesiące temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'za rok',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'rok temu',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'za 3 lata',
     },
     {
-      'locale': PlLocale(),
+      'relativeDateTime': PlRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 lata temu',
@@ -3113,139 +2704,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // TrLocale
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'birkaç saniye içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'birkaç saniye içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'birkaç saniye önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'bir dakika içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'bir dakika önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2 dakika içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 dakika önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'bir saat içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'bir saat önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2 saat içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 saat önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'bir gün içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'bir gün önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3 gün içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 gün önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'bir ay içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'bir ay önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2 ay içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 ay önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'bir yıl içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'bir yıl önce',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3 yıl içinde',
     },
     {
-      'locale': TrLocale(),
+      'relativeDateTime': TrRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 yıl önce',
@@ -3253,139 +2844,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // SvLocale
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'om några sekunder',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'om några sekunder',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'några sekunder sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'om en minut',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'en minut sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'om 2 minuter',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 minuter sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'om en timme',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'en timme sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'om 2 timmar',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 timmar sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'om en dag',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'en dag sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'om 3 dagar',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 dagar sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'om en månad',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'en månad sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'om 2 månader',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 månader sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'om ett år',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'ett år sedan',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'om 3 år',
     },
     {
-      'locale': SvLocale(),
+      'relativeDateTime': SvRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 år sedan',
@@ -3393,139 +2984,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // NbLocale
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'om noen sekunder',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'om noen sekunder',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'noen sekunder siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'om ett minutt',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'ett minutt siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'om 2 minutter',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 minutter siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'om en time',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'en time siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'om 2 timer',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 timer siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'om en dag',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'en dag siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'om 3 dager',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 dager siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'om en måned',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'en måned siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'om 2 måneder',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 måneder siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'om ett år',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'ett år siden',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'om 3 år',
     },
     {
-      'locale': NbLocale(),
+      'relativeDateTime': NbRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 år siden',
@@ -3533,139 +3124,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // FaLocale
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'چند ثانیه بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'چند ثانیه بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'چند ثانیه پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'یک دقیقه بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'یک دقیقه پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '۲ دقیقه  بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '۲ دقیقه  پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'یک ساعت بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'یک ساعت پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '۲ ساعت  بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '۲ ساعت  پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'یک روز بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'یک روز پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '۳ روز  بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '۳ روز  پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'یک ماه بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'یک ماه پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '۲ ماه  بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '۲ ماه  پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'یک سال بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'یک سال پیش',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '۳ سال  بعد',
     },
     {
-      'locale': FaLocale(),
+      'relativeDateTime': FaRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '۳ سال  پیش',
@@ -3673,139 +3264,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // BnLocale
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'কিছু মুহূর্ত পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'কিছু মুহূর্ত পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'কিছু মুহূর্ত আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'এক মিনিট পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'এক মিনিট আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '২ মিনিট পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '২ মিনিট আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'এক ঘন্টা পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'এক ঘন্টা আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '২ ঘন্টা পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '২ ঘন্টা আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'এক দিন পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'এক দিন আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '৩ দিন পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '৩ দিন আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'এক মাস পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'এক মাস আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '২ মাস পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '২ মাস আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'এক বছর পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'এক বছর আগে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '৩ বছর পরে',
     },
     {
-      'locale': BnLocale(),
+      'relativeDateTime': BnRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '৩ বছর আগে',
@@ -3813,139 +3404,139 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // NlLocale
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'een ogenblik',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'op dit moment',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'op dit moment geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'een minuut',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'een minuut geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': '2 minuten',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 minuten geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'een uur',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'een uur geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': '2 uur',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 uur geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'een dag',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'een dag geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': '3 dagen',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 dagen geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'een maand',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'een maand geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': '2 maanden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 maanden geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'een jaar',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'een jaar geleden',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': '3 jaar',
     },
     {
-      'locale': NlLocale(),
+      'relativeDateTime': NlRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 jaar geleden',
@@ -3953,417 +3544,417 @@ List<Map<String, dynamic>> localesRelativeDateTimeTestData() {
 
     // ThLocale
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'อีกไม่กี่วินาที',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'อีกไม่กี่วินาที',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'ไม่กี่วินาทีที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'อีก1 นาที',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': '1 นาทีที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'อีก2 นาที',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': '2 นาทีที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'อีก1 ชั่วโมง',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': '1 ชั่วโมงที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'อีก2 ชั่วโมง',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': '2 ชั่วโมงที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'อีก1 วัน',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': '1 วันที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'อีก3 วัน',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': '3 วันที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'อีก1 เดือน',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': '1 เดือนที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'อีก2 เดือน',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': '2 เดือนที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'อีก1 ปี',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': '1 ปีที่แล้ว',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'อีก3 ปี',
     },
     {
-      'locale': ThLocale(),
+      'relativeDateTime': ThRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': '3 ปีที่แล้ว',
     },
     // SkLocale
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'za pár sekundami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'za pár sekundami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'pred pár sekundami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'za minútou',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'pred minútou',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'za 2 minútami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'pred 2 minútami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'za hodinou',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'pred hodinou',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'za 2 hodinami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'pred 2 hodinami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'za dňom',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'pred dňom',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'za 3 dňami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'pred 3 dňami',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'za mesiacom',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'pred mesiacom',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'za 2 mesiacmi',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'pred 2 mesiacmi',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'za rokom',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'pred rokom',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'za 3 rokmi',
     },
     {
-      'locale': SkLocale(),
+      'relativeDateTime': SkRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'pred 3 rokmi',
     },
     // CsLocale
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'za pár sekundami',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'expectedRelativeDateTime': 'za pár sekundami',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 23),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 22),
       'expectedRelativeDateTime': 'před pár sekundami',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'expectedRelativeDateTime': 'za minutou',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 11, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 11, 0),
       'expectedRelativeDateTime': 'před minutou',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 1),
       'secondDateTime': DateTime(1997, 10, 23, 12, 3),
       'expectedRelativeDateTime': 'za 2 minutami',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 3),
       'secondDateTime': DateTime(1997, 10, 23, 12, 1),
       'expectedRelativeDateTime': 'před 2 minutami',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 0),
       'secondDateTime': DateTime(1997, 10, 23, 12, 45),
       'expectedRelativeDateTime': 'za hodinou',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 12, 45),
       'secondDateTime': DateTime(1997, 10, 23, 12, 0),
       'expectedRelativeDateTime': 'před hodinou',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 1),
       'secondDateTime': DateTime(1997, 10, 23, 3),
       'expectedRelativeDateTime': 'za 2 hodinami',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23, 3),
       'secondDateTime': DateTime(1997, 10, 23, 1),
       'expectedRelativeDateTime': 'před 2 hodinami',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 22),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'za dnem',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 22),
       'expectedRelativeDateTime': 'před dnem',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 20),
       'secondDateTime': DateTime(1997, 10, 23),
       'expectedRelativeDateTime': 'za 3 dny',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 23),
       'secondDateTime': DateTime(1997, 10, 20),
       'expectedRelativeDateTime': 'před 3 dny',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10, 1),
       'secondDateTime': DateTime(1997, 11, 1),
       'expectedRelativeDateTime': 'za měsícem',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 11, 1),
       'secondDateTime': DateTime(1997, 10, 1),
       'expectedRelativeDateTime': 'před měsícem',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 10),
       'secondDateTime': DateTime(1997, 12),
       'expectedRelativeDateTime': 'za 2 měsíci',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997, 12),
       'secondDateTime': DateTime(1997, 10),
       'expectedRelativeDateTime': 'před 2 měsíci',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1997),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'za rokem',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1997),
       'expectedRelativeDateTime': 'před rokem',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1995),
       'secondDateTime': DateTime(1998),
       'expectedRelativeDateTime': 'za 3 lety',
     },
     {
-      'locale': CsLocale(),
+      'relativeDateTime': CsRelativeDateTime(),
       'firstDateTime': DateTime(1998),
       'secondDateTime': DateTime(1995),
       'expectedRelativeDateTime': 'před 3 lety',
diff --git a/test/src/locale/supported_locales_test.dart b/test/src/locale/supported_locales_test.dart
deleted file mode 100644
index 26ab6693..00000000
--- a/test/src/locale/supported_locales_test.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-import 'package:jiffy/src/locale/supported_locales.dart';
-import 'package:test/expect.dart';
-import 'package:test/scaffolding.dart';
-
-void main() {
-  group('Test available locales', () {
-    test('Should successfully return a list of available locales', () {
-      // Setup
-      final expectedSupportedLocales = supportedLocales();
-
-      // Execute
-      final actualSupportedLocales = getSupportedLocales();
-
-      actualSupportedLocales.sort();
-      expectedSupportedLocales.sort();
-
-      // Verify
-      expect(actualSupportedLocales, expectedSupportedLocales);
-    });
-  });
-}
-
-List<String> supportedLocales() {
-  return [
-    'en_us',
-    'en',
-    'en_sg',
-    'en_au',
-    'en_ca',
-    'en_gb',
-    'en_ie',
-    'en_il',
-    'en_nz',
-    'es',
-    'es_do',
-    'es_us',
-    'fr',
-    'fr_ch',
-    'fr_ca',
-    'zh',
-    'zh_cn',
-    'zh_hk',
-    'zh_tw',
-    'de',
-    'de_de',
-    'de_at',
-    'de_ch',
-    'it',
-    'it_ch',
-    'ar',
-    'ar_ly',
-    'ar_dz',
-    'ar_kw',
-    'ar_sa',
-    'ar_ma',
-    'ar_tn',
-    'az',
-    'id',
-    'ja',
-    'ko',
-    'ru',
-    'uk',
-    'hi',
-    'hu',
-    'hu_hu',
-    'pt',
-    'pt_br',
-    'pl',
-    'tr',
-    'sv',
-    'nb',
-    'fa',
-    'bn',
-    'nl',
-    'th',
-    'sk',
-    'cs',
-  ];
-}
diff --git a/test/src/parser_test.dart b/test/src/parser_test.dart
index 06a00e5f..7e4f69b9 100644
--- a/test/src/parser_test.dart
+++ b/test/src/parser_test.dart
@@ -1,6 +1,5 @@
-import 'package:jiffy/src/enums/unit.dart';
+import 'package:jiffy/jiffy.dart';
 import 'package:jiffy/src/getter.dart';
-import 'package:jiffy/src/locale/locales/en_locale.dart';
 import 'package:jiffy/src/parser.dart';
 import 'package:jiffy/src/utils/jiffy_exception.dart';
 import 'package:test/test.dart';
@@ -9,7 +8,11 @@ void main() {
   final getter = Getter();
   final underTest = Parser(getter);
 
-  final locale = EnLocale();
+  final locale = Locale(
+      code: "en",
+      ordinals: Ordinals(first: "st", second: "nd", third: "rd", nth: "th"),
+      startOfWeek: StartOfWeek.sunday,
+      relativeDateTime: EnRelativeDateTime());
 
   group('Test parsing datetime from string', () {
     for (var testData in fromStringWithPatternTestData()) {