From 9a7f36856b527d9065a01bced061c37250137793 Mon Sep 17 00:00:00 2001
From: Andrei Lesnitsky <a@lesnitsky.dev>
Date: Fri, 22 Sep 2023 14:10:27 +0200
Subject: [PATCH 1/3] wip

---
 .../firebase_ui_auth/example/lib/main.dart    |  1 +
 .../lib/src/screens/profile_screen.dart       | 32 +++++++++
 .../lib/firebase_ui_shared.dart               |  1 +
 .../lib/src/universal_alert.dart              | 67 +++++++++++++++++++
 4 files changed, 101 insertions(+)
 create mode 100644 packages/firebase_ui_shared/lib/src/universal_alert.dart

diff --git a/packages/firebase_ui_auth/example/lib/main.dart b/packages/firebase_ui_auth/example/lib/main.dart
index 6c4e8828..154ec69a 100644
--- a/packages/firebase_ui_auth/example/lib/main.dart
+++ b/packages/firebase_ui_auth/example/lib/main.dart
@@ -267,6 +267,7 @@ class FirebaseAuthUIExample extends StatelessWidget {
             showMFATile: kIsWeb ||
                 platform == TargetPlatform.iOS ||
                 platform == TargetPlatform.android,
+            showUnlinkConfirmationDialog: true,
           );
         },
       },
diff --git a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart
index a5ff468d..3387d077 100644
--- a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart
+++ b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart
@@ -176,11 +176,13 @@ class _LinkedProvidersRow extends StatefulWidget {
   final FirebaseAuth? auth;
   final List<AuthProvider> providers;
   final VoidCallback onProviderUnlinked;
+  final bool showUnlinkConfirmationDialog;
 
   const _LinkedProvidersRow({
     this.auth,
     required this.providers,
     required this.onProviderUnlinked,
+    required this.showUnlinkConfirmationDialog,
   });
 
   @override
@@ -207,7 +209,31 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> {
       error = null;
     });
 
