Unverified Commit 68736081 authored by Yegor's avatar Yegor Committed by GitHub

Make UserAccountsDrawerHeader accessible (#13711)

* other accounts a11y; show accounts button a11y

* layout with bigger tap areas; all semantics

* internationalize UserAccountsDrawerHeader a11y labels

* better Russian translation

* break import cycle

* address comments
parent dd796853
...@@ -239,6 +239,18 @@ abstract class MaterialLocalizations { ...@@ -239,6 +239,18 @@ abstract class MaterialLocalizations {
/// ``` /// ```
int get firstDayOfWeekIndex; int get firstDayOfWeekIndex;
/// The semantics label used to indicate which account is signed in in the
/// [UserAccountsDrawerHeader] widget.
String get signedInLabel;
/// The semantics label used for the button on [UserAccountsDrawerHeader] that
/// hides the list of accounts.
String get hideAccountsLabel;
/// The semantics label used for the button on [UserAccountsDrawerHeader] that
/// shows the list of accounts.
String get showAccountsLabel;
/// The `MaterialLocalizations` from the closest [Localizations] instance /// The `MaterialLocalizations` from the closest [Localizations] instance
/// that encloses the given context. /// that encloses the given context.
/// ///
...@@ -570,6 +582,15 @@ class DefaultMaterialLocalizations implements MaterialLocalizations { ...@@ -570,6 +582,15 @@ class DefaultMaterialLocalizations implements MaterialLocalizations {
@override @override
TextTheme get localTextGeometry => MaterialTextGeometry.englishLike; TextTheme get localTextGeometry => MaterialTextGeometry.englishLike;
@override
String get signedInLabel => 'Signed in';
@override
String get hideAccountsLabel => 'Hide accounts';
@override
String get showAccountsLabel => 'Show accounts';
/// Creates an object that provides US English resource values for the material /// Creates an object that provides US English resource values for the material
/// library widgets. /// library widgets.
/// ///
......
...@@ -10,6 +10,7 @@ import 'debug.dart'; ...@@ -10,6 +10,7 @@ import 'debug.dart';
import 'drawer_header.dart'; import 'drawer_header.dart';
import 'icons.dart'; import 'icons.dart';
import 'ink_well.dart'; import 'ink_well.dart';
import 'material_localizations.dart';
import 'theme.dart'; import 'theme.dart';
class _AccountPictures extends StatelessWidget { class _AccountPictures extends StatelessWidget {
...@@ -35,7 +36,10 @@ class _AccountPictures extends StatelessWidget { ...@@ -35,7 +36,10 @@ class _AccountPictures extends StatelessWidget {
margin: const EdgeInsetsDirectional.only(start: 16.0), margin: const EdgeInsetsDirectional.only(start: 16.0),
width: 40.0, width: 40.0,
height: 40.0, height: 40.0,
child: picture child: new Semantics(
container: true,
child: picture,
),
); );
}).toList(), }).toList(),
), ),
...@@ -45,7 +49,7 @@ class _AccountPictures extends StatelessWidget { ...@@ -45,7 +49,7 @@ class _AccountPictures extends StatelessWidget {
child: new SizedBox( child: new SizedBox(
width: 72.0, width: 72.0,
height: 72.0, height: 72.0,
child: currentAccountPicture child: currentAccountPicture,
), ),
), ),
], ],
...@@ -67,62 +71,72 @@ class _AccountDetails extends StatelessWidget { ...@@ -67,62 +71,72 @@ class _AccountDetails extends StatelessWidget {
final VoidCallback onTap; final VoidCallback onTap;
final bool isOpen; final bool isOpen;
Widget addDropdownIcon(Widget line) {
final Widget icon = new Icon(
isOpen ? Icons.arrow_drop_up : Icons.arrow_drop_down,
color: Colors.white
);
return new Expanded(
child: new Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: line == null ? <Widget>[icon] : <Widget>[
new Expanded(child: line),
icon,
],
),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
Widget accountNameLine = accountName == null ? null : new DefaultTextStyle( final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final Widget accountNameLine = accountName == null ? null : new DefaultTextStyle(
style: theme.primaryTextTheme.body2, style: theme.primaryTextTheme.body2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
child: accountName, child: accountName,
); );
Widget accountEmailLine = accountEmail == null ? null : new DefaultTextStyle( final Widget accountEmailLine = accountEmail == null ? null : new DefaultTextStyle(
style: theme.primaryTextTheme.body1, style: theme.primaryTextTheme.body1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
child: accountEmail, child: accountEmail,
); );
if (onTap != null) {
if (accountEmailLine != null)
accountEmailLine = addDropdownIcon(accountEmailLine);
else
accountNameLine = addDropdownIcon(accountNameLine);
}
Widget accountDetails; final List<Widget> rowChildren = <Widget>[];
if (accountEmailLine != null || accountNameLine != null) { if (accountEmailLine != null || accountNameLine != null) {
accountDetails = new Padding( rowChildren.add(
padding: const EdgeInsets.symmetric(vertical: 8.0), new Expanded(
flex: 1,
child: new Padding(
padding: const EdgeInsets.fromLTRB(16.0, 8.0, 0.0, 8.0),
child: new Column( child: new Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: (accountEmailLine != null && accountNameLine != null) children: (accountEmailLine != null && accountNameLine != null)
? <Widget>[accountNameLine, accountEmailLine] ? <Widget>[accountNameLine, accountEmailLine]
: <Widget>[accountNameLine ?? accountEmailLine] : <Widget>[accountNameLine ?? accountEmailLine],
),
),
), ),
); );
} }
if (onTap != null) const double kAccountDetailsHeight = 56.0;
accountDetails = new InkWell(onTap: onTap, child: accountDetails);
if (onTap != null) {
rowChildren.add(
new InkWell(
onTap: onTap,
child: new Semantics(
button: true,
child: new SizedBox(
height: kAccountDetailsHeight,
width: kAccountDetailsHeight, // make it a square
child: new Center(
child: new Icon(
isOpen ? Icons.arrow_drop_up : Icons.arrow_drop_down,
color: Colors.white,
semanticLabel: isOpen
? localizations.hideAccountsLabel
: localizations.showAccountsLabel,
),
),
),
),
),
);
}
return new SizedBox( return new SizedBox(
height: 56.0, height: kAccountDetailsHeight,
child: accountDetails, child: new Row(
children: rowChildren,
),
); );
} }
} }
...@@ -147,7 +161,7 @@ class UserAccountsDrawerHeader extends StatefulWidget { ...@@ -147,7 +161,7 @@ class UserAccountsDrawerHeader extends StatefulWidget {
this.otherAccountsPictures, this.otherAccountsPictures,
@required this.accountName, @required this.accountName,
@required this.accountEmail, @required this.accountEmail,
this.onDetailsPressed this.onDetailsPressed,
}) : super(key: key); }) : super(key: key);
/// The header's background. If decoration is null then a [BoxDecoration] /// The header's background. If decoration is null then a [BoxDecoration]
...@@ -200,16 +214,23 @@ class _UserAccountsDrawerHeaderState extends State<UserAccountsDrawerHeader> { ...@@ -200,16 +214,23 @@ class _UserAccountsDrawerHeaderState extends State<UserAccountsDrawerHeader> {
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
), ),
margin: widget.margin, margin: widget.margin,
padding: EdgeInsets.zero,
child: new SafeArea( child: new SafeArea(
bottom: false, bottom: false,
child: new Semantics(
container: true,
label: 'Signed in',
child: new Column( child: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[ children: <Widget>[
new Expanded( new Expanded(
child: new Padding(
padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 0.0),
child: new _AccountPictures( child: new _AccountPictures(
currentAccountPicture: widget.currentAccountPicture, currentAccountPicture: widget.currentAccountPicture,
otherAccountsPictures: widget.otherAccountsPictures, otherAccountsPictures: widget.otherAccountsPictures,
) ),
),
), ),
new _AccountDetails( new _AccountDetails(
accountName: widget.accountName, accountName: widget.accountName,
...@@ -220,6 +241,7 @@ class _UserAccountsDrawerHeaderState extends State<UserAccountsDrawerHeader> { ...@@ -220,6 +241,7 @@ class _UserAccountsDrawerHeaderState extends State<UserAccountsDrawerHeader> {
], ],
), ),
), ),
),
); );
} }
} }
...@@ -4826,7 +4826,7 @@ class Semantics extends SingleChildRenderObjectWidget { ...@@ -4826,7 +4826,7 @@ class Semantics extends SingleChildRenderObjectWidget {
/// more accessible. /// more accessible.
final SemanticsProperties properties; final SemanticsProperties properties;
/// If 'container' is true, this widget will introduce a new /// If [container] is true, this widget will introduce a new
/// node in the semantics tree. Otherwise, the semantics will be /// node in the semantics tree. Otherwise, the semantics will be
/// merged with the semantics of any ancestors (if the ancestor allows that). /// merged with the semantics of any ancestors (if the ancestor allows that).
/// ///
......
...@@ -2,16 +2,23 @@ ...@@ -2,16 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:ui';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart' hide TypeMatcher;
void main() { import '../widgets/semantics_tester.dart';
testWidgets('UserAccountsDrawerHeader test', (WidgetTester tester) async {
final Key avatarA = const Key('A');
final Key avatarC = const Key('C');
final Key avatarD = const Key('D');
const Key avatarA = const Key('A');
const Key avatarC = const Key('C');
const Key avatarD = const Key('D');
Future<Null> pumpTestWidget(WidgetTester tester, {
bool withName: true,
bool withEmail: true,
bool withOnDetailsPressedHandler: true,
}) async {
await tester.pumpWidget( await tester.pumpWidget(
new MaterialApp( new MaterialApp(
home: new MediaQuery( home: new MediaQuery(
...@@ -26,7 +33,8 @@ void main() { ...@@ -26,7 +33,8 @@ void main() {
child: new Material( child: new Material(
child: new Center( child: new Center(
child: new UserAccountsDrawerHeader( child: new UserAccountsDrawerHeader(
currentAccountPicture: new CircleAvatar( onDetailsPressed: withOnDetailsPressedHandler ? () {} : null,
currentAccountPicture: const CircleAvatar(
key: avatarA, key: avatarA,
child: const Text('A'), child: const Text('A'),
), ),
...@@ -34,11 +42,11 @@ void main() { ...@@ -34,11 +42,11 @@ void main() {
const CircleAvatar( const CircleAvatar(
child: const Text('B'), child: const Text('B'),
), ),
new CircleAvatar( const CircleAvatar(
key: avatarC, key: avatarC,
child: const Text('C'), child: const Text('C'),
), ),
new CircleAvatar( const CircleAvatar(
key: avatarD, key: avatarD,
child: const Text('D'), child: const Text('D'),
), ),
...@@ -46,14 +54,19 @@ void main() { ...@@ -46,14 +54,19 @@ void main() {
child: const Text('E'), child: const Text('E'),
) )
], ],
accountName: const Text('name'), accountName: withName ? const Text('name') : null,
accountEmail: const Text('email'), accountEmail: withEmail ? const Text('email') : null,
), ),
), ),
), ),
), ),
), ),
); );
}
void main() {
testWidgets('UserAccountsDrawerHeader layout', (WidgetTester tester) async {
await pumpTestWidget(tester);
expect(find.text('A'), findsOneWidget); expect(find.text('A'), findsOneWidget);
expect(find.text('B'), findsOneWidget); expect(find.text('B'), findsOneWidget);
...@@ -126,6 +139,8 @@ void main() { ...@@ -126,6 +139,8 @@ void main() {
)); ));
expect(find.byType(Icon), findsOneWidget); expect(find.byType(Icon), findsOneWidget);
// When either email or account name (but not both!) are present, the icon
// is center aligned with the text displaying the email/name.
await tester.pumpWidget(buildFrame( await tester.pumpWidget(buildFrame(
accountName: const Text('accountName'), accountName: const Text('accountName'),
onDetailsPressed: () { }, onDetailsPressed: () { },
...@@ -144,13 +159,16 @@ void main() { ...@@ -144,13 +159,16 @@ void main() {
tester.getCenter(find.byType(Icon)).dy tester.getCenter(find.byType(Icon)).dy
); );
// When _both_ email and account name are present, the icon is placed in the
// center of the entire row. It's not aligned with text any more.
await tester.pumpWidget(buildFrame( await tester.pumpWidget(buildFrame(
accountName: const Text('accountName'), accountName: const Text('accountName'),
accountEmail: const Text('accountEmail'), accountEmail: const Text('accountEmail'),
onDetailsPressed: () { }, onDetailsPressed: () { },
)); ));
final RenderFlex row = tester.element(find.text('accountEmail')).ancestorRenderObjectOfType(const TypeMatcher<RenderFlex>());
expect( expect(
tester.getCenter(find.text('accountEmail')).dy, row.localToGlobal(row.size.center(Offset.zero)).dy,
tester.getCenter(find.byType(Icon)).dy tester.getCenter(find.byType(Icon)).dy
); );
expect( expect(
...@@ -186,4 +204,83 @@ void main() { ...@@ -186,4 +204,83 @@ void main() {
greaterThan(tester.getBottomLeft(find.byKey(avatarA)).dy) greaterThan(tester.getBottomLeft(find.byKey(avatarA)).dy)
); );
}); });
testWidgets('UserAccountsDrawerHeader provides semantics', (WidgetTester tester) async {
final SemanticsTester semantics = new SemanticsTester(tester);
await pumpTestWidget(tester);
expect(
semantics,
hasSemantics(
new TestSemantics(
children: <TestSemantics>[
new TestSemantics(
label: 'Signed in\nA\nname\nemail',
textDirection: TextDirection.ltr,
children: <TestSemantics>[
new TestSemantics(
label: r'B',
textDirection: TextDirection.ltr,
),
new TestSemantics(
label: r'C',
textDirection: TextDirection.ltr,
),
new TestSemantics(
label: r'D',
textDirection: TextDirection.ltr,
),
new TestSemantics(
flags: <SemanticsFlags>[SemanticsFlags.isButton],
actions: <SemanticsAction>[SemanticsAction.tap],
label: r'Show accounts',
textDirection: TextDirection.ltr,
),
],
),
],
),
ignoreId: true, ignoreTransform: true, ignoreRect: true,
),
);
semantics.dispose();
});
testWidgets('UserAccountsDrawerHeader provides semantics with missing properties', (WidgetTester tester) async {
final SemanticsTester semantics = new SemanticsTester(tester);
await pumpTestWidget(
tester,
withEmail: false,
withName: false,
withOnDetailsPressedHandler: false,
);
expect(
semantics,
hasSemantics(
new TestSemantics(
children: <TestSemantics>[
new TestSemantics(
label: 'Signed in\nA',
textDirection: TextDirection.ltr,
children: <TestSemantics>[
new TestSemantics(
label: r'B',
textDirection: TextDirection.ltr,
),
new TestSemantics(
label: r'C',
textDirection: TextDirection.ltr,
),
new TestSemantics(
label: r'D',
textDirection: TextDirection.ltr,
),
],
),
],
),
ignoreId: true, ignoreTransform: true, ignoreRect: true,
),
);
semantics.dispose();
});
} }
...@@ -53,6 +53,9 @@ class TranslationBundle { ...@@ -53,6 +53,9 @@ class TranslationBundle {
String get postMeridiemAbbreviation => parent?.postMeridiemAbbreviation; String get postMeridiemAbbreviation => parent?.postMeridiemAbbreviation;
String get timePickerHourModeAnnouncement => parent?.timePickerHourModeAnnouncement; String get timePickerHourModeAnnouncement => parent?.timePickerHourModeAnnouncement;
String get timePickerMinuteModeAnnouncement => parent?.timePickerMinuteModeAnnouncement; String get timePickerMinuteModeAnnouncement => parent?.timePickerMinuteModeAnnouncement;
String get signedInLabel => parent?.signedInLabel;
String get hideAccountsLabel => parent?.hideAccountsLabel;
String get showAccountsLabel => parent?.showAccountsLabel;
String get modalBarrierDismissLabel => parent?.modalBarrierDismissLabel; String get modalBarrierDismissLabel => parent?.modalBarrierDismissLabel;
} }
...@@ -94,6 +97,9 @@ class _Bundle_ar extends TranslationBundle { ...@@ -94,6 +97,9 @@ class _Bundle_ar extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'م'; @override String get postMeridiemAbbreviation => r'م';
@override String get timePickerHourModeAnnouncement => r'اختيار الساعات'; @override String get timePickerHourModeAnnouncement => r'اختيار الساعات';
@override String get timePickerMinuteModeAnnouncement => r'اختيار الدقائق'; @override String get timePickerMinuteModeAnnouncement => r'اختيار الدقائق';
@override String get signedInLabel => r'تم تسجيل الدخول';
@override String get hideAccountsLabel => r'إخفاء الحسابات';
@override String get showAccountsLabel => r'عرض الحسابات';
@override String get modalBarrierDismissLabel => r'تجاهل'; @override String get modalBarrierDismissLabel => r'تجاهل';
} }
...@@ -132,6 +138,9 @@ class _Bundle_de extends TranslationBundle { ...@@ -132,6 +138,9 @@ class _Bundle_de extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'NACHM.'; @override String get postMeridiemAbbreviation => r'NACHM.';
@override String get timePickerHourModeAnnouncement => r'Stunden auswählen'; @override String get timePickerHourModeAnnouncement => r'Stunden auswählen';
@override String get timePickerMinuteModeAnnouncement => r'Minuten auswählen'; @override String get timePickerMinuteModeAnnouncement => r'Minuten auswählen';
@override String get signedInLabel => r'Angemeldet';
@override String get hideAccountsLabel => r'Konten ausblenden';
@override String get showAccountsLabel => r'Konten anzeigen';
@override String get modalBarrierDismissLabel => r'Schließen'; @override String get modalBarrierDismissLabel => r'Schließen';
} }
...@@ -171,6 +180,9 @@ class _Bundle_en extends TranslationBundle { ...@@ -171,6 +180,9 @@ class _Bundle_en extends TranslationBundle {
@override String get timePickerHourModeAnnouncement => r'Select hours'; @override String get timePickerHourModeAnnouncement => r'Select hours';
@override String get timePickerMinuteModeAnnouncement => r'Select minutes'; @override String get timePickerMinuteModeAnnouncement => r'Select minutes';
@override String get modalBarrierDismissLabel => r'Dismiss'; @override String get modalBarrierDismissLabel => r'Dismiss';
@override String get signedInLabel => r'Signed in';
@override String get hideAccountsLabel => r'Hide accounts';
@override String get showAccountsLabel => r'Show accounts';
} }
// ignore: camel_case_types // ignore: camel_case_types
...@@ -208,6 +220,9 @@ class _Bundle_es extends TranslationBundle { ...@@ -208,6 +220,9 @@ class _Bundle_es extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'P.M.'; @override String get postMeridiemAbbreviation => r'P.M.';
@override String get timePickerHourModeAnnouncement => r'Seleccionar horas'; @override String get timePickerHourModeAnnouncement => r'Seleccionar horas';
@override String get timePickerMinuteModeAnnouncement => r'Seleccionar minutos'; @override String get timePickerMinuteModeAnnouncement => r'Seleccionar minutos';
@override String get signedInLabel => r'Registrado';
@override String get hideAccountsLabel => r'Ocultar cuentas';
@override String get showAccountsLabel => r'Mostrar cuentas';
@override String get modalBarrierDismissLabel => r'Ignorar'; @override String get modalBarrierDismissLabel => r'Ignorar';
} }
...@@ -245,6 +260,9 @@ class _Bundle_fa extends TranslationBundle { ...@@ -245,6 +260,9 @@ class _Bundle_fa extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'ب.ظ.'; @override String get postMeridiemAbbreviation => r'ب.ظ.';
@override String get timePickerHourModeAnnouncement => r'انتخاب ساعت'; @override String get timePickerHourModeAnnouncement => r'انتخاب ساعت';
@override String get timePickerMinuteModeAnnouncement => r'انتخاب دقیقه'; @override String get timePickerMinuteModeAnnouncement => r'انتخاب دقیقه';
@override String get signedInLabel => r'وارد شدن';
@override String get hideAccountsLabel => r'پنهان کردن حساب ها';
@override String get showAccountsLabel => r'نمایش حساب ها';
@override String get modalBarrierDismissLabel => r'رد کردن'; @override String get modalBarrierDismissLabel => r'رد کردن';
} }
...@@ -283,6 +301,9 @@ class _Bundle_fr extends TranslationBundle { ...@@ -283,6 +301,9 @@ class _Bundle_fr extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'Sélectionner une heure'; @override String get timePickerHourModeAnnouncement => r'Sélectionner une heure';
@override String get timePickerMinuteModeAnnouncement => r'Sélectionner des minutes'; @override String get timePickerMinuteModeAnnouncement => r'Sélectionner des minutes';
@override String get signedInLabel => r'Connecté';
@override String get hideAccountsLabel => r'Masquer les comptes';
@override String get showAccountsLabel => r'Afficher les comptes';
@override String get modalBarrierDismissLabel => r'Ignorer'; @override String get modalBarrierDismissLabel => r'Ignorer';
} }
...@@ -359,6 +380,9 @@ class _Bundle_he extends TranslationBundle { ...@@ -359,6 +380,9 @@ class _Bundle_he extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'בחירת שעות'; @override String get timePickerHourModeAnnouncement => r'בחירת שעות';
@override String get timePickerMinuteModeAnnouncement => r'בחירת דקות'; @override String get timePickerMinuteModeAnnouncement => r'בחירת דקות';
@override String get signedInLabel => r'מחובר';
@override String get hideAccountsLabel => r'הסתר חשבונות';
@override String get showAccountsLabel => r'הצג חשבונות';
@override String get modalBarrierDismissLabel => r'סגירה'; @override String get modalBarrierDismissLabel => r'סגירה';
} }
...@@ -396,6 +420,9 @@ class _Bundle_it extends TranslationBundle { ...@@ -396,6 +420,9 @@ class _Bundle_it extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'Seleziona le ore'; @override String get timePickerHourModeAnnouncement => r'Seleziona le ore';
@override String get timePickerMinuteModeAnnouncement => r'Seleziona i minuti'; @override String get timePickerMinuteModeAnnouncement => r'Seleziona i minuti';
@override String get signedInLabel => r'Registrato';
@override String get hideAccountsLabel => r'Nascondi account';
@override String get showAccountsLabel => r'Mostra account';
@override String get modalBarrierDismissLabel => r'Ignora'; @override String get modalBarrierDismissLabel => r'Ignora';
} }
...@@ -433,6 +460,9 @@ class _Bundle_ja extends TranslationBundle { ...@@ -433,6 +460,9 @@ class _Bundle_ja extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'時間を選択'; @override String get timePickerHourModeAnnouncement => r'時間を選択';
@override String get timePickerMinuteModeAnnouncement => r'分を選択'; @override String get timePickerMinuteModeAnnouncement => r'分を選択';
@override String get signedInLabel => r'ログイン中';
@override String get hideAccountsLabel => r'アカウントを隠す';
@override String get showAccountsLabel => r'アカウントを表示する';
@override String get modalBarrierDismissLabel => r'閉じる'; @override String get modalBarrierDismissLabel => r'閉じる';
} }
...@@ -470,6 +500,9 @@ class _Bundle_ko extends TranslationBundle { ...@@ -470,6 +500,9 @@ class _Bundle_ko extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'오후'; @override String get postMeridiemAbbreviation => r'오후';
@override String get timePickerHourModeAnnouncement => r'시간 선택'; @override String get timePickerHourModeAnnouncement => r'시간 선택';
@override String get timePickerMinuteModeAnnouncement => r'분 선택'; @override String get timePickerMinuteModeAnnouncement => r'분 선택';
@override String get signedInLabel => r'로그인 함';
@override String get hideAccountsLabel => r'계정 숨기기';
@override String get showAccountsLabel => r'계정 표시';
@override String get modalBarrierDismissLabel => r'버리다'; @override String get modalBarrierDismissLabel => r'버리다';
} }
...@@ -507,6 +540,9 @@ class _Bundle_nl extends TranslationBundle { ...@@ -507,6 +540,9 @@ class _Bundle_nl extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'pm'; @override String get postMeridiemAbbreviation => r'pm';
@override String get timePickerHourModeAnnouncement => r'Uren selecteren'; @override String get timePickerHourModeAnnouncement => r'Uren selecteren';
@override String get timePickerMinuteModeAnnouncement => r'Minuten selecteren'; @override String get timePickerMinuteModeAnnouncement => r'Minuten selecteren';
@override String get signedInLabel => r'Ingelogd';
@override String get hideAccountsLabel => r'Verberg accounts';
@override String get showAccountsLabel => r'Toon accounts';
@override String get modalBarrierDismissLabel => r'ontslaan'; @override String get modalBarrierDismissLabel => r'ontslaan';
} }
...@@ -546,6 +582,9 @@ class _Bundle_pl extends TranslationBundle { ...@@ -546,6 +582,9 @@ class _Bundle_pl extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'Wybierz godziny'; @override String get timePickerHourModeAnnouncement => r'Wybierz godziny';
@override String get timePickerMinuteModeAnnouncement => r'Wybierz minuty'; @override String get timePickerMinuteModeAnnouncement => r'Wybierz minuty';
@override String get signedInLabel => r'Zapisany';
@override String get hideAccountsLabel => r'Ukryj konta';
@override String get showAccountsLabel => r'Pokaż konta';
@override String get modalBarrierDismissLabel => r'oddalić'; @override String get modalBarrierDismissLabel => r'oddalić';
} }
...@@ -580,6 +619,9 @@ class _Bundle_ps extends TranslationBundle { ...@@ -580,6 +619,9 @@ class _Bundle_ps extends TranslationBundle {
@override String get viewLicensesButtonLabel => r'لیدلس وګورئ'; @override String get viewLicensesButtonLabel => r'لیدلس وګورئ';
@override String get timePickerHourModeAnnouncement => r'وختونه وټاکئ'; @override String get timePickerHourModeAnnouncement => r'وختونه وټاکئ';
@override String get timePickerMinuteModeAnnouncement => r'منې غوره کړئ'; @override String get timePickerMinuteModeAnnouncement => r'منې غوره کړئ';
@override String get signedInLabel => r'ننوتل';
@override String get hideAccountsLabel => r'حسابونه پټ کړئ';
@override String get showAccountsLabel => r'حسابونه ښکاره کړئ';
@override String get modalBarrierDismissLabel => r'رد کړه'; @override String get modalBarrierDismissLabel => r'رد کړه';
} }
...@@ -617,6 +659,9 @@ class _Bundle_pt extends TranslationBundle { ...@@ -617,6 +659,9 @@ class _Bundle_pt extends TranslationBundle {
@override String get viewLicensesButtonLabel => r'VER LICENÇAS'; @override String get viewLicensesButtonLabel => r'VER LICENÇAS';
@override String get timePickerHourModeAnnouncement => r'Selecione as horas'; @override String get timePickerHourModeAnnouncement => r'Selecione as horas';
@override String get timePickerMinuteModeAnnouncement => r'Selecione os minutos'; @override String get timePickerMinuteModeAnnouncement => r'Selecione os minutos';
@override String get signedInLabel => r'Assinado';
@override String get hideAccountsLabel => r'Ocultar contas';
@override String get showAccountsLabel => r'Mostrar contas';
@override String get modalBarrierDismissLabel => r'Dispensar'; @override String get modalBarrierDismissLabel => r'Dispensar';
} }
...@@ -657,6 +702,9 @@ class _Bundle_ru extends TranslationBundle { ...@@ -657,6 +702,9 @@ class _Bundle_ru extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'Выберите часы'; @override String get timePickerHourModeAnnouncement => r'Выберите часы';
@override String get timePickerMinuteModeAnnouncement => r'Выберите минуты'; @override String get timePickerMinuteModeAnnouncement => r'Выберите минуты';
@override String get signedInLabel => r'Залогинен';
@override String get hideAccountsLabel => r'Спрятать аккаунты';
@override String get showAccountsLabel => r'Показать аккаунты';
@override String get modalBarrierDismissLabel => r'Закрыть'; @override String get modalBarrierDismissLabel => r'Закрыть';
} }
...@@ -694,6 +742,9 @@ class _Bundle_th extends TranslationBundle { ...@@ -694,6 +742,9 @@ class _Bundle_th extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'เลือกชั่วโมง'; @override String get timePickerHourModeAnnouncement => r'เลือกชั่วโมง';
@override String get timePickerMinuteModeAnnouncement => r'เลือกนาที'; @override String get timePickerMinuteModeAnnouncement => r'เลือกนาที';
@override String get signedInLabel => r'ลงทะเบียนเข้า';
@override String get hideAccountsLabel => r'ซ่อนบัญชี';
@override String get showAccountsLabel => r'แสดงบัญชี';
@override String get modalBarrierDismissLabel => r'ยกเลิก'; @override String get modalBarrierDismissLabel => r'ยกเลิก';
} }
...@@ -731,6 +782,9 @@ class _Bundle_tr extends TranslationBundle { ...@@ -731,6 +782,9 @@ class _Bundle_tr extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'ÖS'; @override String get postMeridiemAbbreviation => r'ÖS';
@override String get timePickerHourModeAnnouncement => r'Saati seçin'; @override String get timePickerHourModeAnnouncement => r'Saati seçin';
@override String get timePickerMinuteModeAnnouncement => r'Dakikayı seçin'; @override String get timePickerMinuteModeAnnouncement => r'Dakikayı seçin';
@override String get signedInLabel => r'Yetkili';
@override String get hideAccountsLabel => r'Hesapları gizle';
@override String get showAccountsLabel => r'Hesapları göster';
@override String get modalBarrierDismissLabel => r'Reddet'; @override String get modalBarrierDismissLabel => r'Reddet';
} }
...@@ -768,6 +822,9 @@ class _Bundle_ur extends TranslationBundle { ...@@ -768,6 +822,9 @@ class _Bundle_ur extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'PM'; @override String get postMeridiemAbbreviation => r'PM';
@override String get timePickerHourModeAnnouncement => r'گھنٹے منتخب کریں'; @override String get timePickerHourModeAnnouncement => r'گھنٹے منتخب کریں';
@override String get timePickerMinuteModeAnnouncement => r'منٹ منتخب کریں'; @override String get timePickerMinuteModeAnnouncement => r'منٹ منتخب کریں';
@override String get signedInLabel => r'سائن ان';
@override String get hideAccountsLabel => r'اکاؤنٹس چھپائیں';
@override String get showAccountsLabel => r'اکاؤنٹس دکھائیں';
@override String get modalBarrierDismissLabel => r'برطرف'; @override String get modalBarrierDismissLabel => r'برطرف';
} }
...@@ -805,6 +862,9 @@ class _Bundle_zh extends TranslationBundle { ...@@ -805,6 +862,9 @@ class _Bundle_zh extends TranslationBundle {
@override String get postMeridiemAbbreviation => r'下午'; @override String get postMeridiemAbbreviation => r'下午';
@override String get timePickerHourModeAnnouncement => r'选择小时'; @override String get timePickerHourModeAnnouncement => r'选择小时';
@override String get timePickerMinuteModeAnnouncement => r'选择分钟'; @override String get timePickerMinuteModeAnnouncement => r'选择分钟';
@override String get signedInLabel => r'登录';
@override String get hideAccountsLabel => r'隐藏帐户';
@override String get showAccountsLabel => r'显示帐户';
@override String get modalBarrierDismissLabel => r'关闭'; @override String get modalBarrierDismissLabel => r'关闭';
} }
......
...@@ -34,5 +34,8 @@ ...@@ -34,5 +34,8 @@
"postMeridiemAbbreviation": "م", "postMeridiemAbbreviation": "م",
"timePickerHourModeAnnouncement": "اختيار الساعات", "timePickerHourModeAnnouncement": "اختيار الساعات",
"timePickerMinuteModeAnnouncement": "اختيار الدقائق", "timePickerMinuteModeAnnouncement": "اختيار الدقائق",
"signedInLabel": "تم تسجيل الدخول",
"hideAccountsLabel": "إخفاء الحسابات",
"showAccountsLabel": "عرض الحسابات",
"modalBarrierDismissLabel": "تجاهل" "modalBarrierDismissLabel": "تجاهل"
} }
...@@ -31,5 +31,8 @@ ...@@ -31,5 +31,8 @@
"postMeridiemAbbreviation": "NACHM.", "postMeridiemAbbreviation": "NACHM.",
"timePickerHourModeAnnouncement": "Stunden auswählen", "timePickerHourModeAnnouncement": "Stunden auswählen",
"timePickerMinuteModeAnnouncement": "Minuten auswählen", "timePickerMinuteModeAnnouncement": "Minuten auswählen",
"signedInLabel": "Angemeldet",
"hideAccountsLabel": "Konten ausblenden",
"showAccountsLabel": "Konten anzeigen",
"modalBarrierDismissLabel": "Schließen" "modalBarrierDismissLabel": "Schließen"
} }
...@@ -158,5 +158,20 @@ ...@@ -158,5 +158,20 @@
"modalBarrierDismissLabel": "Dismiss", "modalBarrierDismissLabel": "Dismiss",
"@modalBarrierDismissLabel": { "@modalBarrierDismissLabel": {
"description": "Label read out by accessibility tools (TalkBack or VocieOver) for a modal barrier to indicate that a tap dismisses the barrier. A modal barrier can for example be found behind a alert or popup to block user interaction with elements behind it." "description": "Label read out by accessibility tools (TalkBack or VocieOver) for a modal barrier to indicate that a tap dismisses the barrier. A modal barrier can for example be found behind a alert or popup to block user interaction with elements behind it."
},
"signedInLabel": "Signed in",
"@signedInLabel": {
"description": "The semantics label used to indicate which account is signed in in UserAccountsDrawerHeader when an accessibility user navigates the UI."
},
"hideAccountsLabel": "Hide accounts",
"@hideAccountsLabel": {
"description": "The semantics label used for the button on UserAccountsDrawerHeader that hides the list of accounts."
},
"showAccountsLabel": "Show accounts",
"@showAccountsLabel": {
"description": "The semantics label used for the button on UserAccountsDrawerHeader that shows the list of accounts."
} }
} }
...@@ -31,5 +31,8 @@ ...@@ -31,5 +31,8 @@
"postMeridiemAbbreviation": "P.M.", "postMeridiemAbbreviation": "P.M.",
"timePickerHourModeAnnouncement": "Seleccionar horas", "timePickerHourModeAnnouncement": "Seleccionar horas",
"timePickerMinuteModeAnnouncement": "Seleccionar minutos", "timePickerMinuteModeAnnouncement": "Seleccionar minutos",
"signedInLabel": "Registrado",
"hideAccountsLabel": "Ocultar cuentas",
"showAccountsLabel": "Mostrar cuentas",
"modalBarrierDismissLabel": "Ignorar" "modalBarrierDismissLabel": "Ignorar"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "ب.ظ.", "postMeridiemAbbreviation": "ب.ظ.",
"timePickerHourModeAnnouncement": "انتخاب ساعت", "timePickerHourModeAnnouncement": "انتخاب ساعت",
"timePickerMinuteModeAnnouncement": "انتخاب دقیقه", "timePickerMinuteModeAnnouncement": "انتخاب دقیقه",
"signedInLabel": "وارد شدن",
"hideAccountsLabel": "پنهان کردن حساب ها",
"showAccountsLabel": "نمایش حساب ها",
"modalBarrierDismissLabel": "رد کردن" "modalBarrierDismissLabel": "رد کردن"
} }
...@@ -31,5 +31,8 @@ ...@@ -31,5 +31,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "Sélectionner une heure", "timePickerHourModeAnnouncement": "Sélectionner une heure",
"timePickerMinuteModeAnnouncement": "Sélectionner des minutes", "timePickerMinuteModeAnnouncement": "Sélectionner des minutes",
"signedInLabel": "Connecté",
"hideAccountsLabel": "Masquer les comptes",
"showAccountsLabel": "Afficher les comptes",
"modalBarrierDismissLabel": "Ignorer" "modalBarrierDismissLabel": "Ignorer"
} }
...@@ -32,5 +32,8 @@ ...@@ -32,5 +32,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "בחירת שעות", "timePickerHourModeAnnouncement": "בחירת שעות",
"timePickerMinuteModeAnnouncement": "בחירת דקות", "timePickerMinuteModeAnnouncement": "בחירת דקות",
"signedInLabel": "מחובר",
"hideAccountsLabel": "הסתר חשבונות",
"showAccountsLabel": "הצג חשבונות",
"modalBarrierDismissLabel": "סגירה" "modalBarrierDismissLabel": "סגירה"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "Seleziona le ore", "timePickerHourModeAnnouncement": "Seleziona le ore",
"timePickerMinuteModeAnnouncement": "Seleziona i minuti", "timePickerMinuteModeAnnouncement": "Seleziona i minuti",
"signedInLabel": "Registrato",
"hideAccountsLabel": "Nascondi account",
"showAccountsLabel": "Mostra account",
"modalBarrierDismissLabel": "Ignora" "modalBarrierDismissLabel": "Ignora"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "時間を選択", "timePickerHourModeAnnouncement": "時間を選択",
"timePickerMinuteModeAnnouncement": "分を選択", "timePickerMinuteModeAnnouncement": "分を選択",
"signedInLabel": "ログイン中",
"hideAccountsLabel": "アカウントを隠す",
"showAccountsLabel": "アカウントを表示する",
"modalBarrierDismissLabel": "閉じる" "modalBarrierDismissLabel": "閉じる"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "오후", "postMeridiemAbbreviation": "오후",
"timePickerHourModeAnnouncement": "시간 선택", "timePickerHourModeAnnouncement": "시간 선택",
"timePickerMinuteModeAnnouncement": "분 선택", "timePickerMinuteModeAnnouncement": "분 선택",
"signedInLabel": "로그인 함",
"hideAccountsLabel": "계정 숨기기",
"showAccountsLabel": "계정 표시",
"modalBarrierDismissLabel": "버리다" "modalBarrierDismissLabel": "버리다"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "pm", "postMeridiemAbbreviation": "pm",
"timePickerHourModeAnnouncement": "Uren selecteren", "timePickerHourModeAnnouncement": "Uren selecteren",
"timePickerMinuteModeAnnouncement": "Minuten selecteren", "timePickerMinuteModeAnnouncement": "Minuten selecteren",
"signedInLabel": "Ingelogd",
"hideAccountsLabel": "Verberg accounts",
"showAccountsLabel": "Toon accounts",
"modalBarrierDismissLabel": "ontslaan" "modalBarrierDismissLabel": "ontslaan"
} }
...@@ -32,5 +32,8 @@ ...@@ -32,5 +32,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "Wybierz godziny", "timePickerHourModeAnnouncement": "Wybierz godziny",
"timePickerMinuteModeAnnouncement": "Wybierz minuty", "timePickerMinuteModeAnnouncement": "Wybierz minuty",
"signedInLabel": "Zapisany",
"hideAccountsLabel": "Ukryj konta",
"showAccountsLabel": "Pokaż konta",
"modalBarrierDismissLabel": "oddalić" "modalBarrierDismissLabel": "oddalić"
} }
...@@ -29,5 +29,8 @@ ...@@ -29,5 +29,8 @@
"viewLicensesButtonLabel": "لیدلس وګورئ", "viewLicensesButtonLabel": "لیدلس وګورئ",
"timePickerHourModeAnnouncement": "وختونه وټاکئ", "timePickerHourModeAnnouncement": "وختونه وټاکئ",
"timePickerMinuteModeAnnouncement": "منې غوره کړئ", "timePickerMinuteModeAnnouncement": "منې غوره کړئ",
"signedInLabel": "ننوتل",
"hideAccountsLabel": "حسابونه پټ کړئ",
"showAccountsLabel": "حسابونه ښکاره کړئ",
"modalBarrierDismissLabel": "رد کړه" "modalBarrierDismissLabel": "رد کړه"
} }
...@@ -32,5 +32,8 @@ ...@@ -32,5 +32,8 @@
"viewLicensesButtonLabel": "VER LICENÇAS", "viewLicensesButtonLabel": "VER LICENÇAS",
"timePickerHourModeAnnouncement": "Selecione as horas", "timePickerHourModeAnnouncement": "Selecione as horas",
"timePickerMinuteModeAnnouncement": "Selecione os minutos", "timePickerMinuteModeAnnouncement": "Selecione os minutos",
"signedInLabel": "Assinado",
"hideAccountsLabel": "Ocultar contas",
"showAccountsLabel": "Mostrar contas",
"modalBarrierDismissLabel": "Dispensar" "modalBarrierDismissLabel": "Dispensar"
} }
...@@ -33,5 +33,8 @@ ...@@ -33,5 +33,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "Выберите часы", "timePickerHourModeAnnouncement": "Выберите часы",
"timePickerMinuteModeAnnouncement": "Выберите минуты", "timePickerMinuteModeAnnouncement": "Выберите минуты",
"signedInLabel": "Залогинен",
"hideAccountsLabel": "Спрятать аккаунты",
"showAccountsLabel": "Показать аккаунты",
"modalBarrierDismissLabel": "Закрыть" "modalBarrierDismissLabel": "Закрыть"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "เลือกชั่วโมง", "timePickerHourModeAnnouncement": "เลือกชั่วโมง",
"timePickerMinuteModeAnnouncement": "เลือกนาที", "timePickerMinuteModeAnnouncement": "เลือกนาที",
"signedInLabel": "ลงทะเบียนเข้า",
"hideAccountsLabel": "ซ่อนบัญชี",
"showAccountsLabel": "แสดงบัญชี",
"modalBarrierDismissLabel": "ยกเลิก" "modalBarrierDismissLabel": "ยกเลิก"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "ÖS", "postMeridiemAbbreviation": "ÖS",
"timePickerHourModeAnnouncement": "Saati seçin", "timePickerHourModeAnnouncement": "Saati seçin",
"timePickerMinuteModeAnnouncement": "Dakikayı seçin", "timePickerMinuteModeAnnouncement": "Dakikayı seçin",
"signedInLabel": "Yetkili",
"hideAccountsLabel": "Hesapları gizle",
"showAccountsLabel": "Hesapları göster",
"modalBarrierDismissLabel": "Reddet" "modalBarrierDismissLabel": "Reddet"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "گھنٹے منتخب کریں", "timePickerHourModeAnnouncement": "گھنٹے منتخب کریں",
"timePickerMinuteModeAnnouncement": "منٹ منتخب کریں", "timePickerMinuteModeAnnouncement": "منٹ منتخب کریں",
"signedInLabel": "سائن ان",
"hideAccountsLabel": "اکاؤنٹس چھپائیں",
"showAccountsLabel": "اکاؤنٹس دکھائیں",
"modalBarrierDismissLabel": "برطرف" "modalBarrierDismissLabel": "برطرف"
} }
...@@ -30,5 +30,8 @@ ...@@ -30,5 +30,8 @@
"postMeridiemAbbreviation": "下午", "postMeridiemAbbreviation": "下午",
"timePickerHourModeAnnouncement": "选择小时", "timePickerHourModeAnnouncement": "选择小时",
"timePickerMinuteModeAnnouncement": "选择分钟", "timePickerMinuteModeAnnouncement": "选择分钟",
"signedInLabel": "登录",
"hideAccountsLabel": "隐藏帐户",
"showAccountsLabel": "显示帐户",
"modalBarrierDismissLabel": "关闭" "modalBarrierDismissLabel": "关闭"
} }
...@@ -334,6 +334,15 @@ class GlobalMaterialLocalizations implements MaterialLocalizations { ...@@ -334,6 +334,15 @@ class GlobalMaterialLocalizations implements MaterialLocalizations {
@override @override
String get modalBarrierDismissLabel => _translationBundle.modalBarrierDismissLabel; String get modalBarrierDismissLabel => _translationBundle.modalBarrierDismissLabel;
@override
String get signedInLabel => _translationBundle.signedInLabel;
@override
String get hideAccountsLabel => _translationBundle.hideAccountsLabel;
@override
String get showAccountsLabel => _translationBundle.showAccountsLabel;
/// The [TimeOfDayFormat] corresponding to one of the following supported /// The [TimeOfDayFormat] corresponding to one of the following supported
/// patterns: /// patterns:
/// ///
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment