Add support for romanian locale (#13807)

diff --git a/AUTHORS b/AUTHORS
index 3501c54..1472643 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -19,3 +19,4 @@
 Stefano Rodriguez <hlsroddy@gmail.com>
 Yusuke Konishi <yahpeycoy0403@gmail.com>
 Fredrik Simón <fredrik@fsimon.net>
+Ali Bitek <alibitek@protonmail.ch>
diff --git a/packages/flutter/lib/src/material/app.dart b/packages/flutter/lib/src/material/app.dart
index fb32cb0..8fac0a4 100644
--- a/packages/flutter/lib/src/material/app.dart
+++ b/packages/flutter/lib/src/material/app.dart
@@ -377,6 +377,7 @@
   /// ja - Japanese
   /// ps - Pashto
   /// pt - Portugese
+  /// ro - Romanian
   /// ru - Russian
   /// sd - Sindhi
   /// ur - Urdu
diff --git a/packages/flutter_localizations/lib/src/l10n/date_localizations.dart b/packages/flutter_localizations/lib/src/l10n/date_localizations.dart
index bfabb84..19d685c 100644
--- a/packages/flutter_localizations/lib/src/l10n/date_localizations.dart
+++ b/packages/flutter_localizations/lib/src/l10n/date_localizations.dart
@@ -1980,6 +1980,184 @@
       r'''{1} {0}'''
     ],
   },
+  'ro': const <String, dynamic>{
+    'NAME': r'''ro''',
+    'ERAS': const <dynamic>[r'''î.Hr.''', r'''d.Hr.'''],
+    'ERANAMES': const <dynamic>[r'''înainte de Hristos''', r'''după Hristos'''],
+    'NARROWMONTHS': const <dynamic>[
+      r'''I''',
+      r'''F''',
+      r'''M''',
+      r'''A''',
+      r'''M''',
+      r'''I''',
+      r'''I''',
+      r'''A''',
+      r'''S''',
+      r'''O''',
+      r'''N''',
+      r'''D'''
+    ],
+    'STANDALONENARROWMONTHS': const <dynamic>[
+      r'''I''',
+      r'''F''',
+      r'''M''',
+      r'''A''',
+      r'''M''',
+      r'''I''',
+      r'''I''',
+      r'''A''',
+      r'''S''',
+      r'''O''',
+      r'''N''',
+      r'''D'''
+    ],
+    'MONTHS': const <dynamic>[
+      r'''ianuarie''',
+      r'''februarie''',
+      r'''martie''',
+      r'''aprilie''',
+      r'''mai''',
+      r'''iunie''',
+      r'''iulie''',
+      r'''august''',
+      r'''septembrie''',
+      r'''octombrie''',
+      r'''noiembrie''',
+      r'''decembrie'''
+    ],
+    'STANDALONEMONTHS': const <dynamic>[
+      r'''ianuarie''',
+      r'''februarie''',
+      r'''martie''',
+      r'''aprilie''',
+      r'''mai''',
+      r'''iunie''',
+      r'''iulie''',
+      r'''august''',
+      r'''septembrie''',
+      r'''octombrie''',
+      r'''noiembrie''',
+      r'''decembrie'''
+    ],
+    'SHORTMONTHS': const <dynamic>[
+      r'''ian.''',
+      r'''feb.''',
+      r'''mar.''',
+      r'''apr.''',
+      r'''mai''',
+      r'''iun.''',
+      r'''iul.''',
+      r'''aug.''',
+      r'''sept.''',
+      r'''oct.''',
+      r'''nov.''',
+      r'''dec.'''
+    ],
+    'STANDALONESHORTMONTHS': const <dynamic>[
+      r'''ian.''',
+      r'''feb.''',
+      r'''mar.''',
+      r'''apr.''',
+      r'''mai''',
+      r'''iun.''',
+      r'''iul.''',
+      r'''aug.''',
+      r'''sept.''',
+      r'''oct.''',
+      r'''nov.''',
+      r'''dec.'''
+    ],
+    'WEEKDAYS': const <dynamic>[
+      r'''duminică''',
+      r'''luni''',
+      r'''marți''',
+      r'''miercuri''',
+      r'''joi''',
+      r'''vineri''',
+      r'''sâmbătă'''
+    ],
+    'STANDALONEWEEKDAYS': const <dynamic>[
+      r'''duminică''',
+      r'''luni''',
+      r'''marți''',
+      r'''miercuri''',
+      r'''joi''',
+      r'''vineri''',
+      r'''sâmbătă'''
+    ],
+    'SHORTWEEKDAYS': const <dynamic>[
+      r'''dum.''',
+      r'''lun.''',
+      r'''mar.''',
+      r'''mie.''',
+      r'''joi''',
+      r'''vin.''',
+      r'''sâm.'''
+    ],
+    'STANDALONESHORTWEEKDAYS': const <dynamic>[
+      r'''dum.''',
+      r'''lun.''',
+      r'''mar.''',
+      r'''mie.''',
+      r'''joi''',
+      r'''vin.''',
+      r'''sâm.'''
+    ],
+    'NARROWWEEKDAYS': const <dynamic>[
+      r'''D''',
+      r'''L''',
+      r'''M''',
+      r'''M''',
+      r'''J''',
+      r'''V''',
+      r'''S'''
+    ],
+    'STANDALONENARROWWEEKDAYS': const <dynamic>[
+      r'''D''',
+      r'''L''',
+      r'''M''',
+      r'''M''',
+      r'''J''',
+      r'''V''',
+      r'''S'''
+    ],
+    'SHORTQUARTERS': const <dynamic>[
+      r'''trim. I''',
+      r'''trim. II''',
+      r'''trim. III''',
+      r'''trim. IV'''
+    ],
+    'QUARTERS': const <dynamic>[
+      r'''trimestrul I''',
+      r'''trimestrul al II-lea''',
+      r'''trimestrul al III-lea''',
+      r'''trimestrul al IV-lea'''
+    ],
+    'AMPMS': const <dynamic>[r'''a.m.''', r'''p.m.'''],
+    'DATEFORMATS': const <dynamic>[
+      r'''EEEE, d MMMM y''',
+      r'''d MMMM y''',
+      r'''d MMM y''',
+      r'''dd.MM.y'''
+    ],
+    'TIMEFORMATS': const <dynamic>[
+      r'''HH:mm:ss zzzz''',
+      r'''HH:mm:ss z''',
+      r'''HH:mm:ss''',
+      r'''HH:mm'''
+    ],
+    'AVAILABLEFORMATS': null,
+    'FIRSTDAYOFWEEK': 0,
+    'WEEKENDRANGE': const <dynamic>[5, 6],
+    'FIRSTWEEKCUTOFFDAY': 6,
+    'DATETIMEFORMATS': const <dynamic>[
+      r'''{1}, {0}''',
+      r'''{1}, {0}''',
+      r'''{1}, {0}''',
+      r'''{1}, {0}'''
+    ],
+  },
   'ru': const <String, dynamic>{
     'NAME': r'''ru''',
     'ERAS': const <dynamic>[r'''до н. э.''', r'''н. э.'''],
@@ -3025,6 +3203,52 @@
     'zzzz': r'''zzzz''',
     'ZZZZ': r'''ZZZZ''',
   },
