diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index 2b3622387b..f142c14077 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -832,6 +832,10 @@ "@loginMethodDivider": { "description": "Text on the divider between the username/password form and the third-party login options. Uppercase (for languages with letter case)." }, + "loginMethodDividerSemanticLabel": "Log-in alternatives", + "@loginMethodDividerSemanticLabel": { + "description": "Semantic label for divider between the username/password form and the third-party login options." + }, "signInWithFoo": "Sign in with {method}", "@signInWithFoo": { "description": "Button to use {method} to sign in to the app.", diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index 3cf5ddc85d..e4c469d7c3 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -1269,6 +1269,12 @@ abstract class ZulipLocalizations { /// **'OR'** String get loginMethodDivider; + /// Semantic label for divider between the username/password form and the third-party login options. + /// + /// In en, this message translates to: + /// **'Log-in alternatives'** + String get loginMethodDividerSemanticLabel; + /// Button to use {method} to sign in to the app. /// /// In en, this message translates to: diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index 27189bbb11..a2afe093b0 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_de.dart b/lib/generated/l10n/zulip_localizations_de.dart index 4caa2a8082..fcc5c8d3fa 100644 --- a/lib/generated/l10n/zulip_localizations_de.dart +++ b/lib/generated/l10n/zulip_localizations_de.dart @@ -709,6 +709,9 @@ class ZulipLocalizationsDe extends ZulipLocalizations { @override String get loginMethodDivider => 'ODER'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Anmelden mit $method'; diff --git a/lib/generated/l10n/zulip_localizations_el.dart b/lib/generated/l10n/zulip_localizations_el.dart index 670a442e87..754866cb02 100644 --- a/lib/generated/l10n/zulip_localizations_el.dart +++ b/lib/generated/l10n/zulip_localizations_el.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsEl extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index b2fbfcb72f..f5809fc10d 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_es.dart b/lib/generated/l10n/zulip_localizations_es.dart index f3ee9284e9..6bdd3973c3 100644 --- a/lib/generated/l10n/zulip_localizations_es.dart +++ b/lib/generated/l10n/zulip_localizations_es.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsEs extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_fr.dart b/lib/generated/l10n/zulip_localizations_fr.dart index 32cb94bf82..7adbcb8303 100644 --- a/lib/generated/l10n/zulip_localizations_fr.dart +++ b/lib/generated/l10n/zulip_localizations_fr.dart @@ -706,6 +706,9 @@ class ZulipLocalizationsFr extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_he.dart b/lib/generated/l10n/zulip_localizations_he.dart index 37dc15e7e4..c28f06c4e5 100644 --- a/lib/generated/l10n/zulip_localizations_he.dart +++ b/lib/generated/l10n/zulip_localizations_he.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsHe extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_hu.dart b/lib/generated/l10n/zulip_localizations_hu.dart index 44404f1955..43ac20a859 100644 --- a/lib/generated/l10n/zulip_localizations_hu.dart +++ b/lib/generated/l10n/zulip_localizations_hu.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsHu extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_it.dart b/lib/generated/l10n/zulip_localizations_it.dart index 1533008103..5b45be5f62 100644 --- a/lib/generated/l10n/zulip_localizations_it.dart +++ b/lib/generated/l10n/zulip_localizations_it.dart @@ -703,6 +703,9 @@ class ZulipLocalizationsIt extends ZulipLocalizations { @override String get loginMethodDivider => 'O'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Accedi con $method'; diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index 6465223b8a..a54686e873 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -676,6 +676,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations { @override String get loginMethodDivider => 'または'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return '$methodでログイン'; diff --git a/lib/generated/l10n/zulip_localizations_nb.dart b/lib/generated/l10n/zulip_localizations_nb.dart index cfcc46ebb6..cd13ec9ab0 100644 --- a/lib/generated/l10n/zulip_localizations_nb.dart +++ b/lib/generated/l10n/zulip_localizations_nb.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsNb extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index e12fe1aeb2..036846caf4 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -703,6 +703,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations { @override String get loginMethodDivider => 'LUB'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Logowanie z $method'; diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index f2a9f0561e..5f54d02d32 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -704,6 +704,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations { @override String get loginMethodDivider => 'ИЛИ'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Войти с помощью $method'; diff --git a/lib/generated/l10n/zulip_localizations_sk.dart b/lib/generated/l10n/zulip_localizations_sk.dart index b28622eb3e..39dca858c8 100644 --- a/lib/generated/l10n/zulip_localizations_sk.dart +++ b/lib/generated/l10n/zulip_localizations_sk.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsSk extends ZulipLocalizations { @override String get loginMethodDivider => 'alebo'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Prihlásiť sa pomocou $method'; diff --git a/lib/generated/l10n/zulip_localizations_sl.dart b/lib/generated/l10n/zulip_localizations_sl.dart index 10dc8727cd..abcfb90899 100644 --- a/lib/generated/l10n/zulip_localizations_sl.dart +++ b/lib/generated/l10n/zulip_localizations_sl.dart @@ -715,6 +715,9 @@ class ZulipLocalizationsSl extends ZulipLocalizations { @override String get loginMethodDivider => 'ALI'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Prijava z $method'; diff --git a/lib/generated/l10n/zulip_localizations_uk.dart b/lib/generated/l10n/zulip_localizations_uk.dart index e2872b11a0..0a70fc9b7f 100644 --- a/lib/generated/l10n/zulip_localizations_uk.dart +++ b/lib/generated/l10n/zulip_localizations_uk.dart @@ -704,6 +704,9 @@ class ZulipLocalizationsUk extends ZulipLocalizations { @override String get loginMethodDivider => 'АБО'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Увійти з $method'; diff --git a/lib/generated/l10n/zulip_localizations_zh.dart b/lib/generated/l10n/zulip_localizations_zh.dart index e05f76bee3..bac342c0c1 100644 --- a/lib/generated/l10n/zulip_localizations_zh.dart +++ b/lib/generated/l10n/zulip_localizations_zh.dart @@ -690,6 +690,9 @@ class ZulipLocalizationsZh extends ZulipLocalizations { @override String get loginMethodDivider => 'OR'; + @override + String get loginMethodDividerSemanticLabel => 'Log-in alternatives'; + @override String signInWithFoo(String method) { return 'Sign in with $method'; diff --git a/lib/widgets/login.dart b/lib/widgets/login.dart index 664a24509a..bba55e0d83 100644 --- a/lib/widgets/login.dart +++ b/lib/widgets/login.dart @@ -457,10 +457,10 @@ class _LoginPageState extends State { final externalAuthenticationMethods = widget.serverSettings.externalAuthenticationMethods; - final loginForm = Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + final loginContent = Column(mainAxisAlignment: MainAxisAlignment.center, children: [ _UsernamePasswordForm(loginPageState: this), if (externalAuthenticationMethods.isNotEmpty) ...[ - const OrDivider(), + _AlternativeAuthDivider(), ...externalAuthenticationMethods.map((method) { final icon = method.displayIcon; return OutlinedButton.icon( @@ -497,7 +497,7 @@ class _LoginPageState extends State { // left or the right of this box child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 400), - child: loginForm)))))); + child: loginContent)))))); } } @@ -664,9 +664,7 @@ class _UsernamePasswordFormState extends State<_UsernamePasswordForm> { } // Loosely based on the corresponding element in the web app. -class OrDivider extends StatelessWidget { - const OrDivider({super.key}); - +class _AlternativeAuthDivider extends StatelessWidget { @override Widget build(BuildContext context) { final zulipLocalizations = ZulipLocalizations.of(context); @@ -677,17 +675,20 @@ class OrDivider extends StatelessWidget { return Padding( padding: const EdgeInsets.symmetric(vertical: 10), - child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ - divider, - Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), - child: Text(zulipLocalizations.loginMethodDivider, - textAlign: TextAlign.center, - style: TextStyle( - color: designVariables.loginOrDividerText, - height: 1.5, - ).merge(weightVariableTextStyle(context, wght: 600)))), - divider, - ])); + child: Semantics( + excludeSemantics: true, + label: zulipLocalizations.loginMethodDividerSemanticLabel, + child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ + divider, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: Text(zulipLocalizations.loginMethodDivider, + textAlign: TextAlign.center, + style: TextStyle( + color: designVariables.loginOrDividerText, + height: 1.5, + ).merge(weightVariableTextStyle(context, wght: 600)))), + divider, + ]))); } }