Add a11y label to modal barrier (#13543)
This commit is contained in:
parent
6299dbada8
commit
f9cf5a1f3d
@ -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';
|
|||||||
|
|
||||||
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> {
|
|||||||
_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> {
|
|||||||
@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>({
|
|||||||
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';
|
|||||||
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> {
|
|||||||
_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> {
|
|||||||
@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>({
|
|||||||
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';
|
|||||||
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>> {
|
|||||||
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>> {
|
|||||||
@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
|
|||||||
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';
|
|||||||
// 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 {
|
|||||||
/// [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 {
|
|||||||
@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> {
|
|||||||
@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> {
|
|||||||
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> {
|
|||||||
@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>({
|
|||||||
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';
|
|||||||
|
|
||||||
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 {
|
|||||||
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 {
|
|||||||
/// [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(
|
|
||||||
container: true,
|
|
||||||
child: new GestureDetector(
|
child: new GestureDetector(
|
||||||
onTapDown: (TapDownDetails details) {
|
onTapDown: (TapDownDetails details) {
|
||||||
if (dismissible)
|
if (dismissible)
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
behavior: HitTestBehavior.opaque,
|
behavior: HitTestBehavior.opaque,
|
||||||
|
child: new Semantics(
|
||||||
|
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 {
|
|||||||
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 {
|
|||||||
/// [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> {
|
|||||||
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> {
|
|||||||
@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
|
|||||||
/// * [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
|
|||||||
));
|
));
|
||||||
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,8 +234,12 @@ 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'),
|
||||||
|
delegates: <LocalizationsDelegate<dynamic>>[
|
||||||
|
DefaultWidgetsLocalizations.delegate,
|
||||||
|
DefaultMaterialLocalizations.delegate,
|
||||||
|
],
|
||||||
child: new MediaQuery(
|
child: new MediaQuery(
|
||||||
data: const MediaQueryData(
|
data: const MediaQueryData(
|
||||||
padding: const EdgeInsets.all(50.0),
|
padding: const EdgeInsets.all(50.0),
|
||||||
|
@ -63,7 +63,13 @@ 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(
|
||||||
|
locale: const Locale('en', 'US'),
|
||||||
|
delegates: <LocalizationsDelegate<dynamic>>[
|
||||||
|
DefaultWidgetsLocalizations.delegate,
|
||||||
|
DefaultMaterialLocalizations.delegate,
|
||||||
|
],
|
||||||
|
child: new MediaQuery(
|
||||||
data: new MediaQueryData.fromWindow(window),
|
data: new MediaQueryData.fromWindow(window),
|
||||||
child: new Directionality(
|
child: new Directionality(
|
||||||
textDirection: widget.textDirection,
|
textDirection: widget.textDirection,
|
||||||
@ -77,6 +83,7 @@ class _TestAppState extends State<TestApp> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,7 +158,13 @@ void main() {
|
|||||||
BuildContext outerContext;
|
BuildContext outerContext;
|
||||||
BuildContext innerContext;
|
BuildContext innerContext;
|
||||||
|
|
||||||
await tester.pumpWidget(new Directionality(
|
await tester.pumpWidget(new Localizations(
|
||||||
|
locale: const Locale('en', 'US'),
|
||||||
|
delegates: <LocalizationsDelegate<dynamic>>[
|
||||||
|
DefaultWidgetsLocalizations.delegate,
|
||||||
|
DefaultMaterialLocalizations.delegate,
|
||||||
|
],
|
||||||
|
child: new Directionality(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
child: new MediaQuery(
|
child: new MediaQuery(
|
||||||
data: const MediaQueryData(
|
data: const MediaQueryData(
|
||||||
@ -175,6 +181,7 @@ void main() {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
showModalBottomSheet<Null>(
|
showModalBottomSheet<Null>(
|
||||||
|
@ -369,7 +369,13 @@ 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(
|
||||||
|
locale: const Locale('en', 'US'),
|
||||||
|
delegates: <LocalizationsDelegate<dynamic>>[
|
||||||
|
DefaultWidgetsLocalizations.delegate,
|
||||||
|
DefaultMaterialLocalizations.delegate,
|
||||||
|
],
|
||||||
|
child: new MediaQuery(
|
||||||
data: new MediaQueryData.fromWindow(window),
|
data: new MediaQueryData.fromWindow(window),
|
||||||
child: new Directionality(
|
child: new Directionality(
|
||||||
textDirection: widget.textDirection,
|
textDirection: widget.textDirection,
|
||||||
@ -385,6 +391,7 @@ class _TestAppState extends State<TestApp> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
|||||||
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,
|
|
||||||
children: <TestSemantics>[
|
|
||||||
new TestSemantics(
|
|
||||||
id: 4,
|
|
||||||
rect: TestSemantics.fullScreen,
|
rect: TestSemantics.fullScreen,
|
||||||
actions: SemanticsAction.tap.index,
|
actions: SemanticsAction.tap.index,
|
||||||
),
|
label: 'Dismiss',
|
||||||
]
|
textDirection: TextDirection.ltr,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
@ -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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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'SCHLIEẞEN',
|
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'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
|
|||||||
'postMeridiemAbbreviation': r'下午',
|
'postMeridiemAbbreviation': r'下午',
|
||||||
'timePickerHourModeAnnouncement': r'选择小时',
|
'timePickerHourModeAnnouncement': r'选择小时',
|
||||||
'timePickerMinuteModeAnnouncement': r'选择分钟',
|
'timePickerMinuteModeAnnouncement': r'选择分钟',
|
||||||
|
'modalBarrierDismissLabel': r'关闭',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,5 +33,6 @@
|
|||||||
"anteMeridiemAbbreviation": "ص",
|
"anteMeridiemAbbreviation": "ص",
|
||||||
"postMeridiemAbbreviation": "م",
|
"postMeridiemAbbreviation": "م",
|
||||||
"timePickerHourModeAnnouncement": "حدد ساعات",
|
"timePickerHourModeAnnouncement": "حدد ساعات",
|
||||||
"timePickerMinuteModeAnnouncement": "حدد دقائق"
|
"timePickerMinuteModeAnnouncement": "حدد دقائق",
|
||||||
|
"modalBarrierDismissLabel": "تجاهل"
|
||||||
}
|
}
|
||||||
|
@ -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 @@
|
|||||||
"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": "SCHLIEẞEN",
|
"closeButtonLabel": "SCHLIESSEN",
|
||||||
"continueButtonLabel": "WEITER",
|
"continueButtonLabel": "WEITER",
|
||||||
"copyButtonLabel": "KOPIEREN",
|
"copyButtonLabel": "KOPIEREN",
|
||||||
"cutButtonLabel": "AUSSCHNEIDEN",
|
"cutButtonLabel": "AUSSCHNEIDEN",
|
||||||
@ -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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"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 @@
|
|||||||
"anteMeridiemAbbreviation": "ق.ظ.",
|
"anteMeridiemAbbreviation": "ق.ظ.",
|
||||||
"postMeridiemAbbreviation": "ب.ظ.",
|
"postMeridiemAbbreviation": "ب.ظ.",
|
||||||
"timePickerHourModeAnnouncement": "ساعت ها را انتخاب کنید",
|
"timePickerHourModeAnnouncement": "ساعت ها را انتخاب کنید",
|
||||||
"timePickerMinuteModeAnnouncement": "دقیقه را انتخاب کنید"
|
"timePickerMinuteModeAnnouncement": "دقیقه را انتخاب کنید",
|
||||||
|
"modalBarrierDismissLabel": "رد کردن"
|
||||||
}
|
}
|
||||||
|
@ -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 @@
|
|||||||
"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 @@
|
|||||||
"anteMeridiemAbbreviation": "AM",
|
"anteMeridiemAbbreviation": "AM",
|
||||||
"postMeridiemAbbreviation": "PM",
|
"postMeridiemAbbreviation": "PM",
|
||||||
"timePickerHourModeAnnouncement": "בחר שעות",
|
"timePickerHourModeAnnouncement": "בחר שעות",
|
||||||
"timePickerMinuteModeAnnouncement": "בחר דקות"
|
"timePickerMinuteModeAnnouncement": "בחר דקות",
|
||||||
|
"modalBarrierDismissLabel": "סגירה"
|
||||||
}
|
}
|
||||||
|
@ -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 @@
|
|||||||
"anteMeridiemAbbreviation": "AM",
|
"anteMeridiemAbbreviation": "AM",
|
||||||
"postMeridiemAbbreviation": "PM",
|
"postMeridiemAbbreviation": "PM",
|
||||||
"timePickerHourModeAnnouncement": "時を選択",
|
"timePickerHourModeAnnouncement": "時を選択",
|
||||||
"timePickerMinuteModeAnnouncement": "分を選択"
|
"timePickerMinuteModeAnnouncement": "分を選択",
|
||||||
|
"modalBarrierDismissLabel": "閉じる"
|
||||||
}
|
}
|
||||||
|
@ -28,5 +28,6 @@
|
|||||||
"selectAllButtonLabel": "غوره کړئ",
|
"selectAllButtonLabel": "غوره کړئ",
|
||||||
"viewLicensesButtonLabel": "لیدلس وګورئ",
|
"viewLicensesButtonLabel": "لیدلس وګورئ",
|
||||||
"timePickerHourModeAnnouncement": "وختونه وټاکئ",
|
"timePickerHourModeAnnouncement": "وختونه وټاکئ",
|
||||||
"timePickerMinuteModeAnnouncement": "منې غوره کړئ"
|
"timePickerMinuteModeAnnouncement": "منې غوره کړئ",
|
||||||
|
"modalBarrierDismissLabel": "رد کړه"
|
||||||
}
|
}
|
||||||
|
@ -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 @@
|
|||||||
"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 @@
|
|||||||
"anteMeridiemAbbreviation": "АМ",
|
"anteMeridiemAbbreviation": "АМ",
|
||||||
"postMeridiemAbbreviation": "PM",
|
"postMeridiemAbbreviation": "PM",
|
||||||
"timePickerHourModeAnnouncement": "ВЫБРАТЬ ЧАСЫ",
|
"timePickerHourModeAnnouncement": "ВЫБРАТЬ ЧАСЫ",
|
||||||
"timePickerMinuteModeAnnouncement": "ВЫБРАТЬ МИНУТЫ"
|
"timePickerMinuteModeAnnouncement": "ВЫБРАТЬ МИНУТЫ",
|
||||||
|
"modalBarrierDismissLabel": "Закрыть"
|
||||||
}
|
}
|
||||||
|
@ -29,5 +29,6 @@
|
|||||||
"anteMeridiemAbbreviation": "AM",
|
"anteMeridiemAbbreviation": "AM",
|
||||||
"postMeridiemAbbreviation": "PM",
|
"postMeridiemAbbreviation": "PM",
|
||||||
"timePickerHourModeAnnouncement": "گھنٹے منتخب کریں",
|
"timePickerHourModeAnnouncement": "گھنٹے منتخب کریں",
|
||||||
"timePickerMinuteModeAnnouncement": "منٹ منتخب کریں"
|
"timePickerMinuteModeAnnouncement": "منٹ منتخب کریں",
|
||||||
|
"modalBarrierDismissLabel": "برطرف"
|
||||||
}
|
}
|
||||||
|
@ -29,5 +29,6 @@
|
|||||||
"anteMeridiemAbbreviation": "上午",
|
"anteMeridiemAbbreviation": "上午",
|
||||||
"postMeridiemAbbreviation": "下午",
|
"postMeridiemAbbreviation": "下午",
|
||||||
"timePickerHourModeAnnouncement": "选择小时",
|
"timePickerHourModeAnnouncement": "选择小时",
|
||||||
"timePickerMinuteModeAnnouncement": "选择分钟"
|
"timePickerMinuteModeAnnouncement": "选择分钟",
|
||||||
|
"modalBarrierDismissLabel": "关闭"
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user