+  'ro': const <String, dynamic>{
+    'd': r'''d''',
+    'E': r'''ccc''',
+    'EEEE': r'''cccc''',
+    'LLL': r'''LLL''',
+    'LLLL': r'''LLLL''',
+    'M': r'''L''',
+    'Md': r'''dd.MM''',
+    'MEd': r'''EEE, dd.MM''',
+    'MMM': r'''LLL''',
+    'MMMd': r'''d MMM''',
+    'MMMEd': r'''EEE, d MMM''',
+    'MMMM': r'''LLLL''',
+    'MMMMd': r'''d MMMM''',
+    'MMMMEEEEd': r'''EEEE, d MMMM''',
+    'QQQ': r'''QQQ''',
+    'QQQQ': r'''QQQQ''',
+    'y': r'''y''',
+    'yM': r'''MM.y''',
+    'yMd': r'''dd.MM.y''',
+    'yMEd': r'''EEE, dd.MM.y''',
+    'yMMM': r'''MMM y''',
+    'yMMMd': r'''d MMM y''',
+    'yMMMEd': r'''EEE, d MMM y''',
+    'yMMMM': r'''MMMM y''',
+    'yMMMMd': r'''d MMMM y''',
+    'yMMMMEEEEd': r'''EEEE, d MMMM y''',
+    'yQQQ': r'''QQQ y''',
+    'yQQQQ': r'''QQQQ y''',
+    'H': r'''HH''',
+    'Hm': r'''HH:mm''',
+    'Hms': r'''HH:mm:ss''',
+    'j': r'''HH''',
+    'jm': r'''HH:mm''',
+    'jms': r'''HH:mm:ss''',
+    'jmv': r'''HH:mm v''',
+    'jmz': r'''HH:mm z''',
+    'jz': r'''HH z''',
+    'm': r'''m''',
+    'ms': r'''mm:ss''',
+    's': r'''s''',
+    'v': r'''v''',
+    'z': r'''z''',
+    'zzzz': r'''zzzz''',
+    'ZZZZ': r'''ZZZZ''',
+  },
   'ru': const <String, dynamic>{
     'd': r'''d''',
     'E': r'''ccc''',
diff --git a/packages/flutter_localizations/lib/src/l10n/localizations.dart b/packages/flutter_localizations/lib/src/l10n/localizations.dart
index 6720d49..97b0448 100644
--- a/packages/flutter_localizations/lib/src/l10n/localizations.dart
+++ b/packages/flutter_localizations/lib/src/l10n/localizations.dart
@@ -681,6 +681,48 @@
 }
 
 // ignore: camel_case_types
