Unverified Commit f9cf5a1f authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Add a11y label to modal barrier (#13543)

parent 6299dbad
...@@ -115,6 +115,9 @@ class CupertinoPageRoute<T> extends PageRoute<T> { ...@@ -115,6 +115,9 @@ class CupertinoPageRoute<T> extends PageRoute<T> {
@override @override
Color get barrierColor => null; Color get barrierColor => null;
@override
String get barrierLabel => null;
@override @override
bool canTransitionFrom(TransitionRoute<dynamic> previousRoute) { bool canTransitionFrom(TransitionRoute<dynamic> previousRoute) {
return previousRoute is CupertinoPageRoute; return previousRoute is CupertinoPageRoute;
......
...@@ -9,6 +9,7 @@ import 'package:flutter/widgets.dart'; ...@@ -9,6 +9,7 @@ import 'package:flutter/widgets.dart';
import 'colors.dart'; import 'colors.dart';
import 'material.dart'; import 'material.dart';
import 'material_localizations.dart';
import 'scaffold.dart'; import 'scaffold.dart';
import 'theme.dart'; import 'theme.dart';
...@@ -209,6 +210,7 @@ class _ModalBottomSheetRoute<T> extends PopupRoute<T> { ...@@ -209,6 +210,7 @@ class _ModalBottomSheetRoute<T> extends PopupRoute<T> {
_ModalBottomSheetRoute({ _ModalBottomSheetRoute({
this.builder, this.builder,
this.theme, this.theme,
this.barrierLabel,
}); });
final WidgetBuilder builder; final WidgetBuilder builder;
...@@ -220,6 +222,9 @@ class _ModalBottomSheetRoute<T> extends PopupRoute<T> { ...@@ -220,6 +222,9 @@ class _ModalBottomSheetRoute<T> extends PopupRoute<T> {
@override @override
bool get barrierDismissible => true; bool get barrierDismissible => true;
@override
final String barrierLabel;
@override @override
Color get barrierColor => Colors.black54; Color get barrierColor => Colors.black54;
...@@ -282,6 +287,7 @@ Future<T> showModalBottomSheet<T>({ ...@@ -282,6 +287,7 @@ Future<T> showModalBottomSheet<T>({
return Navigator.push(context, new _ModalBottomSheetRoute<T>( return Navigator.push(context, new _ModalBottomSheetRoute<T>(
builder: builder, builder: builder,
theme: Theme.of(context, shadowThemeOnly: true), theme: Theme.of(context, shadowThemeOnly: true),
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
)); ));
} }
......
...@@ -12,6 +12,7 @@ import 'button_bar.dart'; ...@@ -12,6 +12,7 @@ import 'button_bar.dart';
import 'colors.dart'; import 'colors.dart';
import 'ink_well.dart'; import 'ink_well.dart';
import 'material.dart'; import 'material.dart';
import 'material_localizations.dart';
import 'theme.dart'; import 'theme.dart';
// Examples can assume: // Examples can assume:
...@@ -408,6 +409,7 @@ class _DialogRoute<T> extends PopupRoute<T> { ...@@ -408,6 +409,7 @@ class _DialogRoute<T> extends PopupRoute<T> {
_DialogRoute({ _DialogRoute({
@required this.theme, @required this.theme,
bool barrierDismissible: true, bool barrierDismissible: true,
this.barrierLabel,
@required this.child, @required this.child,
}) : assert(barrierDismissible != null), }) : assert(barrierDismissible != null),
_barrierDismissible = barrierDismissible; _barrierDismissible = barrierDismissible;
...@@ -425,6 +427,9 @@ class _DialogRoute<T> extends PopupRoute<T> { ...@@ -425,6 +427,9 @@ class _DialogRoute<T> extends PopupRoute<T> {
@override @override
Color get barrierColor => Colors.black54; Color get barrierColor => Colors.black54;
@override
final String barrierLabel;
@override @override
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) { Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
return new MediaQuery.removePadding( return new MediaQuery.removePadding(
...@@ -480,5 +485,6 @@ Future<T> showDialog<T>({ ...@@ -480,5 +485,6 @@ Future<T> showDialog<T>({
child: child, child: child,
theme: Theme.of(context, shadowThemeOnly: true), theme: Theme.of(context, shadowThemeOnly: true),
barrierDismissible: barrierDismissible, barrierDismissible: barrierDismissible,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
)); ));
} }
...@@ -13,6 +13,7 @@ import 'debug.dart'; ...@@ -13,6 +13,7 @@ import 'debug.dart';
import 'icons.dart'; import 'icons.dart';
import 'ink_well.dart'; import 'ink_well.dart';
import 'material.dart'; import 'material.dart';
import 'material_localizations.dart';
import 'scrollbar.dart'; import 'scrollbar.dart';
import 'shadows.dart'; import 'shadows.dart';
import 'theme.dart'; import 'theme.dart';
...@@ -283,6 +284,7 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> { ...@@ -283,6 +284,7 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> {
this.elevation: 8, this.elevation: 8,
this.theme, this.theme,
@required this.style, @required this.style,
this.barrierLabel,
}) : assert(style != null); }) : assert(style != null);
final List<DropdownMenuItem<T>> items; final List<DropdownMenuItem<T>> items;
...@@ -303,6 +305,9 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> { ...@@ -303,6 +305,9 @@ class _DropdownRoute<T> extends PopupRoute<_DropdownRouteResult<T>> {
@override @override
Color get barrierColor => null; Color get barrierColor => null;
@override
final String barrierLabel;
@override @override
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) { Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
assert(debugCheckHasDirectionality(context)); assert(debugCheckHasDirectionality(context));
...@@ -570,6 +575,7 @@ class _DropdownButtonState<T> extends State<DropdownButton<T>> with WidgetsBindi ...@@ -570,6 +575,7 @@ class _DropdownButtonState<T> extends State<DropdownButton<T>> with WidgetsBindi
elevation: widget.elevation, elevation: widget.elevation,
theme: Theme.of(context, shadowThemeOnly: true), theme: Theme.of(context, shadowThemeOnly: true),
style: _textStyle, style: _textStyle,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
); );
Navigator.push(context, _dropdownRoute).then<Null>((_DropdownRouteResult<T> newValue) { Navigator.push(context, _dropdownRoute).then<Null>((_DropdownRouteResult<T> newValue) {
......
...@@ -29,8 +29,10 @@ import 'typography.dart'; ...@@ -29,8 +29,10 @@ import 'typography.dart';
// you must add it to every other language (all the other *.arb files in that // you must add it to every other language (all the other *.arb files in that
// same directory), including a best guess as to the translation, e.g. // same directory), including a best guess as to the translation, e.g.
// obtained by optimistic use of Google Translate // obtained by optimistic use of Google Translate
// (https://translate.google.com/). There is a README file with further // (https://translate.google.com/). After that you have to re-generate
// information in the lib/src/l10n/ directory. // lib/src/l10n/localizaions.dart by running
// `dart dev/tools/gen_localizations.dart --overwrite`. There is a README
// file with further information in the lib/src/l10n/ directory.
// //
// 5. If you are a Google employee, you should then also follow the instructions // 5. If you are a Google employee, you should then also follow the instructions
// at go/flutter-l10n. If you're not, don't worry about it. // at go/flutter-l10n. If you're not, don't worry about it.
...@@ -127,6 +129,13 @@ abstract class MaterialLocalizations { ...@@ -127,6 +129,13 @@ abstract class MaterialLocalizations {
/// [showTimePicker] is set to the minute picker mode. /// [showTimePicker] is set to the minute picker mode.
String get timePickerMinuteModeAnnouncement; String get timePickerMinuteModeAnnouncement;
/// 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.
String get modalBarrierDismissLabel;
/// The format used to lay out the time picker. /// The format used to lay out the time picker.
/// ///
/// The documentation for [TimeOfDayFormat] enum values provides details on /// The documentation for [TimeOfDayFormat] enum values provides details on
...@@ -519,6 +528,9 @@ class DefaultMaterialLocalizations implements MaterialLocalizations { ...@@ -519,6 +528,9 @@ class DefaultMaterialLocalizations implements MaterialLocalizations {
@override @override
String get timePickerMinuteModeAnnouncement => 'Select minutes'; String get timePickerMinuteModeAnnouncement => 'Select minutes';
@override
String get modalBarrierDismissLabel => 'Dismiss';
@override @override
TimeOfDayFormat timeOfDayFormat({ bool alwaysUse24HourFormat: false }) { TimeOfDayFormat timeOfDayFormat({ bool alwaysUse24HourFormat: false }) {
return alwaysUse24HourFormat return alwaysUse24HourFormat
......
...@@ -107,6 +107,9 @@ class MaterialPageRoute<T> extends PageRoute<T> { ...@@ -107,6 +107,9 @@ class MaterialPageRoute<T> extends PageRoute<T> {
@override @override
Color get barrierColor => null; Color get barrierColor => null;
@override
String get barrierLabel => null;
@override @override
bool canTransitionFrom(TransitionRoute<dynamic> previousRoute) { bool canTransitionFrom(TransitionRoute<dynamic> previousRoute) {
return (previousRoute is MaterialPageRoute || previousRoute is CupertinoPageRoute); return (previousRoute is MaterialPageRoute || previousRoute is CupertinoPageRoute);
......
...@@ -546,7 +546,8 @@ class _PopupMenuRoute<T> extends PopupRoute<T> { ...@@ -546,7 +546,8 @@ class _PopupMenuRoute<T> extends PopupRoute<T> {
this.items, this.items,
this.initialValue, this.initialValue,
this.elevation, this.elevation,
this.theme this.theme,
this.barrierLabel,
}); });
final RelativeRect position; final RelativeRect position;
...@@ -573,6 +574,9 @@ class _PopupMenuRoute<T> extends PopupRoute<T> { ...@@ -573,6 +574,9 @@ class _PopupMenuRoute<T> extends PopupRoute<T> {
@override @override
Color get barrierColor => null; Color get barrierColor => null;
@override
final String barrierLabel;
@override @override
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) { Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
double selectedItemOffset; double selectedItemOffset;
...@@ -670,6 +674,7 @@ Future<T> showMenu<T>({ ...@@ -670,6 +674,7 @@ Future<T> showMenu<T>({
initialValue: initialValue, initialValue: initialValue,
elevation: elevation, elevation: elevation,
theme: Theme.of(context, shadowThemeOnly: true), theme: Theme.of(context, shadowThemeOnly: true),
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
)); ));
} }
......
...@@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart'; ...@@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart';
import 'basic.dart'; import 'basic.dart';
import 'container.dart'; import 'container.dart';
import 'debug.dart';
import 'framework.dart'; import 'framework.dart';
import 'gesture_detector.dart'; import 'gesture_detector.dart';
import 'navigator.dart'; import 'navigator.dart';
...@@ -30,7 +31,8 @@ class ModalBarrier extends StatelessWidget { ...@@ -30,7 +31,8 @@ class ModalBarrier extends StatelessWidget {
const ModalBarrier({ const ModalBarrier({
Key key, Key key,
this.color, this.color,
this.dismissible: true this.dismissible: true,
this.semanticsLabel,
}) : super(key: key); }) : super(key: key);
/// If non-null, fill the barrier with this color. /// If non-null, fill the barrier with this color.
...@@ -49,20 +51,34 @@ class ModalBarrier extends StatelessWidget { ...@@ -49,20 +51,34 @@ class ModalBarrier extends StatelessWidget {
/// [ModalBarrier] built by [ModalRoute] pages. /// [ModalBarrier] built by [ModalRoute] pages.
final bool dismissible; final bool dismissible;
/// Semantics label used for the barrier if it is [dismissable].
///
/// The semantics label is read out by accessibility tools (e.g. TalkBack
/// on Android and VoiceOver on iOS) when the barrier is focused.
///
/// See also:
///
/// * [ModalRoute.barrierLabel], which controls this property for the
/// [ModalBarrier] built by [ModalRoute] pages.
final String semanticsLabel;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
assert(!dismissible || semanticsLabel == null || debugCheckHasDirectionality(context));
final bool semanticsDismissable = dismissible && defaultTargetPlatform != TargetPlatform.android;
return new BlockSemantics( return new BlockSemantics(
child: new ExcludeSemantics( child: new ExcludeSemantics(
// On Android, the back button is used to dismiss a modal. // On Android, the back button is used to dismiss a modal.
excluding: !dismissible || defaultTargetPlatform == TargetPlatform.android, excluding: !semanticsDismissable,
child: new Semantics( child: new GestureDetector(
container: true, onTapDown: (TapDownDetails details) {
child: new GestureDetector( if (dismissible)
onTapDown: (TapDownDetails details) { Navigator.pop(context);
if (dismissible) },
Navigator.pop(context); behavior: HitTestBehavior.opaque,
}, child: new Semantics(
behavior: HitTestBehavior.opaque, label: semanticsDismissable ? semanticsLabel : null,
textDirection: semanticsDismissable && semanticsLabel != null ? Directionality.of(context) : null,
child: new ConstrainedBox( child: new ConstrainedBox(
constraints: const BoxConstraints.expand(), constraints: const BoxConstraints.expand(),
child: color == null ? null : new DecoratedBox( child: color == null ? null : new DecoratedBox(
...@@ -99,7 +115,8 @@ class AnimatedModalBarrier extends AnimatedWidget { ...@@ -99,7 +115,8 @@ class AnimatedModalBarrier extends AnimatedWidget {
const AnimatedModalBarrier({ const AnimatedModalBarrier({
Key key, Key key,
Animation<Color> color, Animation<Color> color,
this.dismissible: true this.dismissible: true,
this.semanticsLabel,
}) : super(key: key, listenable: color); }) : super(key: key, listenable: color);
/// If non-null, fill the barrier with this color. /// If non-null, fill the barrier with this color.
...@@ -118,11 +135,22 @@ class AnimatedModalBarrier extends AnimatedWidget { ...@@ -118,11 +135,22 @@ class AnimatedModalBarrier extends AnimatedWidget {
/// [AnimatedModalBarrier] built by [ModalRoute] pages. /// [AnimatedModalBarrier] built by [ModalRoute] pages.
final bool dismissible; final bool dismissible;
/// Semantics label used for the barrier if it is [dismissable].
///
/// The semantics label is read out by accessibility tools (e.g. TalkBack
/// on Android and VoiceOver on iOS) when the barrier is focused.
/// See also:
///
/// * [ModalRoute.barrierLabel], which controls this property for the
/// [ModalBarrier] built by [ModalRoute] pages.
final String semanticsLabel;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new ModalBarrier( return new ModalBarrier(
color: color?.value, color: color?.value,
dismissible: dismissible, dismissible: dismissible,
semanticsLabel: semanticsLabel,
); );
} }
} }
...@@ -78,6 +78,7 @@ class PageRouteBuilder<T> extends PageRoute<T> { ...@@ -78,6 +78,7 @@ class PageRouteBuilder<T> extends PageRoute<T> {
this.opaque: true, this.opaque: true,
this.barrierDismissible: false, this.barrierDismissible: false,
this.barrierColor, this.barrierColor,
this.barrierLabel,
this.maintainState: true, this.maintainState: true,
}) : assert(pageBuilder != null), }) : assert(pageBuilder != null),
assert(transitionsBuilder != null), assert(transitionsBuilder != null),
...@@ -108,6 +109,9 @@ class PageRouteBuilder<T> extends PageRoute<T> { ...@@ -108,6 +109,9 @@ class PageRouteBuilder<T> extends PageRoute<T> {
@override @override
final Color barrierColor; final Color barrierColor;
@override
final String barrierLabel;
@override @override
final bool maintainState; final bool maintainState;
......
...@@ -778,6 +778,25 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T ...@@ -778,6 +778,25 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T
/// * [ModalBarrier], the widget that implements this feature. /// * [ModalBarrier], the widget that implements this feature.
Color get barrierColor; Color get barrierColor;
/// The semantic label used for a dismissible barrier.
///
/// If the barrier is dismissible, this label will be read out if
/// accessibility tools (like VoiceOver on iOS) focus on the barrier.
///
/// The modal barrier is the scrim that is rendered behind each route, which
/// generally prevents the user from interacting with the route below the
/// current route, and normally partially obscures such routes.
///
/// For example, when a dialog is on the screen, the page below the dialog is
/// usually darkened by the modal barrier.
///
/// See also:
///
/// * [barrierDismissible], which controls the behavior of the barrier when
/// tapped.
/// * [ModalBarrier], the widget that implements this feature.
String get barrierLabel;
/// Whether the route should remain in memory when it is inactive. If this is /// Whether the route should remain in memory when it is inactive. If this is
/// true, then the route is maintained, so that any futures it is holding from /// true, then the route is maintained, so that any futures it is holding from
/// the next route will properly resolve when the next route pops. If this is /// the next route will properly resolve when the next route pops. If this is
...@@ -984,10 +1003,14 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T ...@@ -984,10 +1003,14 @@ abstract class ModalRoute<T> extends TransitionRoute<T> with LocalHistoryRoute<T
)); ));
barrier = new AnimatedModalBarrier( barrier = new AnimatedModalBarrier(
color: color, color: color,
dismissible: barrierDismissible dismissible: barrierDismissible,
semanticsLabel: barrierLabel,
); );
} else { } else {
barrier = new ModalBarrier(dismissible: barrierDismissible); barrier = new ModalBarrier(
dismissible: barrierDismissible,
semanticsLabel: barrierLabel,
);
} }
assert(animation.status != AnimationStatus.dismissed); assert(animation.status != AnimationStatus.dismissed);
return new IgnorePointer( return new IgnorePointer(
......
...@@ -234,9 +234,13 @@ void main() { ...@@ -234,9 +234,13 @@ void main() {
BuildContext outerContext; BuildContext outerContext;
BuildContext dialogContext; BuildContext dialogContext;
await tester.pumpWidget(new Directionality( await tester.pumpWidget(new Localizations(
textDirection: TextDirection.ltr, locale: const Locale('en', 'US'),
child: new MediaQuery( delegates: <LocalizationsDelegate<dynamic>>[
DefaultWidgetsLocalizations.delegate,
DefaultMaterialLocalizations.delegate,
],
child: new MediaQuery(
data: const MediaQueryData( data: const MediaQueryData(
padding: const EdgeInsets.all(50.0), padding: const EdgeInsets.all(50.0),
), ),
......
...@@ -63,18 +63,25 @@ class TestApp extends StatefulWidget { ...@@ -63,18 +63,25 @@ class TestApp extends StatefulWidget {
class _TestAppState extends State<TestApp> { class _TestAppState extends State<TestApp> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new MediaQuery( return new Localizations(
data: new MediaQueryData.fromWindow(window), locale: const Locale('en', 'US'),
child: new Directionality( delegates: <LocalizationsDelegate<dynamic>>[
textDirection: widget.textDirection, DefaultWidgetsLocalizations.delegate,
child: new Navigator( DefaultMaterialLocalizations.delegate,
onGenerateRoute: (RouteSettings settings) { ],
assert(settings.name == '/'); child: new MediaQuery(
return new MaterialPageRoute<dynamic>( data: new MediaQueryData.fromWindow(window),
settings: settings, child: new Directionality(
builder: (BuildContext context) => widget.child, textDirection: widget.textDirection,
); child: new Navigator(
}, onGenerateRoute: (RouteSettings settings) {
assert(settings.name == '/');
return new MaterialPageRoute<dynamic>(
settings: settings,
builder: (BuildContext context) => widget.child,
);
},
),
), ),
), ),
); );
......
...@@ -29,6 +29,7 @@ void main() { ...@@ -29,6 +29,7 @@ void main() {
expect(localizations.pasteButtonLabel, isNotNull); expect(localizations.pasteButtonLabel, isNotNull);
expect(localizations.selectAllButtonLabel, isNotNull); expect(localizations.selectAllButtonLabel, isNotNull);
expect(localizations.viewLicensesButtonLabel, isNotNull); expect(localizations.viewLicensesButtonLabel, isNotNull);
expect(localizations.modalBarrierDismissLabel, isNotNull);
expect(localizations.aboutListTileTitle('FOO'), isNotNull); expect(localizations.aboutListTileTitle('FOO'), isNotNull);
expect(localizations.aboutListTileTitle('FOO'), contains('FOO')); expect(localizations.aboutListTileTitle('FOO'), contains('FOO'));
......
...@@ -158,21 +158,28 @@ void main() { ...@@ -158,21 +158,28 @@ void main() {
BuildContext outerContext; BuildContext outerContext;
BuildContext innerContext; BuildContext innerContext;
await tester.pumpWidget(new Directionality( await tester.pumpWidget(new Localizations(
textDirection: TextDirection.ltr, locale: const Locale('en', 'US'),
child: new MediaQuery( delegates: <LocalizationsDelegate<dynamic>>[
data: const MediaQueryData( DefaultWidgetsLocalizations.delegate,
padding: const EdgeInsets.all(50.0), DefaultMaterialLocalizations.delegate,
), ],
child: new Navigator( child: new Directionality(
onGenerateRoute: (_) { textDirection: TextDirection.ltr,
return new PageRouteBuilder<Null>( child: new MediaQuery(
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) { data: const MediaQueryData(
outerContext = context; padding: const EdgeInsets.all(50.0),
return new Container(); ),
}, child: new Navigator(
); onGenerateRoute: (_) {
}, return new PageRouteBuilder<Null>(
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
outerContext = context;
return new Container();
},
);
},
),
), ),
), ),
)); ));
......
...@@ -369,20 +369,27 @@ class TestApp extends StatefulWidget { ...@@ -369,20 +369,27 @@ class TestApp extends StatefulWidget {
class _TestAppState extends State<TestApp> { class _TestAppState extends State<TestApp> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new MediaQuery( return new Localizations(
data: new MediaQueryData.fromWindow(window), locale: const Locale('en', 'US'),
child: new Directionality( delegates: <LocalizationsDelegate<dynamic>>[
textDirection: widget.textDirection, DefaultWidgetsLocalizations.delegate,
child: new Navigator( DefaultMaterialLocalizations.delegate,
onGenerateRoute: (RouteSettings settings) { ],
assert(settings.name == '/'); child: new MediaQuery(
return new MaterialPageRoute<dynamic>( data: new MediaQueryData.fromWindow(window),
settings: settings, child: new Directionality(
builder: (BuildContext context) => new Material( textDirection: widget.textDirection,
child: widget.child, child: new Navigator(
), onGenerateRoute: (RouteSettings settings) {
); assert(settings.name == '/');
}, return new MaterialPageRoute<dynamic>(
settings: settings,
builder: (BuildContext context) => new Material(
child: widget.child,
),
);
},
),
), ),
), ),
); );
......
...@@ -16,6 +16,9 @@ class TestRoute<T> extends PageRoute<T> { ...@@ -16,6 +16,9 @@ class TestRoute<T> extends PageRoute<T> {
@override @override
Color get barrierColor => null; Color get barrierColor => null;
@override
String get barrierLabel => null;
@override @override
bool get maintainState => false; bool get maintainState => false;
......
...@@ -99,20 +99,22 @@ void main() { ...@@ -99,20 +99,22 @@ void main() {
debugDefaultTargetPlatformOverride = TargetPlatform.iOS; debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
final SemanticsTester semantics = new SemanticsTester(tester); final SemanticsTester semantics = new SemanticsTester(tester);
await tester.pumpWidget(const ModalBarrier(dismissible: true)); await tester.pumpWidget(const Directionality(
textDirection: TextDirection.ltr,
child: const ModalBarrier(
dismissible: true,
semanticsLabel: 'Dismiss',
),
));
final TestSemantics expectedSemantics = new TestSemantics.root( final TestSemantics expectedSemantics = new TestSemantics.root(
children: <TestSemantics>[ children: <TestSemantics>[
new TestSemantics.rootChild( new TestSemantics.rootChild(
id: 3, id: 2,
rect: TestSemantics.fullScreen, rect: TestSemantics.fullScreen,
children: <TestSemantics>[ actions: SemanticsAction.tap.index,
new TestSemantics( label: 'Dismiss',
id: 4, textDirection: TextDirection.ltr,
rect: TestSemantics.fullScreen,
actions: SemanticsAction.tap.index,
),
]
), ),
] ]
); );
......
...@@ -37,6 +37,9 @@ class TestRoute<T> extends PageRoute<T> { ...@@ -37,6 +37,9 @@ class TestRoute<T> extends PageRoute<T> {
@override @override
final Color barrierColor; final Color barrierColor;
@override
String get barrierLabel => null;
@override @override
bool get maintainState => false; bool get maintainState => false;
......
...@@ -47,6 +47,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -47,6 +47,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'م', 'postMeridiemAbbreviation': r'م',
'timePickerHourModeAnnouncement': r'حدد ساعات', 'timePickerHourModeAnnouncement': r'حدد ساعات',
'timePickerMinuteModeAnnouncement': r'حدد دقائق', 'timePickerMinuteModeAnnouncement': r'حدد دقائق',
'modalBarrierDismissLabel': r'تجاهل',
}, },
'de': const <String, String>{ 'de': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -81,6 +82,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -81,6 +82,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'NACHM.', 'postMeridiemAbbreviation': r'NACHM.',
'timePickerHourModeAnnouncement': r'Stunde auswählen', 'timePickerHourModeAnnouncement': r'Stunde auswählen',
'timePickerMinuteModeAnnouncement': r'Minute auswählen', 'timePickerMinuteModeAnnouncement': r'Minute auswählen',
'modalBarrierDismissLabel': r'Schließen',
}, },
'de_CH': const <String, String>{ 'de_CH': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -102,7 +104,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -102,7 +104,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'selectedRowCountTitleOne': r'1 Element ausgewählt', 'selectedRowCountTitleOne': r'1 Element ausgewählt',
'selectedRowCountTitleOther': r'$selectedRowCount Elemente ausgewählt', 'selectedRowCountTitleOther': r'$selectedRowCount Elemente ausgewählt',
'cancelButtonLabel': r'ABBRECHEN', 'cancelButtonLabel': r'ABBRECHEN',
'closeButtonLabel': r'SCHLIEEN', 'closeButtonLabel': r'SCHLIESSEN',
'continueButtonLabel': r'WEITER', 'continueButtonLabel': r'WEITER',
'copyButtonLabel': r'KOPIEREN', 'copyButtonLabel': r'KOPIEREN',
'cutButtonLabel': r'AUSSCHNEIDEN', 'cutButtonLabel': r'AUSSCHNEIDEN',
...@@ -112,6 +114,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -112,6 +114,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'LIZENZEN ANZEIGEN', 'viewLicensesButtonLabel': r'LIZENZEN ANZEIGEN',
'anteMeridiemAbbreviation': r'VORM.', 'anteMeridiemAbbreviation': r'VORM.',
'postMeridiemAbbreviation': r'NACHM.', 'postMeridiemAbbreviation': r'NACHM.',
'modalBarrierDismissLabel': r'Schliessen',
}, },
'en': const <String, String>{ 'en': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -146,6 +149,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -146,6 +149,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'timePickerHourModeAnnouncement': r'Select hours', 'timePickerHourModeAnnouncement': r'Select hours',
'timePickerMinuteModeAnnouncement': r'Select minutes', 'timePickerMinuteModeAnnouncement': r'Select minutes',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'en_AU': const <String, String>{ 'en_AU': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -177,6 +181,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -177,6 +181,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'VIEW LICENCES', 'viewLicensesButtonLabel': r'VIEW LICENCES',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'en_CA': const <String, String>{ 'en_CA': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -208,6 +213,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -208,6 +213,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'VIEW LICENCES', 'viewLicensesButtonLabel': r'VIEW LICENCES',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'en_GB': const <String, String>{ 'en_GB': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -239,6 +245,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -239,6 +245,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'showMenuTooltip': r'Show menu', 'showMenuTooltip': r'Show menu',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'en_IE': const <String, String>{ 'en_IE': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -270,6 +277,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -270,6 +277,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'showMenuTooltip': r'Show menu', 'showMenuTooltip': r'Show menu',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'en_IN': const <String, String>{ 'en_IN': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -301,6 +309,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -301,6 +309,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'VIEW LICENCES', 'viewLicensesButtonLabel': r'VIEW LICENCES',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'en_SG': const <String, String>{ 'en_SG': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -332,6 +341,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -332,6 +341,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'VIEW LICENCES', 'viewLicensesButtonLabel': r'VIEW LICENCES',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'en_ZA': const <String, String>{ 'en_ZA': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -363,6 +373,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -363,6 +373,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'showMenuTooltip': r'Show menu', 'showMenuTooltip': r'Show menu',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Dismiss',
}, },
'es': const <String, String>{ 'es': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -397,6 +408,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -397,6 +408,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'P.M.', 'postMeridiemAbbreviation': r'P.M.',
'timePickerHourModeAnnouncement': r'Seleccione Horas', 'timePickerHourModeAnnouncement': r'Seleccione Horas',
'timePickerMinuteModeAnnouncement': r'Seleccione Minutos', 'timePickerMinuteModeAnnouncement': r'Seleccione Minutos',
'modalBarrierDismissLabel': r'Ignorar',
}, },
'es_US': const <String, String>{ 'es_US': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -436,6 +448,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -436,6 +448,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'ب.ظ.', 'postMeridiemAbbreviation': r'ب.ظ.',
'timePickerHourModeAnnouncement': r'ساعت ها را انتخاب کنید', 'timePickerHourModeAnnouncement': r'ساعت ها را انتخاب کنید',
'timePickerMinuteModeAnnouncement': r'دقیقه را انتخاب کنید', 'timePickerMinuteModeAnnouncement': r'دقیقه را انتخاب کنید',
'modalBarrierDismissLabel': r'رد کردن',
}, },
'fr': const <String, String>{ 'fr': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -470,6 +483,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -470,6 +483,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'timePickerHourModeAnnouncement': r'Sélectionnez les heures', 'timePickerHourModeAnnouncement': r'Sélectionnez les heures',
'timePickerMinuteModeAnnouncement': r'Sélectionnez les minutes', 'timePickerMinuteModeAnnouncement': r'Sélectionnez les minutes',
'modalBarrierDismissLabel': r'Ignorer',
}, },
'fr_CA': const <String, String>{ 'fr_CA': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -505,6 +519,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -505,6 +519,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'LIZENZEN ANZEIGEN', 'viewLicensesButtonLabel': r'LIZENZEN ANZEIGEN',
'anteMeridiemAbbreviation': r'VORM.', 'anteMeridiemAbbreviation': r'VORM.',
'postMeridiemAbbreviation': r'NACHM.', 'postMeridiemAbbreviation': r'NACHM.',
'modalBarrierDismissLabel': r'Schließen',
}, },
'he': const <String, String>{ 'he': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -540,6 +555,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -540,6 +555,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'timePickerHourModeAnnouncement': r'בחר שעות', 'timePickerHourModeAnnouncement': r'בחר שעות',
'timePickerMinuteModeAnnouncement': r'בחר דקות', 'timePickerMinuteModeAnnouncement': r'בחר דקות',
'modalBarrierDismissLabel': r'סגירה',
}, },
'it': const <String, String>{ 'it': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -573,6 +589,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -573,6 +589,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'timePickerHourModeAnnouncement': r'Seleziona ore', 'timePickerHourModeAnnouncement': r'Seleziona ore',
'timePickerMinuteModeAnnouncement': r'Seleziona minuti', 'timePickerMinuteModeAnnouncement': r'Seleziona minuti',
'modalBarrierDismissLabel': r'Ignora',
}, },
'ja': const <String, String>{ 'ja': const <String, String>{
'scriptCategory': r'dense', 'scriptCategory': r'dense',
...@@ -606,6 +623,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -606,6 +623,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'timePickerHourModeAnnouncement': r'時を選択', 'timePickerHourModeAnnouncement': r'時を選択',
'timePickerMinuteModeAnnouncement': r'分を選択', 'timePickerMinuteModeAnnouncement': r'分を選択',
'modalBarrierDismissLabel': r'閉じる',
}, },
'ps': const <String, String>{ 'ps': const <String, String>{
'scriptCategory': r'tall', 'scriptCategory': r'tall',
...@@ -636,6 +654,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -636,6 +654,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'لیدلس وګورئ', 'viewLicensesButtonLabel': r'لیدلس وګورئ',
'timePickerHourModeAnnouncement': r'وختونه وټاکئ', 'timePickerHourModeAnnouncement': r'وختونه وټاکئ',
'timePickerMinuteModeAnnouncement': r'منې غوره کړئ', 'timePickerMinuteModeAnnouncement': r'منې غوره کړئ',
'modalBarrierDismissLabel': r'رد کړه',
}, },
'pt': const <String, String>{ 'pt': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -666,6 +685,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -666,6 +685,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'VER LICENÇAS', 'viewLicensesButtonLabel': r'VER LICENÇAS',
'timePickerHourModeAnnouncement': r'Selecione horários', 'timePickerHourModeAnnouncement': r'Selecione horários',
'timePickerMinuteModeAnnouncement': r'Selecione Minutos', 'timePickerMinuteModeAnnouncement': r'Selecione Minutos',
'modalBarrierDismissLabel': r'Dispensar',
}, },
'pt_PT': const <String, String>{ 'pt_PT': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -697,6 +717,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -697,6 +717,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'viewLicensesButtonLabel': r'VER LICENÇAS', 'viewLicensesButtonLabel': r'VER LICENÇAS',
'anteMeridiemAbbreviation': r'AM', 'anteMeridiemAbbreviation': r'AM',
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'modalBarrierDismissLabel': r'Ignorar',
}, },
'ru': const <String, String>{ 'ru': const <String, String>{
'scriptCategory': r'English-like', 'scriptCategory': r'English-like',
...@@ -733,6 +754,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -733,6 +754,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'timePickerHourModeAnnouncement': r'ВЫБРАТЬ ЧАСЫ', 'timePickerHourModeAnnouncement': r'ВЫБРАТЬ ЧАСЫ',
'timePickerMinuteModeAnnouncement': r'ВЫБРАТЬ МИНУТЫ', 'timePickerMinuteModeAnnouncement': r'ВЫБРАТЬ МИНУТЫ',
'modalBarrierDismissLabel': r'Закрыть',
}, },
'ur': const <String, String>{ 'ur': const <String, String>{
'scriptCategory': r'tall', 'scriptCategory': r'tall',
...@@ -766,6 +788,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -766,6 +788,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'PM', 'postMeridiemAbbreviation': r'PM',
'timePickerHourModeAnnouncement': r'گھنٹے منتخب کریں', 'timePickerHourModeAnnouncement': r'گھنٹے منتخب کریں',
'timePickerMinuteModeAnnouncement': r'منٹ منتخب کریں', 'timePickerMinuteModeAnnouncement': r'منٹ منتخب کریں',
'modalBarrierDismissLabel': r'برطرف',
}, },
'zh': const <String, String>{ 'zh': const <String, String>{
'scriptCategory': r'dense', 'scriptCategory': r'dense',
...@@ -799,6 +822,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String ...@@ -799,6 +822,7 @@ const Map<String, Map<String, String>> localizations = const <String, Map<String
'postMeridiemAbbreviation': r'下午', 'postMeridiemAbbreviation': r'下午',
'timePickerHourModeAnnouncement': r'选择小时', 'timePickerHourModeAnnouncement': r'选择小时',
'timePickerMinuteModeAnnouncement': r'选择分钟', 'timePickerMinuteModeAnnouncement': r'选择分钟',
'modalBarrierDismissLabel': r'关闭',
}, },
}; };
...@@ -33,5 +33,6 @@ ...@@ -33,5 +33,6 @@
"anteMeridiemAbbreviation": "ص", "anteMeridiemAbbreviation": "ص",
"postMeridiemAbbreviation": "م", "postMeridiemAbbreviation": "م",
"timePickerHourModeAnnouncement": "حدد ساعات", "timePickerHourModeAnnouncement": "حدد ساعات",
"timePickerMinuteModeAnnouncement": "حدد دقائق" "timePickerMinuteModeAnnouncement": "حدد دقائق",
"modalBarrierDismissLabel": "تجاهل"
} }
...@@ -30,5 +30,6 @@ ...@@ -30,5 +30,6 @@
"anteMeridiemAbbreviation": "VORM.", "anteMeridiemAbbreviation": "VORM.",
"postMeridiemAbbreviation": "NACHM.", "postMeridiemAbbreviation": "NACHM.",
"timePickerHourModeAnnouncement": "Stunde auswählen", "timePickerHourModeAnnouncement": "Stunde auswählen",
"timePickerMinuteModeAnnouncement": "Minute auswählen" "timePickerMinuteModeAnnouncement": "Minute auswählen",
"modalBarrierDismissLabel": "Schließen"
} }
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
"selectedRowCountTitleOne": "1 Element ausgewählt", "selectedRowCountTitleOne": "1 Element ausgewählt",
"selectedRowCountTitleOther": "$selectedRowCount Elemente ausgewählt", "selectedRowCountTitleOther": "$selectedRowCount Elemente ausgewählt",
"cancelButtonLabel": "ABBRECHEN", "cancelButtonLabel": "ABBRECHEN",
"closeButtonLabel": "SCHLIEEN", "closeButtonLabel": "SCHLIESSEN",
"continueButtonLabel": "WEITER", "continueButtonLabel": "WEITER",
"copyButtonLabel": "KOPIEREN", "copyButtonLabel": "KOPIEREN",
"cutButtonLabel": "AUSSCHNEIDEN", "cutButtonLabel": "AUSSCHNEIDEN",
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectAllButtonLabel": "ALLE AUSWÄHLEN", "selectAllButtonLabel": "ALLE AUSWÄHLEN",
"viewLicensesButtonLabel": "LIZENZEN ANZEIGEN", "viewLicensesButtonLabel": "LIZENZEN ANZEIGEN",
"anteMeridiemAbbreviation": "VORM.", "anteMeridiemAbbreviation": "VORM.",
"postMeridiemAbbreviation": "NACHM." "postMeridiemAbbreviation": "NACHM.",
"modalBarrierDismissLabel": "Schliessen"
} }
...@@ -153,5 +153,10 @@ ...@@ -153,5 +153,10 @@
"timePickerMinuteModeAnnouncement": "Select minutes", "timePickerMinuteModeAnnouncement": "Select minutes",
"@timePickerMinuteModeAnnouncement": { "@timePickerMinuteModeAnnouncement": {
"description": "The audio announcement made when the time picker dialog is set to minute mode." "description": "The audio announcement made when the time picker dialog is set to minute mode."
},
"modalBarrierDismissLabel": "Dismiss",
"@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."
} }
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectAllButtonLabel": "SELECT ALL", "selectAllButtonLabel": "SELECT ALL",
"viewLicensesButtonLabel": "VIEW LICENCES", "viewLicensesButtonLabel": "VIEW LICENCES",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Dismiss"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectAllButtonLabel": "SELECT ALL", "selectAllButtonLabel": "SELECT ALL",
"viewLicensesButtonLabel": "VIEW LICENCES", "viewLicensesButtonLabel": "VIEW LICENCES",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Dismiss"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectedRowCountTitleOther": "$selectedRowCount items selected", "selectedRowCountTitleOther": "$selectedRowCount items selected",
"showMenuTooltip": "Show menu", "showMenuTooltip": "Show menu",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Dismiss"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectedRowCountTitleOther": "$selectedRowCount items selected", "selectedRowCountTitleOther": "$selectedRowCount items selected",
"showMenuTooltip": "Show menu", "showMenuTooltip": "Show menu",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Dismiss"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectAllButtonLabel": "SELECT ALL", "selectAllButtonLabel": "SELECT ALL",
"viewLicensesButtonLabel": "VIEW LICENCES", "viewLicensesButtonLabel": "VIEW LICENCES",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Dismiss"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectAllButtonLabel": "SELECT ALL", "selectAllButtonLabel": "SELECT ALL",
"viewLicensesButtonLabel": "VIEW LICENCES", "viewLicensesButtonLabel": "VIEW LICENCES",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Dismiss"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectedRowCountTitleOther": "$selectedRowCount items selected", "selectedRowCountTitleOther": "$selectedRowCount items selected",
"showMenuTooltip": "Show menu", "showMenuTooltip": "Show menu",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Dismiss"
} }
...@@ -30,5 +30,6 @@ ...@@ -30,5 +30,6 @@
"anteMeridiemAbbreviation": "A.M.", "anteMeridiemAbbreviation": "A.M.",
"postMeridiemAbbreviation": "P.M.", "postMeridiemAbbreviation": "P.M.",
"timePickerHourModeAnnouncement": "Seleccione Horas", "timePickerHourModeAnnouncement": "Seleccione Horas",
"timePickerMinuteModeAnnouncement": "Seleccione Minutos" "timePickerMinuteModeAnnouncement": "Seleccione Minutos",
"modalBarrierDismissLabel": "Ignorar"
} }
...@@ -29,5 +29,6 @@ ...@@ -29,5 +29,6 @@
"anteMeridiemAbbreviation": "ق.ظ.", "anteMeridiemAbbreviation": "ق.ظ.",
"postMeridiemAbbreviation": "ب.ظ.", "postMeridiemAbbreviation": "ب.ظ.",
"timePickerHourModeAnnouncement": "ساعت ها را انتخاب کنید", "timePickerHourModeAnnouncement": "ساعت ها را انتخاب کنید",
"timePickerMinuteModeAnnouncement": "دقیقه را انتخاب کنید" "timePickerMinuteModeAnnouncement": "دقیقه را انتخاب کنید",
"modalBarrierDismissLabel": "رد کردن"
} }
...@@ -30,5 +30,6 @@ ...@@ -30,5 +30,6 @@
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "Sélectionnez les heures", "timePickerHourModeAnnouncement": "Sélectionnez les heures",
"timePickerMinuteModeAnnouncement": "Sélectionnez les minutes" "timePickerMinuteModeAnnouncement": "Sélectionnez les minutes",
"modalBarrierDismissLabel": "Ignorer"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectAllButtonLabel": "ALLE AUSWÄHLEN", "selectAllButtonLabel": "ALLE AUSWÄHLEN",
"viewLicensesButtonLabel": "LIZENZEN ANZEIGEN", "viewLicensesButtonLabel": "LIZENZEN ANZEIGEN",
"anteMeridiemAbbreviation": "VORM.", "anteMeridiemAbbreviation": "VORM.",
"postMeridiemAbbreviation": "NACHM." "postMeridiemAbbreviation": "NACHM.",
"modalBarrierDismissLabel": "Schließen"
} }
...@@ -31,5 +31,6 @@ ...@@ -31,5 +31,6 @@
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "בחר שעות", "timePickerHourModeAnnouncement": "בחר שעות",
"timePickerMinuteModeAnnouncement": "בחר דקות" "timePickerMinuteModeAnnouncement": "בחר דקות",
"modalBarrierDismissLabel": "סגירה"
} }
...@@ -29,5 +29,6 @@ ...@@ -29,5 +29,6 @@
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "Seleziona ore", "timePickerHourModeAnnouncement": "Seleziona ore",
"timePickerMinuteModeAnnouncement": "Seleziona minuti" "timePickerMinuteModeAnnouncement": "Seleziona minuti",
"modalBarrierDismissLabel": "Ignora"
} }
...@@ -29,5 +29,6 @@ ...@@ -29,5 +29,6 @@
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "時を選択", "timePickerHourModeAnnouncement": "時を選択",
"timePickerMinuteModeAnnouncement": "分を選択" "timePickerMinuteModeAnnouncement": "分を選択",
"modalBarrierDismissLabel": "閉じる"
} }
...@@ -28,5 +28,6 @@ ...@@ -28,5 +28,6 @@
"selectAllButtonLabel": "غوره کړئ", "selectAllButtonLabel": "غوره کړئ",
"viewLicensesButtonLabel": "لیدلس وګورئ", "viewLicensesButtonLabel": "لیدلس وګورئ",
"timePickerHourModeAnnouncement": "وختونه وټاکئ", "timePickerHourModeAnnouncement": "وختونه وټاکئ",
"timePickerMinuteModeAnnouncement": "منې غوره کړئ" "timePickerMinuteModeAnnouncement": "منې غوره کړئ",
"modalBarrierDismissLabel": "رد کړه"
} }
...@@ -28,5 +28,6 @@ ...@@ -28,5 +28,6 @@
"selectAllButtonLabel": "SELECIONAR TUDO", "selectAllButtonLabel": "SELECIONAR TUDO",
"viewLicensesButtonLabel": "VER LICENÇAS", "viewLicensesButtonLabel": "VER LICENÇAS",
"timePickerHourModeAnnouncement": "Selecione horários", "timePickerHourModeAnnouncement": "Selecione horários",
"timePickerMinuteModeAnnouncement": "Selecione Minutos" "timePickerMinuteModeAnnouncement": "Selecione Minutos",
"modalBarrierDismissLabel": "Dispensar"
} }
...@@ -27,5 +27,6 @@ ...@@ -27,5 +27,6 @@
"selectAllButtonLabel": "SELECIONAR TUDO", "selectAllButtonLabel": "SELECIONAR TUDO",
"viewLicensesButtonLabel": "VER LICENÇAS", "viewLicensesButtonLabel": "VER LICENÇAS",
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM" "postMeridiemAbbreviation": "PM",
"modalBarrierDismissLabel": "Ignorar"
} }
...@@ -32,5 +32,6 @@ ...@@ -32,5 +32,6 @@
"anteMeridiemAbbreviation": "АМ", "anteMeridiemAbbreviation": "АМ",
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "ВЫБРАТЬ ЧАСЫ", "timePickerHourModeAnnouncement": "ВЫБРАТЬ ЧАСЫ",
"timePickerMinuteModeAnnouncement": "ВЫБРАТЬ МИНУТЫ" "timePickerMinuteModeAnnouncement": "ВЫБРАТЬ МИНУТЫ",
"modalBarrierDismissLabel": "Закрыть"
} }
...@@ -29,5 +29,6 @@ ...@@ -29,5 +29,6 @@
"anteMeridiemAbbreviation": "AM", "anteMeridiemAbbreviation": "AM",
"postMeridiemAbbreviation": "PM", "postMeridiemAbbreviation": "PM",
"timePickerHourModeAnnouncement": "گھنٹے منتخب کریں", "timePickerHourModeAnnouncement": "گھنٹے منتخب کریں",
"timePickerMinuteModeAnnouncement": "منٹ منتخب کریں" "timePickerMinuteModeAnnouncement": "منٹ منتخب کریں",
"modalBarrierDismissLabel": "برطرف"
} }
...@@ -29,5 +29,6 @@ ...@@ -29,5 +29,6 @@
"anteMeridiemAbbreviation": "上午", "anteMeridiemAbbreviation": "上午",
"postMeridiemAbbreviation": "下午", "postMeridiemAbbreviation": "下午",
"timePickerHourModeAnnouncement": "选择小时", "timePickerHourModeAnnouncement": "选择小时",
"timePickerMinuteModeAnnouncement": "选择分钟" "timePickerMinuteModeAnnouncement": "选择分钟",
"modalBarrierDismissLabel": "关闭"
} }
...@@ -322,6 +322,9 @@ class GlobalMaterialLocalizations implements MaterialLocalizations { ...@@ -322,6 +322,9 @@ class GlobalMaterialLocalizations implements MaterialLocalizations {
@override @override
String get timePickerMinuteModeAnnouncement => _nameToValue['timePickerMinuteModeAnnouncement']; String get timePickerMinuteModeAnnouncement => _nameToValue['timePickerMinuteModeAnnouncement'];
@override
String get modalBarrierDismissLabel => _nameToValue['modalBarrierDismissLabel'];
/// 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