+    bool? confirmed = !widget.showUnlinkConfirmationDialog;
+
+    if (!confirmed) {
+      confirmed = await showAdaptiveDialog<bool?>(
+        context: context,
+        builder: (context) {
+          return UniversalAlert(
+            onConfirm: () {
+              Navigator.of(context).pop(true);
+            },
+            onCancel: () {
+              Navigator.of(context).pop(false);
+            },
+            title: 'Unlink provider',
+            confirmButtonText: 'Unlink',
+            cancelButtonText: 'Cancel',
+            message: 'Are you sure you want to unlink this provider?',
+          );
+        },
+      );
+    }
+
     try {
+      if (!(confirmed ?? false)) return;
+
       final user = widget.auth!.currentUser!;
       await user.unlink(providerId);
       await user.reload();
@@ -712,6 +738,10 @@ class ProfileScreen extends MultiProviderScreen {
   /// are ignored.
   final Widget? avatar;
 
+  /// Indicates wether a confirmation dialog should be shown when the user
+  /// tries to unlink a provider.
+  final bool showUnlinkConfirmationDialog;
+
   const ProfileScreen({
     super.key,
     super.auth,
@@ -726,6 +756,7 @@ class ProfileScreen extends MultiProviderScreen {
     this.cupertinoNavigationBar,
     this.actionCodeSettings,
     this.showMFATile = false,
+    this.showUnlinkConfirmationDialog = false,
   });
 
   Future<bool> _reauthenticate(BuildContext context) {
@@ -819,6 +850,7 @@ class ProfileScreen extends MultiProviderScreen {
                 auth: auth,
                 providers: linkedProviders,
                 onProviderUnlinked: providersScopeKey.rebuild,
+                showUnlinkConfirmationDialog: showUnlinkConfirmationDialog,
               ),
             );
           },
diff --git a/packages/firebase_ui_shared/lib/firebase_ui_shared.dart b/packages/firebase_ui_shared/lib/firebase_ui_shared.dart
index d67192b2..d6fb57e2 100644
--- a/packages/firebase_ui_shared/lib/firebase_ui_shared.dart
+++ b/packages/firebase_ui_shared/lib/firebase_ui_shared.dart
@@ -9,3 +9,4 @@ export 'src/universal_scaffold.dart' show UniversalScaffold;
 export 'src/universal_icon.dart' show UniversalIcon;
 export 'src/universal_button.dart' show UniversalButton, ButtonVariant;
 export 'src/loading_button.dart' show LoadingButton;
+export 'src/universal_alert.dart' show UniversalAlert;
diff --git a/packages/firebase_ui_shared/lib/src/universal_alert.dart b/packages/firebase_ui_shared/lib/src/universal_alert.dart
new file mode 100644
index 00000000..7749d69d
--- /dev/null
+++ b/packages/firebase_ui_shared/lib/src/universal_alert.dart
@@ -0,0 +1,67 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+
+class UniversalAlert extends StatelessWidget {
+  final void Function() onConfirm;
+  final void Function() onCancel;
+
+  final String title;
+  final String message;
+
+  final String confirmButtonText;
+  final String cancelButtonText;
+
+  const UniversalAlert({
+    super.key,
+    required this.onConfirm,
+    required this.onCancel,
+    required this.title,
+    required this.confirmButtonText,
+    required this.cancelButtonText,
+    required this.message,
+  });
+
+  Widget adaptiveAction({
+    required BuildContext context,
+    required VoidCallback onPressed,
+    required Widget child,
+    bool isDestructiveAction = false,
+  }) {
+    final ThemeData theme = Theme.of(context);
+    switch (theme.platform) {
+      case TargetPlatform.android:
+      case TargetPlatform.fuchsia:
+      case TargetPlatform.linux:
+      case TargetPlatform.windows:
+        return TextButton(onPressed: onPressed, child: child);
+      case TargetPlatform.iOS:
+      case TargetPlatform.macOS:
+        return CupertinoDialogAction(
+          onPressed: onPressed,
+          isDestructiveAction: isDestructiveAction,
+          child: child,
+        );
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return AlertDialog.adaptive(
+      title: Text(title),
+      content: Text(message),
+      actions: [
+        adaptiveAction(
+          context: context,
+          onPressed: onConfirm,
+          child: Text(confirmButtonText),
+          isDestructiveAction: true,
+        ),
+        adaptiveAction(
+          context: context,
+          onPressed: onCancel,
+          child: Text(cancelButtonText),
+        ),
+      ],
+    );
+  }
+}

From e36ad35c494e6aaceb6da65d48e4786da01dfded Mon Sep 17 00:00:00 2001
From: Andrei Lesnitsky <a@lesnitsky.dev>
Date: Fri, 22 Sep 2023 14:56:02 +0200
Subject: [PATCH 2/3] localizations

---
 .../lib/src/navigation/authentication.dart    |   2 +-
 .../lib/src/screens/profile_screen.dart       |  24 +-
 .../different_method_sign_in_dialog.dart      |   2 +-
 packages/firebase_ui_localizations/README.md  |  20 +
 .../bin/add_label.dart                        |  15 +-
 .../bin/gen_l10n.dart                         | 133 ++++++
 .../lib/l10n/firebase_ui_ar.arb               |  22 +-
 .../lib/l10n/firebase_ui_de.arb               |  22 +-
 .../lib/l10n/firebase_ui_en.arb               |  22 +-
 .../lib/l10n/firebase_ui_es.arb               |  22 +-
 .../lib/l10n/firebase_ui_es_419.arb           |  22 +-
 .../lib/l10n/firebase_ui_fr.arb               |  22 +-
 .../lib/l10n/firebase_ui_he.arb               |  22 +-
 .../lib/l10n/firebase_ui_hi.arb               |  22 +-
 .../lib/l10n/firebase_ui_hu.arb               |  22 +-
 .../lib/l10n/firebase_ui_id.arb               |  22 +-
 .../lib/l10n/firebase_ui_it.arb               |  22 +-
 .../lib/l10n/firebase_ui_ja.arb               |  22 +-
 .../lib/l10n/firebase_ui_ko.arb               |  22 +-
 .../lib/l10n/firebase_ui_nl.arb               |  22 +-
 .../lib/l10n/firebase_ui_pl.arb               |  22 +-
 .../lib/l10n/firebase_ui_pt.arb               |  22 +-
 .../lib/l10n/firebase_ui_ru.arb               |  22 +-
 .../lib/l10n/firebase_ui_th.arb               |  22 +-
 .../lib/l10n/firebase_ui_tr.arb               |  22 +-
 .../lib/l10n/firebase_ui_uk.arb               |  22 +-
 .../lib/l10n/firebase_ui_zh.arb               |  22 +-
 .../lib/l10n/firebase_ui_zh_TW.arb            |  22 +-
 .../lib/src/default_localizations.dart        | 399 ++++++++++--------
 .../lib/src/lang/ar.dart                      |  13 +
 .../lib/src/lang/de.dart                      |  13 +
 .../lib/src/lang/en.dart                      |  13 +
 .../lib/src/lang/es.dart                      |  13 +
 .../lib/src/lang/es_419.dart                  |  13 +
 .../lib/src/lang/fr.dart                      |  13 +
 .../lib/src/lang/he.dart                      |  13 +
 .../lib/src/lang/hi.dart                      |  13 +
 .../lib/src/lang/hu.dart                      |  13 +
 .../lib/src/lang/id.dart                      |  13 +
 .../lib/src/lang/it.dart                      |  13 +
 .../lib/src/lang/ja.dart                      |  13 +
 .../lib/src/lang/ko.dart                      |  13 +
 .../lib/src/lang/nl.dart                      |  13 +
 .../lib/src/lang/pl.dart                      |  13 +
 .../lib/src/lang/pt.dart                      |  13 +
 .../lib/src/lang/ru.dart                      |  13 +
 .../lib/src/lang/th.dart                      |  13 +
 .../lib/src/lang/tr.dart                      |  13 +
 .../lib/src/lang/uk.dart                      |  13 +
 .../lib/src/lang/zh.dart                      |  13 +
 .../lib/src/lang/zh_tw.dart                   |  13 +
 51 files changed, 1146 insertions(+), 219 deletions(-)

diff --git a/packages/firebase_ui_auth/lib/src/navigation/authentication.dart b/packages/firebase_ui_auth/lib/src/navigation/authentication.dart
index d72979c2..8303b7b9 100644
--- a/packages/firebase_ui_auth/lib/src/navigation/authentication.dart
+++ b/packages/firebase_ui_auth/lib/src/navigation/authentication.dart
@@ -28,7 +28,7 @@ Future<bool> showReauthenticateDialog({
   final reauthenticated = await showGeneralDialog<bool>(
     context: context,
     barrierDismissible: true,
-    barrierLabel: l.cancelLabel,
+    barrierLabel: l.cancelButtonLabel,
     pageBuilder: (_, __, ___) => FirebaseUIActions.inherit(
       from: context,
       child: ReauthenticateDialog(
diff --git a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart
index 3387d077..9848c252 100644
--- a/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart
+++ b/packages/firebase_ui_auth/lib/src/screens/profile_screen.dart
@@ -203,6 +203,12 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> {
     });
   }
 
+  void Function() pop(bool value) {
+    return () {
+      Navigator.of(context).pop(value);
+    };
+  }
+
   Future<void> _unlinkProvider(BuildContext context, String providerId) async {
     setState(() {
       unlinkingProvider = providerId;
@@ -212,20 +218,18 @@ class _LinkedProvidersRowState extends State<_LinkedProvidersRow> {
     bool? confirmed = !widget.showUnlinkConfirmationDialog;
 
     if (!confirmed) {
+      final l = FirebaseUILocalizations.labelsOf(context);
+
       confirmed = await showAdaptiveDialog<bool?>(
         context: context,
         builder: (context) {
           return UniversalAlert(
-            onConfirm: () {
-              Navigator.of(context).pop(true);
-            },
-            onCancel: () {
-              Navigator.of(context).pop(false);
-            },
-            title: 'Unlink provider',
-            confirmButtonText: 'Unlink',
-            cancelButtonText: 'Cancel',
-            message: 'Are you sure you want to unlink this provider?',
+            onConfirm: pop(true),
+            onCancel: pop(false),
+            title: l.ulinkProviderAlertTitle,
+            confirmButtonText: l.confirmUnlinkButtonLabel,
+            cancelButtonText: l.cancelButtonLabel,
+            message: l.unlinkProviderAlertMessage,
           );
         },
       );
diff --git a/packages/firebase_ui_auth/lib/src/widgets/different_method_sign_in_dialog.dart b/packages/firebase_ui_auth/lib/src/widgets/different_method_sign_in_dialog.dart
index 4f581ed9..5effa3d7 100644
--- a/packages/firebase_ui_auth/lib/src/widgets/different_method_sign_in_dialog.dart
+++ b/packages/firebase_ui_auth/lib/src/widgets/different_method_sign_in_dialog.dart
@@ -60,7 +60,7 @@ class DifferentMethodSignInDialog extends StatelessWidget {
                   onSignedIn: onSignedIn,
                 ),
                 UniversalButton(
-                  text: l.cancelLabel,
+                  text: l.cancelButtonLabel,
                   onPressed: () => Navigator.of(context).pop(),
                 ),
               ],
diff --git a/packages/firebase_ui_localizations/README.md b/packages/firebase_ui_localizations/README.md
index 294c9d89..fdfe9392 100644
--- a/packages/firebase_ui_localizations/README.md
+++ b/packages/firebase_ui_localizations/README.md
@@ -62,6 +62,8 @@ and make sure that your custom delegate extends `LocalizationsDelegate<FirebaseU
 
 ## Contributing
 
+### Adding a new language
+
 If you want to add a new language, make sure to add a relevant `.arb` file into `lib/i10n`.
 
 - copy `lib/i10n/firebase_ui_en.arb` to `lib/i10n/firebase_ui_<your-language-code>.arb`
@@ -69,3 +71,21 @@ If you want to add a new language, make sure to add a relevant `.arb` file into
 - run `dart run firebase_ui_localizations:gen_l10n`
 - commit the `.arb` and generated `.dart` file
 - submit a PR
+
+### Adding a new label to existing languages
+
+If you want to add new labels to existing languages,
+
+- Execute `dart run firebase_ui_localizations:add_label`:
+
+```bash
+dart run firebase_ui_localizations:add_label
+Label name?: someNewLabel
+Label description?: This will go to the doc comment of the label
+English translation?: Some new label
+Done!
+```
+
+- Execute `dart run firebase_ui_localizations:gen_l10n`
+- Commit the changes
+- Submit a PR
diff --git a/packages/firebase_ui_localizations/bin/add_label.dart b/packages/firebase_ui_localizations/bin/add_label.dart
index 613adbd9..c9d74fca 100644
--- a/packages/firebase_ui_localizations/bin/add_label.dart
+++ b/packages/firebase_ui_localizations/bin/add_label.dart
@@ -20,12 +20,22 @@ String prompt(String tag) {
 
 Future<void> main(List<String> args) async {
   final name = prompt('Label name');
-  final description = prompt('Label description');
-  final englishTranslation = prompt('English translation');
 
   final cwd = Directory.current.path;
   final l10nSrc = Directory(path.join(cwd, 'lib', 'l10n'));
 
+  final enArb = File(path.join(l10nSrc.path, 'firebase_ui_en.arb'));
+  final enContent =
+      jsonDecode(await enArb.readAsString()) as Map<String, dynamic>;
+
+  if (enContent.containsKey(name)) {
+    stderr.writeln('Label "$name" already exists');
+    exit(1);
+  }
+
+  final description = prompt('Label description');
+  final englishTranslation = prompt('English translation');
+
   final files = l10nSrc.listSync().whereType<File>().toList();
   final futures = files.map((e) async {
     final newContent = await addLabel(e, name, description, englishTranslation);
@@ -48,6 +58,7 @@ Future<Map<String, dynamic>> addLabel(
   String englishTranslation,
 ) async {
   final content = jsonDecode(await file.readAsString()) as Map<String, dynamic>;
+
   return {
     ...content,
     "@@last_modified": DateTime.now().toIso8601String(),
diff --git a/packages/firebase_ui_localizations/bin/gen_l10n.dart b/packages/firebase_ui_localizations/bin/gen_l10n.dart
index 9aedc53f..dd811f8e 100644
--- a/packages/firebase_ui_localizations/bin/gen_l10n.dart
+++ b/packages/firebase_ui_localizations/bin/gen_l10n.dart
@@ -74,6 +74,12 @@ void main() async {
   }).expand((element) => element);
 
   await Future.wait([...genOps.cast<Future>()]);
+
+  await generateDefaultLocalizations(
+    labelsByLocale['en']['default'].cast<String, dynamic>(),
+    licenseHeader,
+  );
+
   await generateLanguagesList(labelsByLocale, licenseHeader);
   Process.runSync('dart', ['format', outDir.path]);
 }
@@ -226,3 +232,130 @@ Future<String> getLicenseHeader() async {
     return '// $e';
   }).join('\n');
 }
+
+Future<void> generateDefaultLocalizations(
+  Map<String, dynamic> arb,
+  String licenseHeader,
+) async {
+  final labels = arb.entries.where(isLabelEntry).map((e) {
+    final meta = arb['@${e.key}'] ?? {};
+
+    return Label(
+      key: e.key,
+      translation: e.value,
+      description: meta['description'],
+    );
+  }).toList()
+    ..sort((a, b) => a.key.compareTo(b.key));
+
+  final content = await getDefaultLocalizationsContent(labels, licenseHeader);
+  final outFile = File(path.join(outDir.path, 'default_localizations.dart'));
+
+  if (!outFile.existsSync()) {
+    outFile.createSync(recursive: true);
+  }
+
+  final out = outFile.openWrite();
+  out.write(content);
+  await out.flush();
+  await out.close();
+}
+
+Future<String> getDefaultLocalizationsContent(
+  List<Label> labels,
+  String licenseHeader,
+) async {
+  final sb = StringBuffer();
+
+  sb.writeln(licenseHeader);
+  sb.writeln(defaultLocalizationsHeader);
+
+  sb.writeln('abstract class FirebaseUILocalizationLabels {');
+  sb.writeln('  const FirebaseUILocalizationLabels();');
+
+  for (var label in labels) {
+    sb.writeln();
+    if (label.description != null && label.description!.isNotEmpty) {
+      const prefix = '  /// ';
+      for (var line in breakIntoLines(label.description!, 80 - prefix.length)) {
+        sb.writeln('$prefix$line');
+      }
+    }
+    sb.writeln('  String get ${label.key};');
+  }
+
+  sb.writeln('}');
+  sb.writeln();
+
+  sb.writeln(defaultLocalizationsFooter);
+
+  return sb.toString();
+}
+
+const defaultLocalizationsHeader = '''
+
+/*
+ *  THIS FILE IS GENERATED.
+ *  DO NOT MODIFY IT BY HAND UNLESS YOU KNOW WHAT YOU ARE DOING.
+ * 
+ *  See README.md for instructions on how to generate this file.
+ */
+
+import 'package:flutter/material.dart';
+
+import 'lang/en.dart';
+
+/// An abstract class containing all labels that concrete languages should
+/// provide.
+///
+/// The easiest way to override some of these labels is to provide
+/// an object that extends [DefaultLocalizations] and pass it to the
+/// [MaterialApp.localizationsDelegates].
+///
+/// ```dart
+/// import 'package:firebase_ui_localizations/firebase_ui_localizations.dart';
+///
+/// class LabelOverrides extends DefaultLocalizations {
+///   const LabelOverrides();
+///
+///   @override
+///   String get emailInputLabel => 'Enter your email';
+/// }
+///
+/// MaterialApp(
+///   // ...
+///   localizationsDelegates: [
+///     FirebaseUILocalizations.withDefaultOverrides(const LabelOverrides()),
+///     GlobalMaterialLocalizations.delegate,
+///     GlobalWidgetsLocalizations.delegate,
+///     FirebaseUILocalizations.delegate,
+///   ],
+/// )
+/// ```''';
+
+const defaultLocalizationsFooter = '''
+class DefaultLocalizations extends EnLocalizations {
+  const DefaultLocalizations();
+}
+''';
+
+List<String> breakIntoLines(String string, int lineLength) {
+  final lines = <String>[];
+  final words = string.split(' ');
+
+  var currentLine = StringBuffer();
+  for (var word in words) {
+    if (currentLine.length + word.length > lineLength) {
+      lines.add(currentLine.toString());
+      currentLine = StringBuffer();
+    }
+
+    currentLine.write('$word ');
+  }
+
+  if (currentLine.isNotEmpty) {
+    lines.add(currentLine.toString());
+  }
+
+  return lines;
+}
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ar.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ar.arb
index 0eb544a0..3abfd4cc 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ar.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ar.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "ar",
-  "@@last_modified": "2023-09-06T14:33:29.121119",
+  "@@last_modified": "2023-09-22T14:51:00.799791",
   "accessDisabledErrorText": "تم إيقاف إذن الوصول إلى هذا الحساب مؤقتًا.",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_de.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_de.arb
index 28a05c68..e71ac66a 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_de.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_de.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "de",
-  "@@last_modified": "2023-09-06T14:33:29.117252",
+  "@@last_modified": "2023-09-22T14:51:00.791691",
   "accessDisabledErrorText": "Der Zugriff auf dieses Konto wurde vorübergehend gesperrt",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_en.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_en.arb
index c52c6a62..3d27a668 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_en.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_en.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "en",
-  "@@last_modified": "2023-09-06T14:33:29.127088",
+  "@@last_modified": "2023-09-22T14:51:00.803227",
   "accessDisabledErrorText": "Access to this account has been temporarily disabled",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es.arb
index 1d8fd9eb..2cf068e4 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "es",
-  "@@last_modified": "2023-09-06T14:33:29.096563",
+  "@@last_modified": "2023-09-22T14:51:00.770278",
   "accessDisabledErrorText": "Se ha inhabilitado temporalmente al acceso a esta cuenta",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es_419.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es_419.arb
index 72e54321..a28042c2 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es_419.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_es_419.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "es_419",
-  "@@last_modified": "2023-09-06T14:33:29.119589",
+  "@@last_modified": "2023-09-22T14:51:00.796492",
   "accessDisabledErrorText": "Se inhabilitó temporalmente el acceso a la cuenta",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_fr.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_fr.arb
index 27462c2e..aef4d9f9 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_fr.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_fr.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "fr",
-  "@@last_modified": "2023-09-06T14:33:29.125523",
+  "@@last_modified": "2023-09-22T14:51:00.803883",
   "accessDisabledErrorText": "L'accès à ce compte a été temporairement désactivé",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_he.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_he.arb
index 34e07150..daf37abd 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_he.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_he.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "he",
-  "@@last_modified": "2023-09-06T14:33:29.118845",
+  "@@last_modified": "2023-09-22T14:51:00.794005",
   "accessDisabledErrorText": "הגישה לחשבון זה הושבתה באופן זמני",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hi.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hi.arb
index dfb9f5c5..d718ace9 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hi.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hi.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "hi",
-  "@@last_modified": "2023-09-06T14:33:29.126505",
+  "@@last_modified": "2023-09-22T14:51:00.804545",
   "accessDisabledErrorText": "इस खाते के ऐक्सेस पर, कुछ समय के लिए रोक लगा दी गई है",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hu.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hu.arb
index 1206dc34..312a0a56 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hu.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_hu.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "hu",
-  "@@last_modified": "2023-09-06T14:33:29.105442",
+  "@@last_modified": "2023-09-22T14:51:00.788762",
   "accessDisabledErrorText": "A fiók átmenetileg le van tiltva",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_id.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_id.arb
index 0d0e164b..57704652 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_id.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_id.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "id",
-  "@@last_modified": "2023-09-06T14:33:29.113412",
+  "@@last_modified": "2023-09-22T14:51:00.789989",
   "accessDisabledErrorText": "Akses ke akun ini telah dinonaktifkan untuk sementara waktu",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_it.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_it.arb
index 319c58d8..172a661a 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_it.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_it.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "it",
-  "@@last_modified": "2023-09-06T14:33:29.114337",
+  "@@last_modified": "2023-09-22T14:51:00.786835",
   "accessDisabledErrorText": "L'accesso a questo account è stato temporaneamente disabilitato",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ja.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ja.arb
index e4588207..e843824d 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ja.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ja.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "ja",
-  "@@last_modified": "2023-09-06T14:33:29.124970",
+  "@@last_modified": "2023-09-22T14:51:00.805274",
   "accessDisabledErrorText": "このアカウントへのアクセスが一時的に無効になっています",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ko.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ko.arb
index 68c2c9cc..ef8ae454 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ko.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ko.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "ko",
-  "@@last_modified": "2023-09-06T14:33:29.109589",
+  "@@last_modified": "2023-09-22T14:51:00.778413",
   "accessDisabledErrorText": "이 계정의 액세스가 일시적으로 중지되었습니다.",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_nl.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_nl.arb
index 4752c58a..0e5fd230 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_nl.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_nl.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "nl",
-  "@@last_modified": "2023-09-06T14:33:29.123028",
+  "@@last_modified": "2023-09-22T14:51:00.800987",
   "accessDisabledErrorText": "De toegang tot dit account is tijdelijk uitgezet",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pl.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pl.arb
index 247672ef..a74169b2 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pl.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pl.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "pl",
-  "@@last_modified": "2023-09-06T14:33:29.124271",
+  "@@last_modified": "2023-09-22T14:51:00.802556",
   "accessDisabledErrorText": "Dostęp do tego konta został tymczasowo wyłączony",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pt.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pt.arb
index adfd371b..87bb0e4f 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pt.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_pt.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "pt",
-  "@@last_modified": "2023-09-06T14:33:29.112429",
+  "@@last_modified": "2023-09-22T14:51:00.784012",
   "accessDisabledErrorText": "O acesso a esta conta foi desativado temporariamente",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ru.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ru.arb
index c620a61c..191f5fa6 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ru.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_ru.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "ru",
-  "@@last_modified": "2023-09-06T14:33:29.126015",
+  "@@last_modified": "2023-09-22T14:51:00.806043",
   "accessDisabledErrorText": "Доступ к этому аккаунту временно заблокирован.",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_th.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_th.arb
index aa36d34f..61966209 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_th.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_th.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "th",
-  "@@last_modified": "2023-09-06T14:33:29.122025",
+  "@@last_modified": "2023-09-22T14:51:00.797697",
   "accessDisabledErrorText": "มีการปิดใช้สิทธิ์เข้าถึงบัญชีนี้ชั่วคราว",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_tr.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_tr.arb
index 778d76da..fdc808dc 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_tr.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_tr.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "tr",
-  "@@last_modified": "2023-09-06T14:33:29.120257",
+  "@@last_modified": "2023-09-22T14:51:00.798873",
   "accessDisabledErrorText": "Bu hesaba erişim geçici olarak devre dışı bırakıldı",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_uk.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_uk.arb
index 4e38e631..deb3e119 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_uk.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_uk.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "uk",
-  "@@last_modified": "2023-09-06T14:33:29.116420",
+  "@@last_modified": "2023-09-22T14:51:00.795458",
   "accessDisabledErrorText": "Доступ до цього облікового запису тимчасово вимкнено",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh.arb
index b3e57b57..719d260b 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "zh",
-  "@@last_modified": "2023-09-06T14:33:29.123653",
+  "@@last_modified": "2023-09-22T14:51:00.801768",
   "accessDisabledErrorText": "对此帐号的访问权限已被临时停用",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh_TW.arb b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh_TW.arb
index d8a84b16..0b7ef530 100644
--- a/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh_TW.arb
+++ b/packages/firebase_ui_localizations/lib/l10n/firebase_ui_zh_TW.arb
@@ -1,6 +1,6 @@
 {
   "@@locale": "zh_TW",
-  "@@last_modified": "2023-09-06T14:33:29.115487",
+  "@@last_modified": "2023-09-22T14:51:00.794768",
   "accessDisabledErrorText": "這個帳戶暫時無法存取",
   "@accessDisabledErrorText": {
     "description": "Used as an error message when account is blocked and user tries to perform some actions with the account (e.g. unlinking a credential).",
@@ -488,5 +488,25 @@
   "@invalidVerificationCodeErrorText": {
     "description": "Error text indicating that entered SMS code is invalid",
     "placeholders": {}
+  },
+  "ulinkProviderAlertTitle": "Unlink provider",
+  "@ulinkProviderAlertTitle": {
+    "description": "Title that is shown in AlertDialog asking for provider unlink confirmation",
+    "placeholders": {}
+  },
+  "confirmUnlinkButtonLabel": "Unlink",
+  "@confirmUnlinkButtonLabel": {
+    "description": "Unlink confirmation button label",
+    "placeholders": {}
+  },
+  "cancelButtonLabel": "Cancel",
+  "@cancelButtonLabel": {
+    "description": "Cancel button label",
+    "placeholders": {}
+  },
+  "unlinkProviderAlertMessage": "Are you sure you want to unlink this provider?",
+  "@unlinkProviderAlertMessage": {
+    "description": "Text that is shown as a message of the AlertDialog confirming provider unlink",
+    "placeholders": {}
   }
 }
diff --git a/packages/firebase_ui_localizations/lib/src/default_localizations.dart b/packages/firebase_ui_localizations/lib/src/default_localizations.dart
index 371b0621..cc4edd4d 100644
--- a/packages/firebase_ui_localizations/lib/src/default_localizations.dart
+++ b/packages/firebase_ui_localizations/lib/src/default_localizations.dart
@@ -1,7 +1,14 @@
-// Copyright 2022, the Chromium project authors.  Please see the AUTHORS file
+// Copyright 2023, the Chromium project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/*
+ *  THIS FILE IS GENERATED.
+ *  DO NOT MODIFY IT BY HAND UNLESS YOU KNOW WHAT YOU ARE DOING.
+ * 
+ *  See README.md for instructions on how to generate this file.
+ */
+
 import 'package:flutter/material.dart';
 
 import 'lang/en.dart';
@@ -36,277 +43,303 @@ import 'lang/en.dart';
 abstract class FirebaseUILocalizationLabels {
   const FirebaseUILocalizationLabels();
 
-  /// Used as a label of the `EmailInput`.
-  String get emailInputLabel;
+  /// Used as an error message when account is blocked and user tries to perform
+  /// some actions with the account (e.g. unlinking a credential).
+  String get accessDisabledErrorText;
 
-  /// Used as a label of the `PasswordInput`.
-  String get passwordInputLabel;
+  String get arrayLabel;
 
-  /// Used as a label of the `EmailForm` submit button
-  /// when the `AuthAction` is `AuthAction.signIn`.
-  String get signInActionText;
+  String get booleanLabel;
 
-  /// Used as a label of the `EmailForm` submit button
-  /// when the `AuthAction` is `AuthAction.signUp`.
-  String get registerActionText;
+  /// Cancel button label
+  String get cancelButtonLabel;
 
-  /// Used as a label of the `EmailForm` submit button
-  /// when the `AuthAction` is `AuthAction.link`.
-  String get linkEmailButtonText;
+  String get cancelLabel;
 
-  /// Used as a label of the `PhoneVerificationButton`.
-  String get signInWithPhoneButtonText;
+  /// Hint text prompting the user to check email for verification link
+  String get checkEmailHintText;
 
-  /// Used as a label of the `OAuthProviderButton` for Google provider.
-  String get signInWithGoogleButtonText;
+  /// Used as a label of the country code picker dropdown.
+  String get chooseACountry;
 
-  /// Used as a label of the `OAuthProviderButton` for Apple provider.
-  String get signInWithAppleButtonText;
+  /// Used as an error text when provided passwords do not match.
+  String get confirmPasswordDoesNotMatchErrorText;
 
-  /// Used as a label of the `OAuthProviderButton` for Facebook provider.
-  String get signInWithFacebookButtonText;
+  /// Used as a label of the PasswordInput that confirms a provided password.
+  String get confirmPasswordInputLabel;
 
-  /// Used as a label of the `OAuthProviderButton` for Twitter provider.
-  String get signInWithTwitterButtonText;
+  /// Used as an error text when PasswordInput used to confirm the password is
+  /// empty.
+  String get confirmPasswordIsRequiredErrorText;
 
-  /// Used as a title of the `PhoneInputView`.
-  String get phoneVerificationViewTitleText;
+  /// Unlink confirmation button label
+  String get confirmUnlinkButtonLabel;
 
-  /// Used as a label of the submit button of the `PhoneInputView`.
-  String get verifyPhoneNumberButtonText;
+  /// Used as a label of the submit button that takes the user to the next step
+  /// of the authenticatiion flow.
+  String get continueText;
 
-  /// Used as a label of the submit button of the `SMSCodeInputView`.
-  String get verifyCodeButtonText;
+  /// Used as a placeholder of the country code input.
+  String get countryCode;
 
-  /// Used as a generic error message when unable to resolve error details
-  /// from `Exception` or `FirebaseAuthException`.
-  String get unknownError;
+  /// Error text that is show when user tries to use an OAuth provider that
+  /// doesn't belong to currently signed in user account.
+  String get credentialAlreadyInUseErrorText;
 
-  /// Used as an error text when `AutoresolutionFailedException` is being
-  /// thrown.
-  String get smsAutoresolutionFailedError;
+  /// Used as a label of the DeleteAccountButton.
+  String get deleteAccount;
 
-  /// Used as a status text of the `SMSCodeInput` when code verification is
-  /// in progress.
-  String get verifyingSMSCodeText;
+  /// Used as a title of the dialog that indicates that there are different
+  /// available sign in methods for a provided email.
+  String get differentMethodsSignInTitleText;
 
-  /// Used as a label of the `SMSCodeInput`.
-  String get enterSMSCodeText;
+  /// Button label that suggests to disable 2FA
+  String get disable;
 
-  /// Used as an error text of the `EmailInput` when the email is empty.
-  String get emailIsRequiredErrorText;
+  String get dismissButtonLabel;
 
-  /// Used as an error text of the `EmailInput` if the provided
-  /// email is not valid.
-  String get isNotAValidEmailErrorText;
+  /// Done button label
+  String get doneButtonLabel;
 
-  /// Used as an error message when the account for provided email was not
-  /// found.
-  String get userNotFoundErrorText;
+  String get eastInitialLabel;
+
+  /// Used as a label of the EmailInput.
+  String get emailInputLabel;
+
+  /// Message indicating that email is not verified
+  String get emailIsNotVerifiedText;
 
-  /// Used as an error message when the user tries to sign up with an email
-  /// that is already used.
+  /// Used as an error text of the EmailInput when the email is empty.
+  String get emailIsRequiredErrorText;
+
+  /// Used as a label of the EmailLinkSignInButton.
+  String get emailLinkSignInButtonLabel;
+
+  /// Used as an error message when the user tries to sign up with an email that
+  /// is already used.
   String get emailTakenErrorText;
 
-  /// Used as an error message when account is blocked and user tries to
-  /// perform some actions with the account (e.g. unlinking a credential).
-  String get accessDisabledErrorText;
+  /// Button label that suggests to enable 2FA
+  String get enable;
 
-  /// Used as an error text of the `PasswordInput` when provided password
-  /// is empty or is not correct.
-  String get wrongOrNoPasswordErrorText;
+  /// Used as a hint to connect more providers.
+  String get enableMoreSignInMethods;
 
-  /// Used as a title of the `LoginView` when `AuthAction` is
-  /// `AuthAction.signIn`.
-  String get signInText;
+  /// Used as a label of the SMSCodeInput.
+  String get enterSMSCodeText;
 
-  /// Used as a title of the `LoginView` when `AuthAction` is
-  /// `AuthAction.signUp`.
-  String get registerText;
+  /// Used as a title of the FindProvidersForEmailView.
+  String get findProviderForEmailTitleText;
 
-  /// Used as a hint text of the `LoginView` suggesting to create a new account.
-  String get registerHintText;
+  /// Used as a label of the ForgotPasswordButton.
+  String get forgotPasswordButtonLabel;
 
-  /// Used as a hint text of the `LoginView` suggesting to sign in instead of
-  /// registering a new account.
-  String get signInHintText;
+  /// Used as a hint on a ForgotPasswordView.
+  String get forgotPasswordHintText;
 
-  /// Used as a label of the `SignOutButton`.
-  String get signOutButtonText;
+  /// Used as a title of the ForgotPasswordView.
+  String get forgotPasswordViewTitle;
 
-  /// Used as a label of the `PhoneInput`.
-  String get phoneInputLabel;
+  String get geopointLabel;
 
-  /// Used as an error text when `PhoneInput` is empty.
-  String get phoneNumberIsRequiredErrorText;
+  /// Used as a label of the back button.
+  String get goBackButtonLabel;
 
-  /// Used as an error text when `PhoneInput` contains an invalid phone number.
-  String get phoneNumberInvalidErrorText;
+  /// Used as an error text when provide country code is invalid.
+  String get invalidCountryCode;
 
-  /// A title of the `ProfileScreen`.
-  String get profile;
+  /// Error text indicating that entered SMS code is invalid
+  String get invalidVerificationCodeErrorText;
 
-  /// Used as a placeholder of the `EditableUserDisplayName`.
-  String get name;
+  /// Used as an error text of the EmailInput if the provided email is not
+  /// valid.
+  String get isNotAValidEmailErrorText;
 
-  /// Used as a label of the `DeleteAccountButton`.
-  String get deleteAccount;
+  String get latitudeLabel;
 
-  /// Used as an error text when `PasswordInput` is empty.
-  String get passwordIsRequiredErrorText;
+  /// Used as a label of the EmailForm submit button when the AuthAction is
+  /// AuthAction.link.
+  String get linkEmailButtonText;
 
-  /// Used as an error text when `PasswordInput` used to confirm the password
-  /// is empty.
-  String get confirmPasswordIsRequiredErrorText;
+  String get longitudeLabel;
 
-  /// Used as an error text when provided passwords do not match.
-  String get confirmPasswordDoesNotMatchErrorText;
+  String get mapLabel;
 
-  /// Used as a label of the `PasswordInput` that confirms a provided password.
-  String get confirmPasswordInputLabel;
+  /// 2-step verification settings tile title.
+  String get mfaTitle;
 
-  /// Used as a label of the `ForgotPasswordButton`.
-  String get forgotPasswordButtonLabel;
+  /// Used as a placeholder of the EditableUserDisplayName.
+  String get name;
 
-  /// Used as a title of the `ForgotPasswordView`.
-  String get forgotPasswordViewTitle;
+  String get northInitialLabel;
 
-  /// Used as a label of submit button of the `ForgotPasswordView`.
-  String get resetPasswordButtonLabel;
+  String get nullLabel;
 
-  /// Used as a title of the dialog that requires re-authentication of the
-  /// user when performing destructive actions.
-  String get verifyItsYouText;
+  String get numberLabel;
 
-  /// Used as a title of the dialog that indicates that there are
-  /// different available sign in methods for a provided email.
-  String get differentMethodsSignInTitleText;
+  /// Label that suggests that 2-step verification is not enabled
+  String get off;
 
-  /// Used as a title of the `FindProvidersForEmailView`.
-  String get findProviderForEmailTitleText;
+  /// OK button label
+  String get okButtonLabel;
 
-  /// Used as a label of the submit button that takes the user to the next step
-  /// of the authenticatiion flow.
-  String get continueText;
+  /// Label that suggests that 2-step verification is enabled
+  String get on;
 
-  /// Used as a placeholder of the country code input.
-  String get countryCode;
+  /// Used as a label of the PasswordInput.
+  String get passwordInputLabel;
 
-  /// Used as an error text when provide country code is invalid.
-  String get invalidCountryCode;
+  /// Used as an error text when PasswordInput is empty.
+  String get passwordIsRequiredErrorText;
 
-  /// Used as a label of the country code picker dropdown.
-  String get chooseACountry;
+  /// Indicates that the password reset email was sent.
+  String get passwordResetEmailSentText;
 
-  /// Used as a hint to connect more providers.
-  String get enableMoreSignInMethods;
+  /// Used as a label of the PhoneInput.
+  String get phoneInputLabel;
 
-  /// Used as a label of the row showing connected providers.
-  String get signInMethods;
+  /// Used as an error text when PhoneInput contains an invalid phone number.
+  String get phoneNumberInvalidErrorText;
+
+  /// Used as an error text when PhoneInput is empty.
+  String get phoneNumberIsRequiredErrorText;
+
+  /// Used as a title of the PhoneInputView.
+  String get phoneVerificationViewTitleText;
+
+  /// A title of the ProfileScreen.
+  String get profile;
 
-  /// Used as a title of the `EmailSignUpDialog`.
+  /// Used as a title of the EmailSignUpDialog.
   String get provideEmail;
 
-  /// Used as a label of the back button.
-  String get goBackButtonLabel;
+  String get referenceLabel;
 
-  /// Indicates that the password reset email was sent.
-  String get passwordResetEmailSentText;
+  /// Used as a label of the EmailForm submit button when the AuthAction is
+  /// AuthAction.signUp.
+  String get registerActionText;
 
-  /// Used as a hint on a `ForgotPasswordView`.
-  String get forgotPasswordHintText;
+  /// Used as a hint text of the LoginView suggesting to create a new account.
+  String get registerHintText;
 
-  /// Used as a label of the `EmailLinkSignInButton`.
-  String get emailLinkSignInButtonLabel;
+  /// Used as a title of the LoginView when AuthAction is AuthAction.signUp.
+  String get registerText;
 
-  /// Used as a title on the `EmailLinkSignInView`.
-  String get signInWithEmailLinkViewTitleText;
+  /// Button label that suggests to resend verification email
+  String get resendVerificationEmailButtonLabel;
+
+  /// Used as a label of submit button of the ForgotPasswordView.
+  String get resetPasswordButtonLabel;
+
+  /// Used as a label of the submit button on the EmailLinkSignInView.
+  String get sendLinkButtonLabel;
+
+  /// Used as a label of the EmailForm submit button when the AuthAction is
+  /// AuthAction.signIn.
+  String get signInActionText;
+
+  /// Used as a hint text of the LoginView suggesting to sign in instead of
+  /// registering a new account.
+  String get signInHintText;
+
+  /// Used as a label of the row showing connected providers.
+  String get signInMethods;
+
+  /// Used as a title of the LoginView when AuthAction is AuthAction.signIn.
+  String get signInText;
+
+  /// Used as a label of the OAuthProviderButton for Apple provider.
+  String get signInWithAppleButtonText;
 
   /// Indicates that email with a sign in link was sent.
   String get signInWithEmailLinkSentText;
 
-  /// Used as a label of the submit button on the `EmailLinkSignInView`.
-  String get sendLinkButtonLabel;
+  /// Used as a title on the EmailLinkSignInView.
+  String get signInWithEmailLinkViewTitleText;
 
-  /// Error text that is show when user tries to use an OAuth provider that
-  /// doesn't belong to currently signed in user account.
-  String get credentialAlreadyInUseErrorText;
+  /// Used as a label of the OAuthProviderButton for Facebook provider.
+  String get signInWithFacebookButtonText;
 
-  /// Button label that suggests to disable 2FA.
-  String get disable;
+  /// Used as a label of the OAuthProviderButton for Google provider.
+  String get signInWithGoogleButtonText;
 
-  /// Button label that suggests to enable 2FA.
-  String get enable;
+  /// Used as a label of the PhoneVerificationButton.
+  String get signInWithPhoneButtonText;
 
-  /// 2-step verification settings tile title.
-  String get mfaTitle;
+  /// Used as a label of the OAuthProviderButton for Twitter provider.
+  String get signInWithTwitterButtonText;
 
-  /// Label that suggests that 2-step verification is not enabled.
-  String get off;
+  /// Used as a label of the SignOutButton.
+  String get signOutButtonText;
 
-  /// Label that suggests that 2-step verification is enabled.
-  String get on;
+  /// Used as an error text when AutoresolutionFailedException is being thrown.
+  String get smsAutoresolutionFailedError;
 
-  // DataTable components
-  String get valueLabel;
-  String get typeLabel;
-  String get stringLabel;
-  String get numberLabel;
-  String get booleanLabel;
-  String get mapLabel;
-  String get arrayLabel;
-  String get nullLabel;
-  String get cancelLabel;
-  String get updateLabel;
-  String get northInitialLabel;
   String get southInitialLabel;
-  String get westInitialLabel;
-  String get eastInitialLabel;
+
+  String get stringLabel;
+
   String get timestampLabel;
-  String get longitudeLabel;
-  String get latitudeLabel;
-  String get geopointLabel;
-  String get referenceLabel;
 
-  /// `UploadButton` label
+  String get typeLabel;
+
+  /// Title that is shown in AlertDialog asking for provider unlink confirmation
+  String get ulinkProviderAlertTitle;
+
+  /// Used as a generic error message when unable to resolve error details from
+  /// Exception or FirebaseAuthException.
+  String get unknownError;
+
+  /// Text that is shown as a message of the AlertDialog confirming provider
+  /// unlink
+  String get unlinkProviderAlertMessage;
+
+  String get updateLabel;
+
+  /// UploadButton label
   String get uploadButtonText;
 
-  /// EmailVerificationScreen title
-  String get verifyEmailTitle;
+  /// Used as an error message when the account for provided email was not
+  /// found.
+  String get userNotFoundErrorText;
+
+  String get valueLabel;
 
   /// Hint text indicating that verification email has been sent
   String get verificationEmailSentText;
 
-  /// Short version of the hint text indicating that verification email has
-  /// been sent
+  /// Short version of the hint text indicating that verification email has been
+  /// sent
   String get verificationEmailSentTextShort;
 
   /// Message indicating that something went wrong during email verification
   String get verificationFailedText;
 
-  /// Message indicating that email is not verified
-  String get emailIsNotVerifiedText;
+  /// Used as a label of the submit button of the SMSCodeInputView.
+  String get verifyCodeButtonText;
 
-  /// Message indicating that email is being verified
-  String get waitingForEmailVerificationText;
+  /// EmailVerificationScreen title
+  String get verifyEmailTitle;
 
-  /// Button label that suggests to resend verification email
-  String get resendVerificationEmailButtonLabel;
+  /// Used as a title of the dialog that requires re-authentication of the user
+  /// when performing destructive actions.
+  String get verifyItsYouText;
 
-  /// Hint text prompting the user to check email for verification link
-  String get checkEmailHintText;
+  /// Used as a label of the submit button of the PhoneInputView.
+  String get verifyPhoneNumberButtonText;
 
-  /// Dissmiss button label
-  String get dismissButtonLabel;
+  /// Used as a status text of the SMSCodeInput when code verification is in
+  /// progress.
+  String get verifyingSMSCodeText;
 
-  /// OK button label
-  String get okButtonLabel;
+  /// Message indicating that email is being verified
+  String get waitingForEmailVerificationText;
 
-  /// Done button label
-  String get doneButtonLabel;
+  String get westInitialLabel;
 
-  /// Error text indicating that entered SMS code is invalid
-  String get invalidVerificationCodeErrorText;
+  /// Used as an error text of the PasswordInput when provided password is empty
+  /// or is not correct.
+  String get wrongOrNoPasswordErrorText;
 }
 
 class DefaultLocalizations extends EnLocalizations {
diff --git a/packages/firebase_ui_localizations/lib/src/lang/ar.dart b/packages/firebase_ui_localizations/lib/src/lang/ar.dart
index 84b596ce..f318d256 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/ar.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/ar.dart
@@ -313,4 +313,17 @@ class ArLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/de.dart b/packages/firebase_ui_localizations/lib/src/lang/de.dart
index 084a063f..560cac50 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/de.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/de.dart
@@ -310,4 +310,17 @@ class DeLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/en.dart b/packages/firebase_ui_localizations/lib/src/lang/en.dart
index bee5232e..36fbf219 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/en.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/en.dart
@@ -306,4 +306,17 @@ class EnLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/es.dart b/packages/firebase_ui_localizations/lib/src/lang/es.dart
index 64c3f3bb..0f4a997c 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/es.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/es.dart
@@ -315,4 +315,17 @@ class EsLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/es_419.dart b/packages/firebase_ui_localizations/lib/src/lang/es_419.dart
index 5156f9e7..7111950f 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/es_419.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/es_419.dart
@@ -312,4 +312,17 @@ class Es419Localizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/fr.dart b/packages/firebase_ui_localizations/lib/src/lang/fr.dart
index 9ede87e6..10526baf 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/fr.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/fr.dart
@@ -316,4 +316,17 @@ class FrLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/he.dart b/packages/firebase_ui_localizations/lib/src/lang/he.dart
index f11bd7be..1eca552c 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/he.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/he.dart
@@ -306,4 +306,17 @@ class HeLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/hi.dart b/packages/firebase_ui_localizations/lib/src/lang/hi.dart
index 783d7b8a..75f1b7b8 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/hi.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/hi.dart
@@ -309,4 +309,17 @@ class HiLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/hu.dart b/packages/firebase_ui_localizations/lib/src/lang/hu.dart
index 160d19f2..66b85dd6 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/hu.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/hu.dart
@@ -307,4 +307,17 @@ class HuLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/id.dart b/packages/firebase_ui_localizations/lib/src/lang/id.dart
index 1c864df8..dac76f60 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/id.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/id.dart
@@ -307,4 +307,17 @@ class IdLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/it.dart b/packages/firebase_ui_localizations/lib/src/lang/it.dart
index af814f85..dfbd1887 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/it.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/it.dart
@@ -310,4 +310,17 @@ class ItLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "Il codice che hai inserito non è valido. Prego riprova ancora.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/ja.dart b/packages/firebase_ui_localizations/lib/src/lang/ja.dart
index 1cf9ea6a..b9f28f3e 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/ja.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/ja.dart
@@ -303,4 +303,17 @@ class JaLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/ko.dart b/packages/firebase_ui_localizations/lib/src/lang/ko.dart
index e7e46d26..557e7ad3 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/ko.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/ko.dart
@@ -301,4 +301,17 @@ class KoLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/nl.dart b/packages/firebase_ui_localizations/lib/src/lang/nl.dart
index c6ea7048..2a94ca23 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/nl.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/nl.dart
@@ -309,4 +309,17 @@ class NlLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/pl.dart b/packages/firebase_ui_localizations/lib/src/lang/pl.dart
index cdd17d61..33a0c5e7 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/pl.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/pl.dart
@@ -309,4 +309,17 @@ class PlLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/pt.dart b/packages/firebase_ui_localizations/lib/src/lang/pt.dart
index dc84eb7b..8eed4914 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/pt.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/pt.dart
@@ -310,4 +310,17 @@ class PtLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/ru.dart b/packages/firebase_ui_localizations/lib/src/lang/ru.dart
index 691c2c66..c4aeee8f 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/ru.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/ru.dart
@@ -309,4 +309,17 @@ class RuLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/th.dart b/packages/firebase_ui_localizations/lib/src/lang/th.dart
index a54bd573..2a38e623 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/th.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/th.dart
@@ -306,4 +306,17 @@ class ThLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/tr.dart b/packages/firebase_ui_localizations/lib/src/lang/tr.dart
index 0706aae9..4b828308 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/tr.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/tr.dart
@@ -309,4 +309,17 @@ class TrLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/uk.dart b/packages/firebase_ui_localizations/lib/src/lang/uk.dart
index 48881ae7..22563874 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/uk.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/uk.dart
@@ -311,4 +311,17 @@ class UkLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/zh.dart b/packages/firebase_ui_localizations/lib/src/lang/zh.dart
index 3757fce2..e3697909 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/zh.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/zh.dart
@@ -299,4 +299,17 @@ class ZhLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }
diff --git a/packages/firebase_ui_localizations/lib/src/lang/zh_tw.dart b/packages/firebase_ui_localizations/lib/src/lang/zh_tw.dart
index e0c9e806..81e629ee 100644
--- a/packages/firebase_ui_localizations/lib/src/lang/zh_tw.dart
+++ b/packages/firebase_ui_localizations/lib/src/lang/zh_tw.dart
@@ -299,4 +299,17 @@ class ZhTWLocalizations extends FirebaseUILocalizationLabels {
   @override
   String get invalidVerificationCodeErrorText =>
       "The code you entered is invalid. Please try again.";
+
+  @override
+  String get ulinkProviderAlertTitle => "Unlink provider";
+
+  @override
+  String get confirmUnlinkButtonLabel => "Unlink";
+
+  @override
+  String get cancelButtonLabel => "Cancel";
+
+  @override
+  String get unlinkProviderAlertMessage =>
+      "Are you sure you want to unlink this provider?";
 }

From 36712395fcf1dc49da22ad084ff785fba3b52d1a Mon Sep 17 00:00:00 2001
From: Andrei Lesnitsky <a@lesnitsky.dev>
Date: Mon, 2 Oct 2023 14:24:14 +0200
Subject: [PATCH 3/3] add license header

---
 packages/firebase_ui_shared/lib/src/universal_alert.dart | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/packages/firebase_ui_shared/lib/src/universal_alert.dart b/packages/firebase_ui_shared/lib/src/universal_alert.dart
index 7749d69d..35e64f73 100644
--- a/packages/firebase_ui_shared/lib/src/universal_alert.dart
+++ b/packages/firebase_ui_shared/lib/src/universal_alert.dart
@@ -1,3 +1,7 @@
+// Copyright 2023, the Chromium project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';