+class _Bundle_ro extends TranslationBundle {
+  const _Bundle_ro() : super(null);
+  @override String get scriptCategory => r'English-like';
+  @override String get timeOfDayFormat => r'HH:mm';
+  @override String get openAppDrawerTooltip => r'Deschide meniul de navigare';
+  @override String get backButtonTooltip => r'Înapoi';
+  @override String get closeButtonTooltip => r'Închide';
+  @override String get deleteButtonTooltip => r'Șterge';
+  @override String get nextMonthTooltip => r'Luna următoare';
+  @override String get previousMonthTooltip => r'Luna precedentă';
+  @override String get nextPageTooltip => r'Pagina următoare';
+  @override String get previousPageTooltip => r'Pagina precedentă';
+  @override String get showMenuTooltip => r'Afișează meniul';
+  @override String get aboutListTileTitle => r'Despre $applicationName';
+  @override String get licensesPageTitle => r'Licențe';
+  @override String get pageRowsInfoTitle => r'$firstRow – $lastRow din $rowCount';
+  @override String get pageRowsInfoTitleApproximate => r'$firstRow – $lastRow din aproximativ $rowCount';
+  @override String get rowsPerPageTitle => r'Linii pe pagină:';
+  @override String get tabLabel => r'Tab $tabIndex din $tabCount';
+  @override String get selectedRowCountTitleZero => r'Nu există elemente selectate';
+  @override String get selectedRowCountTitleOne => r'1 element selectat';
+  @override String get selectedRowCountTitleOther => r'$selectedRowCount elemente selectate';
+  @override String get cancelButtonLabel => r'ANULEAZĂ';
+  @override String get closeButtonLabel => r'ÎNCHIDE';
+  @override String get continueButtonLabel => r'CONTINUĂ';
+  @override String get copyButtonLabel => r'COPIAZĂ';
+  @override String get cutButtonLabel => r'TAIE';
+  @override String get okButtonLabel => r'OK';
+  @override String get pasteButtonLabel => r'LIPEȘTE';
+  @override String get selectAllButtonLabel => r'SELECTEAZĂ TOT';
+  @override String get viewLicensesButtonLabel => r'AFIȘEAZĂ LICENȚELE';
+  @override String get anteMeridiemAbbreviation => r'AM';
+  @override String get postMeridiemAbbreviation => r'PM';
+  @override String get timePickerHourModeAnnouncement => r'Selectați orele';
+  @override String get timePickerMinuteModeAnnouncement => r'Selectați minutele';
+  @override String get signedInLabel => r'Autentificat';
+  @override String get hideAccountsLabel => r'Ascunde conturile';
+  @override String get showAccountsLabel => r'Afișează conturile';
+  @override String get modalBarrierDismissLabel => r'Ignoră';
+}
+
+// ignore: camel_case_types
 class _Bundle_ru extends TranslationBundle {
   const _Bundle_ru() : super(null);
   @override String get scriptCategory => r'English-like';
@@ -1459,6 +1501,8 @@
       }
       return const _Bundle_pt();
     }
+    case 'ro':
+      return const _Bundle_ro();
     case 'ru':
       return const _Bundle_ru();
     case 'th':
