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