diff --git a/packages/flutter_localizations/lib/src/l10n/material_ro.arb b/packages/flutter_localizations/lib/src/l10n/material_ro.arb
new file mode 100644
index 0000000..0de4e8e
--- /dev/null
+++ b/packages/flutter_localizations/lib/src/l10n/material_ro.arb
@@ -0,0 +1,39 @@
+{
+  "scriptCategory": "English-like",
+  "timeOfDayFormat": "HH:mm",
+  "openAppDrawerTooltip": "Deschide meniul de navigare",
+  "backButtonTooltip": "Înapoi",
+  "closeButtonTooltip": "Închide",
+  "deleteButtonTooltip": "Șterge",
+  "nextMonthTooltip": "Luna următoare",
+  "previousMonthTooltip": "Luna precedentă",
+  "nextPageTooltip": "Pagina următoare",
+  "previousPageTooltip": "Pagina precedentă",
+  "showMenuTooltip": "Afișează meniul",
+  "aboutListTileTitle": "Despre $applicationName",
+  "licensesPageTitle": "Licențe",
+  "pageRowsInfoTitle": "$firstRow – $lastRow din $rowCount",
+  "pageRowsInfoTitleApproximate": "$firstRow – $lastRow din aproximativ $rowCount",
+  "rowsPerPageTitle": "Linii pe pagină:",
+  "tabLabel": "Tab $tabIndex din $tabCount",
+  "selectedRowCountTitleZero": "Nu există elemente selectate",
+  "selectedRowCountTitleOne": "1 element selectat",
+  "selectedRowCountTitleOther": "$selectedRowCount elemente selectate",
+  "cancelButtonLabel": "ANULEAZĂ",
+  "closeButtonLabel": "ÎNCHIDE",
+  "continueButtonLabel": "CONTINUĂ",
+  "copyButtonLabel": "COPIAZĂ",
+  "cutButtonLabel": "TAIE",
+  "okButtonLabel": "OK",
+  "pasteButtonLabel": "LIPEȘTE",
+  "selectAllButtonLabel": "SELECTEAZĂ TOT",
+  "viewLicensesButtonLabel": "AFIȘEAZĂ LICENȚELE",
+  "anteMeridiemAbbreviation": "AM",
+  "postMeridiemAbbreviation": "PM",
+  "timePickerHourModeAnnouncement": "Selectați orele",
+  "timePickerMinuteModeAnnouncement": "Selectați minutele",
+  "signedInLabel": "Autentificat",
+  "hideAccountsLabel": "Ascunde conturile",
+  "showAccountsLabel": "Afișează conturile",
+  "modalBarrierDismissLabel": "Ignoră"
+}
\ No newline at end of file
diff --git a/packages/flutter_localizations/lib/src/material_localizations.dart b/packages/flutter_localizations/lib/src/material_localizations.dart
index d9f8eff..6378177 100644
--- a/packages/flutter_localizations/lib/src/material_localizations.dart
+++ b/packages/flutter_localizations/lib/src/material_localizations.dart
@@ -49,6 +49,7 @@
 ///   * pl - Polish
 ///   * ps - Pashto
 ///   * pt - Portuguese
+///   * ro - Romanian
 ///   * ru - Russian
 ///   * th - Thai
 ///   * tr - Turkish
@@ -504,6 +505,7 @@
     'ja',  // Japanese
     'ps',  // Pashto
     'pt',  // Portugese
+    'ro',  // Romanian
     'ru',  // Russian
     'ur',  // Urdu
     'zh',  // Simplified Chinese
diff --git a/packages/flutter_localizations/test/date_picker_test.dart b/packages/flutter_localizations/test/date_picker_test.dart
index dfb16a4..be22aff 100644
--- a/packages/flutter_localizations/test/date_picker_test.dart
+++ b/packages/flutter_localizations/test/date_picker_test.dart
@@ -36,6 +36,12 @@
         'expectedDaysOfMonth': new List<String>.generate(30, (int i) => '${i + 1}'),
         'expectedMonthYearHeader': 'сентябрь 2017 г.',
       },
+      const Locale('ro', 'RO'): <String, dynamic>{
+        'textDirection': TextDirection.ltr,
+        'expectedDaysOfWeek': <String>['D', 'L', 'M', 'M', 'J', 'V', 'S'],
+        'expectedDaysOfMonth': new List<String>.generate(30, (int i) => '${i + 1}'),
+        'expectedMonthYearHeader': 'septembrie 2017',
+      },
       // Tests RTL.
       const Locale('ar', 'AR'): <String, dynamic>{
         'textDirection': TextDirection.rtl,
diff --git a/packages/flutter_localizations/test/translations_test.dart b/packages/flutter_localizations/test/translations_test.dart
index 827a51a..fe05557 100644
--- a/packages/flutter_localizations/test/translations_test.dart
+++ b/packages/flutter_localizations/test/translations_test.dart
@@ -22,6 +22,7 @@
     'pl', // Polish
     'ps', // Pashto
     'pt', // Portugese
+    'ro', // Romanian
     'ru', // Russian
     'th', // Thai
     'tr', // Turkish
@@ -95,5 +96,11 @@
     expect(localizations.selectedRowCountTitle(1), '1 elemento seleccionado');
     expect(localizations.selectedRowCountTitle(2), '2 elementos seleccionados');
     expect(localizations.selectedRowCountTitle(123456789), '123.456.789 elementos seleccionados');
+
+    localizations = new GlobalMaterialLocalizations(const Locale('ro', ''));
+    expect(localizations.selectedRowCountTitle(0), 'Nu există elemente selectate');
+    expect(localizations.selectedRowCountTitle(1), '1 element selectat');
+    expect(localizations.selectedRowCountTitle(2), '2 elemente selectate');
+    expect(localizations.selectedRowCountTitle(123456789), '123.456.789 elemente selectate');
   });
 }