Unverified Commit d9cb50e6 authored by LouiseHsu's avatar LouiseHsu Committed by GitHub

[framework] Add Search Web to selection controls for iOS (#131898)

This PR adds framework support for the Search Web feature in iOS. 

https://github.com/flutter/flutter/assets/36148254/c159f0d9-8f14-45e7-b295-e065b0826fab

The corresponding merged engine PR can be found [here](https://github.com/flutter/engine/pull/43324).
This PR addresses https://github.com/flutter/flutter/issues/82907 
More details are available in this [design doc](https://docs.google.com/document/d/1QizXwBiO-2REIcEovl5pK06BaLPOWYmNwOE5jactJZA/edit?resourcekey=0-1pb9mJiAq29Gesmt25GAug)
parent 96553115
......@@ -95,6 +95,7 @@ class CupertinoAdaptiveTextSelectionToolbar extends StatelessWidget {
required VoidCallback? onPaste,
required VoidCallback? onSelectAll,
required VoidCallback? onLookUp,
required VoidCallback? onSearchWeb,
required VoidCallback? onLiveTextInput,
required this.anchors,
}) : children = null,
......@@ -105,6 +106,7 @@ class CupertinoAdaptiveTextSelectionToolbar extends StatelessWidget {
onPaste: onPaste,
onSelectAll: onSelectAll,
onLookUp: onLookUp,
onSearchWeb: onSearchWeb,
onLiveTextInput: onLiveTextInput
);
......
......@@ -249,6 +249,10 @@ abstract class CupertinoLocalizations {
// The global version uses the translated string from the arb file.
String get lookUpButtonLabel;
/// The term used for launching a web search on a selection.
// The global version uses the translated string from the arb file.
String get searchWebButtonLabel;
/// The default placeholder used in [CupertinoSearchTextField].
// The global version uses the translated string from the arb file.
String get searchTextFieldPlaceholderLabel;
......@@ -462,6 +466,9 @@ class DefaultCupertinoLocalizations implements CupertinoLocalizations {
@override
String get lookUpButtonLabel => 'Look Up';
@override
String get searchWebButtonLabel => 'Search Web';
@override
String get searchTextFieldPlaceholderLabel => 'Search';
......
......@@ -107,6 +107,8 @@ class CupertinoTextSelectionToolbarButton extends StatefulWidget {
return localizations.selectAllButtonLabel;
case ContextMenuButtonType.lookUp:
return localizations.lookUpButtonLabel;
case ContextMenuButtonType.searchWeb:
return localizations.searchWebButtonLabel;
case ContextMenuButtonType.liveTextInput:
case ContextMenuButtonType.delete:
case ContextMenuButtonType.custom:
......@@ -192,6 +194,7 @@ class _CupertinoTextSelectionToolbarButtonState extends State<CupertinoTextSelec
case ContextMenuButtonType.selectAll:
case ContextMenuButtonType.delete:
case ContextMenuButtonType.lookUp:
case ContextMenuButtonType.searchWeb:
case ContextMenuButtonType.custom:
return textWidget;
case ContextMenuButtonType.liveTextInput:
......
......@@ -104,6 +104,7 @@ class AdaptiveTextSelectionToolbar extends StatelessWidget {
required VoidCallback? onPaste,
required VoidCallback? onSelectAll,
required VoidCallback? onLookUp,
required VoidCallback? onSearchWeb,
required VoidCallback? onLiveTextInput,
required this.anchors,
}) : children = null,
......@@ -114,6 +115,7 @@ class AdaptiveTextSelectionToolbar extends StatelessWidget {
onPaste: onPaste,
onSelectAll: onSelectAll,
onLookUp: onLookUp,
onSearchWeb: onSearchWeb,
onLiveTextInput: onLiveTextInput
);
......@@ -219,6 +221,8 @@ class AdaptiveTextSelectionToolbar extends StatelessWidget {
return localizations.deleteButtonTooltip.toUpperCase();
case ContextMenuButtonType.lookUp:
return localizations.lookUpButtonLabel;
case ContextMenuButtonType.searchWeb:
return localizations.searchWebButtonLabel;
case ContextMenuButtonType.liveTextInput:
return localizations.scanTextButtonLabel;
case ContextMenuButtonType.custom:
......
......@@ -118,6 +118,9 @@ abstract class MaterialLocalizations {
/// Label for "look up" edit buttons and menu items.
String get lookUpButtonLabel;
/// Label for "search web" edit buttons and menu items.
String get searchWebButtonLabel;
/// Label for the [AboutDialog] button that shows the [LicensePage].
String get viewLicensesButtonLabel;
......@@ -1184,6 +1187,9 @@ class DefaultMaterialLocalizations implements MaterialLocalizations {
@override
String get lookUpButtonLabel => 'Look Up';
@override
String get searchWebButtonLabel => 'Search Web';
@override
String get viewLicensesButtonLabel => 'View licenses';
......
......@@ -1053,6 +1053,9 @@ mixin TextSelectionDelegate {
/// Whether look up is enabled, must not be null.
bool get lookUpEnabled => true;
/// Whether search web is enabled, must not be null.
bool get searchWebEnabled => true;
/// Whether Live Text input is enabled.
///
/// See also:
......
......@@ -29,6 +29,9 @@ enum ContextMenuButtonType {
/// A button that looks up the current text selection.
lookUp,
/// A button that launches a web search for the current text selection.
searchWeb,
/// A button for starting Live Text input.
///
/// See also:
......
......@@ -1853,6 +1853,7 @@ class EditableText extends StatefulWidget {
required final VoidCallback? onPaste,
required final VoidCallback? onSelectAll,
required final VoidCallback? onLookUp,
required final VoidCallback? onSearchWeb,
required final VoidCallback? onLiveTextInput,
}) {
final List<ContextMenuButtonItem> resultButtonItem = <ContextMenuButtonItem>[];
......@@ -1888,6 +1889,11 @@ class EditableText extends StatefulWidget {
onPressed: onLookUp,
type: ContextMenuButtonType.lookUp,
),
if (onSearchWeb != null)
ContextMenuButtonItem(
onPressed: onSearchWeb,
type: ContextMenuButtonType.searchWeb,
),
]);
}
......@@ -2244,7 +2250,19 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
return false;
}
return !widget.obscureText
&& !textEditingValue.selection.isCollapsed;
&& !textEditingValue.selection.isCollapsed
&& textEditingValue.selection.textInside(textEditingValue.text).trim() != '';
}
@override
bool get searchWebEnabled {
if (defaultTargetPlatform != TargetPlatform.iOS) {
return false;
}
return !widget.obscureText
&& !textEditingValue.selection.isCollapsed
&& textEditingValue.selection.textInside(textEditingValue.text).trim() != '';
}
@override
......@@ -2428,6 +2446,27 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
);
}
/// Launch a web search on the current selection,
/// as in the "Search Web" edit menu button on iOS.
///
/// Currently this is only implemented for iOS.
/// When 'obscureText' is true or the selection is empty,
/// this function will not do anything
Future<void> searchWebForSelection(SelectionChangedCause cause) async {
assert(!widget.obscureText);
if (widget.obscureText) {
return;
}
final String text = textEditingValue.selection.textInside(textEditingValue.text);
if (text.isNotEmpty) {
await SystemChannels.platform.invokeMethod(
'SearchWeb.invoke',
text,
);
}
}
void _startLiveTextInput(SelectionChangedCause cause) {
if (!liveTextInputEnabled) {
return;
......@@ -2657,6 +2696,9 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
onLookUp: lookUpEnabled
? () => lookUpSelection(SelectionChangedCause.toolbar)
: null,
onSearchWeb: searchWebEnabled
? () => searchWebForSelection(SelectionChangedCause.toolbar)
: null,
onLiveTextInput: liveTextInputEnabled
? () => _startLiveTextInput(SelectionChangedCause.toolbar)
: null,
......
......@@ -30,6 +30,13 @@ void main() {
);
});
Finder findOverflowNextButton() {
return find.byWidgetPredicate((Widget widget) =>
widget is CustomPaint &&
'${widget.painter?.runtimeType}' == '_RightCupertinoChevronPainter',
);
}
testWidgets('Builds the right toolbar on each platform, including web, and shows buttonItems', (WidgetTester tester) async {
const String buttonText = 'Click me';
......@@ -169,6 +176,7 @@ void main() {
onSelectAll: () {},
onLiveTextInput: () {},
onLookUp: () {},
onSearchWeb: () {},
),
),
));
......@@ -178,6 +186,7 @@ void main() {
expect(find.text('Cut'), findsOneWidget);
expect(find.text('Select All'), findsOneWidget);
expect(find.text('Paste'), findsOneWidget);
expect(find.text('Look Up'), findsOneWidget);
switch (defaultTargetPlatform) {
case TargetPlatform.android:
......@@ -186,11 +195,14 @@ void main() {
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(6));
case TargetPlatform.iOS:
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(6));
expect(findOverflowNextButton(), findsOneWidget);
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
expect(findLiveTextButton(), findsOneWidget);
case TargetPlatform.macOS:
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton), findsNWidgets(6));
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton), findsNWidgets(7));
}
},
skip: kIsWeb, // [intended] on web the browser handles the context menu.
......
......@@ -179,10 +179,13 @@ void main() {
});
group('Text selection menu overflow (iOS)', () {
Finder findOverflowNextButton() => find.byWidgetPredicate((Widget widget) =>
Finder findOverflowNextButton() {
return find.byWidgetPredicate((Widget widget) =>
widget is CustomPaint &&
'${widget.painter?.runtimeType}' == '_RightCupertinoChevronPainter',
);
'${widget.painter?.runtimeType}' == '_RightCupertinoChevronPainter',
);
}
Finder findOverflowBackButton() => find.byWidgetPredicate((Widget widget) =>
widget is CustomPaint &&
'${widget.painter?.runtimeType}' == '_LeftCupertinoChevronPainter',
......@@ -247,7 +250,7 @@ void main() {
testWidgets("When a menu item doesn't fit, a second page is used.", (WidgetTester tester) async {
// Set the screen size to more narrow, so that Paste can't fit.
tester.view.physicalSize = const Size(900, 800);
tester.view.physicalSize = const Size(1000, 800);
addTearDown(tester.view.reset);
final TextEditingController controller = TextEditingController(text: 'abc def ghi');
......@@ -265,12 +268,23 @@ void main() {
),
));
Future<void> tapNextButton() async {
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
}
Future<void> tapBackButton() async {
await tester.tapAt(tester.getCenter(findOverflowBackButton()));
await tester.pumpAndSettle();
}
// Initially, the menu isn't shown at all.
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsNothing);
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsNothing);
expect(findOverflowNextButton(), findsNothing);
......@@ -287,42 +301,53 @@ void main() {
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsNothing);
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the next button shows both the overflow, back, and next buttons.
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
await tapNextButton();
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsNothing);
expect(find.text('Paste'), findsOneWidget);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsOneWidget);
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the next button shows the overflowing button and the next
// button is hidden as the last page is shown.
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
// Tapping the next button shows the next, back, and Look Up button
await tapNextButton();
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsNothing);
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsOneWidget);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsOneWidget);
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the next button shows the back and Search Web button
await tapNextButton();
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsNothing);
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsOneWidget);
expect(findOverflowBackButton(), findsOneWidget);
expect(findOverflowNextButton(), findsNothing);
// Tapping the back button shows the first page again with the next button.
await tester.tapAt(tester.getCenter(findOverflowBackButton()));
await tester.pumpAndSettle();
await tester.tapAt(tester.getCenter(findOverflowBackButton()));
await tester.pumpAndSettle();
// Tapping the back button thrice shows the first page again with the next button.
await tapBackButton();
await tapBackButton();
await tapBackButton();
expect(find.text('Cut'), findsOneWidget);
expect(find.text('Copy'), findsOneWidget);
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsNothing);
expect(findOverflowNextButton(), findsOneWidget);
},
......@@ -351,6 +376,16 @@ void main() {
),
));
Future<void> tapNextButton() async {
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
}
Future<void> tapBackButton() async {
await tester.tapAt(tester.getCenter(findOverflowBackButton()));
await tester.pumpAndSettle();
}
// Initially, the menu isn't shown at all.
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNothing);
expect(find.text('Cut'), findsNothing);
......@@ -358,6 +393,7 @@ void main() {
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsNothing);
expect(findOverflowNextButton(), findsNothing);
......@@ -375,49 +411,60 @@ void main() {
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsNothing);
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the next button shows Copy.
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
await tapNextButton();
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(3));
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsOneWidget);
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsOneWidget);
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the next button again shows Paste
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
await tapNextButton();
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(3));
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsNothing);
expect(find.text('Paste'), findsOneWidget);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsOneWidget);
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the next button again shows the last page.
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
// Tapping the next button again shows the Look Up Button.
await tapNextButton();
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsNothing);
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsOneWidget);
expect(find.text('Search Web'), findsNothing);
expect(findOverflowBackButton(), findsOneWidget);
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the next button again shows the last page.
await tapNextButton();
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsNothing);
expect(find.text('Paste'), findsNothing);
expect(find.text('Select All'), findsNothing);
expect(find.text('Look Up'), findsNothing);
expect(find.text('Search Web'), findsOneWidget);
expect(findOverflowBackButton(), findsOneWidget);
expect(findOverflowNextButton(), findsNothing);
// Tapping the back button twice shows the second page again with the next button.
await tester.tapAt(tester.getCenter(findOverflowBackButton()));
await tester.pumpAndSettle();
await tester.tapAt(tester.getCenter(findOverflowBackButton()));
await tester.pumpAndSettle();
// Tapping the back button thrice shows the second page again with the next button.
await tapBackButton();
await tapBackButton();
await tapBackButton();
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(3));
expect(find.text('Cut'), findsNothing);
expect(find.text('Copy'), findsOneWidget);
......@@ -428,8 +475,7 @@ void main() {
expect(findOverflowNextButton(), findsOneWidget);
// Tapping the back button again shows the first page again.
await tester.tapAt(tester.getCenter(findOverflowBackButton()));
await tester.pumpAndSettle();
await tapBackButton();
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(2));
expect(find.text('Cut'), findsOneWidget);
expect(find.text('Copy'), findsNothing);
......
......@@ -92,14 +92,19 @@ void main() {
..line(p1: const Offset(7.5, 0), p2: const Offset(2.5, 5))
..line(p1: const Offset(2.5, 5), p2: const Offset(7.5, 10));
Finder findOverflowNextButton() => find.byWidgetPredicate((Widget widget) =>
Finder findOverflowNextButton() {
return find.byWidgetPredicate((Widget widget) =>
widget is CustomPaint &&
'${widget.painter?.runtimeType}' == '_RightCupertinoChevronPainter',
);
Finder findOverflowBackButton() => find.byWidgetPredicate((Widget widget) =>
'${widget.painter?.runtimeType}' == '_RightCupertinoChevronPainter',
);
}
Finder findOverflowBackButton() {
return find.byWidgetPredicate((Widget widget) =>
widget is CustomPaint &&
'${widget.painter?.runtimeType}' == '_LeftCupertinoChevronPainter',
);
'${widget.painter?.runtimeType}' == '_LeftCupertinoChevronPainter',
);
}
testWidgets('chevrons point to the correct side', (WidgetTester tester) async {
// Add enough TestBoxes to need 3 pages.
......
......@@ -27,6 +27,13 @@ void main() {
await Clipboard.setData(const ClipboardData(text: 'Clipboard data'));
});
Finder findOverflowNextButton() {
return find.byWidgetPredicate((Widget widget) =>
widget is CustomPaint &&
'${widget.painter?.runtimeType}' == '_RightCupertinoChevronPainter',
);
}
testWidgetsWithLeakTracking('Builds the right toolbar on each platform, including web, and shows buttonItems', (WidgetTester tester) async {
const String buttonText = 'Click me';
......@@ -187,6 +194,7 @@ void main() {
onSelectAll: () {},
onLiveTextInput: () {},
onLookUp: () {},
onSearchWeb: () {},
),
),
),
......@@ -200,20 +208,24 @@ void main() {
switch (defaultTargetPlatform) {
case TargetPlatform.android:
case TargetPlatform.fuchsia:
expect(find.text('Select all'), findsOneWidget);
expect(find.byType(TextSelectionToolbarTextButton), findsNWidgets(6));
case TargetPlatform.fuchsia:
expect(find.text('Select all'), findsOneWidget);
expect(find.byType(TextSelectionToolbarTextButton), findsNWidgets(7));
case TargetPlatform.iOS:
expect(find.text('Select All'), findsOneWidget);
expect(findLiveTextButton(), findsOneWidget);
expect(find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(6));
await tester.tapAt(tester.getCenter(findOverflowNextButton()));
await tester.pumpAndSettle();
expect(findLiveTextButton(), findsOneWidget);
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(find.text('Select all'), findsOneWidget);
expect(find.byType(DesktopTextSelectionToolbarButton), findsNWidgets(6));
expect(find.byType(DesktopTextSelectionToolbarButton), findsNWidgets(7));
case TargetPlatform.macOS:
expect(find.text('Select All'), findsOneWidget);
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton), findsNWidgets(6));
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton), findsNWidgets(7));
}
},
skip: kIsWeb, // [intended] on web the browser handles the context menu.
......
......@@ -32,6 +32,7 @@ void main() {
expect(localizations.cutButtonLabel, isNotNull);
expect(localizations.scanTextButtonLabel, isNotNull);
expect(localizations.lookUpButtonLabel, isNotNull);
expect(localizations.searchWebButtonLabel, isNotNull);
expect(localizations.okButtonLabel, isNotNull);
expect(localizations.pasteButtonLabel, isNotNull);
expect(localizations.selectAllButtonLabel, isNotNull);
......
......@@ -9217,7 +9217,7 @@ void main() {
);
// Selected text shows 4 toolbar buttons.
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
// Tap the selected word to hide the toolbar and retain the selection.
await tester.tapAt(vPos);
......@@ -9235,7 +9235,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 24, extentOffset: 35),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
// Tap past the selected word to move the cursor and hide the toolbar.
await tester.tapAt(ePos);
......@@ -9289,8 +9289,8 @@ void main() {
const TextSelection(baseOffset: 8, extentOffset: 12),
);
// Selected text shows 3 toolbar buttons.
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
// Selected text shows 5 toolbar buttons.
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS }),
);
......@@ -9859,7 +9859,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 0, extentOffset: 7),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
await tester.tapAt(textfieldStart + const Offset(50.0, 9.0));
await tester.pumpAndSettle(kDoubleTapTimeout);
......@@ -9883,7 +9883,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 0, extentOffset: 7),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
// Third tap shows the toolbar and selects the paragraph.
await tester.tapAt(textfieldStart + const Offset(100.0, 9.0));
......@@ -9892,7 +9892,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 0, extentOffset: 36),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
await tester.tapAt(textfieldStart + const Offset(150.0, 50.0));
await tester.pump(const Duration(milliseconds: 50));
......@@ -9909,7 +9909,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 44, extentOffset: 50),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
// Third tap selects the paragraph and shows the toolbar.
await tester.tapAt(textfieldStart + const Offset(150.0, 50.0));
......@@ -9918,7 +9918,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 36, extentOffset: 66),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS }),
);
......@@ -11125,7 +11125,7 @@ void main() {
);
// Selected text shows 4 toolbar buttons on iOS, and 3 on macOS.
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(4) : findsNWidgets(3));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(5) : findsNWidgets(3));
await gesture.up();
await tester.pump();
......@@ -11137,7 +11137,7 @@ void main() {
);
// The toolbar is still showing.
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(4) : findsNWidgets(3));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(5) : findsNWidgets(3));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -11269,7 +11269,7 @@ void main() {
// Collapsed toolbar shows 3 buttons.
expect(
find.byType(CupertinoButton),
isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(4) : findsNWidgets(3)
isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(5) : findsNWidgets(3)
);
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
......@@ -11573,7 +11573,7 @@ void main() {
const TextSelection(baseOffset: 0, extentOffset: 23),
);
// The toolbar now shows up.
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(4) : findsNWidgets(3));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(5) : findsNWidgets(3));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -11739,7 +11739,7 @@ void main() {
const TextSelection(baseOffset: 0, extentOffset: 66, affinity: TextAffinity.upstream),
);
// The toolbar now shows up.
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(4) : findsNWidgets(3));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(5) : findsNWidgets(3));
lastCharEndpoint = renderEditable.getEndpointsForSelection(
const TextSelection.collapsed(offset: 66), // Last character's position.
......@@ -12332,7 +12332,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 8, extentOffset: 12),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformMobile ? findsNWidgets(4) : findsNWidgets(3));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformMobile ? findsNWidgets(5) : findsNWidgets(3));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -12430,7 +12430,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 0, extentOffset: 7),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
// Double tap selecting the same word somewhere else is fine.
await tester.tapAt(textfieldStart + const Offset(100.0, 9.0));
......@@ -12450,7 +12450,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 0, extentOffset: 7),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(4) : findsNWidgets(3));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(5) : findsNWidgets(3));
await tester.tapAt(textfieldStart + const Offset(150.0, 9.0));
await tester.pump(const Duration(milliseconds: 50));
......@@ -12466,7 +12466,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 8, extentOffset: 12),
);
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(4) : findsNWidgets(3));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : isTargetPlatformIOS ? findsNWidgets(5) : findsNWidgets(3));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS }),
);
......@@ -12893,7 +12893,7 @@ void main() {
await gesture.up();
await tester.pumpAndSettle();
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(4));
expect(find.byType(CupertinoButton), isContextMenuProvidedByPlatform ? findsNothing : findsNWidgets(5));
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS }));
testWidgets('tap on non-force-press-supported devices work', (WidgetTester tester) async {
......
......@@ -154,6 +154,7 @@ void main() {
onPaste: null,
onSelectAll: null,
onLookUp: null,
onSearchWeb: null,
onLiveTextInput: () {
invokedLiveTextInputSuccessfully = true;
},
......
......@@ -2959,7 +2959,7 @@ void main() {
);
// Selected text shows 1 toolbar buttons on MacOS, 2 on iOS.
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -3090,7 +3090,7 @@ void main() {
);
// Selected text shows 2 toolbar buttons for iOS, 1 for macOS.
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
await gesture.up();
await tester.pump();
......@@ -3101,7 +3101,7 @@ void main() {
const TextSelection(baseOffset: 8, extentOffset: 12),
);
// The toolbar is still showing.
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -3218,7 +3218,7 @@ void main() {
);
// Toolbar shows one button.
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -3554,7 +3554,7 @@ void main() {
),
);
// The toolbar now shows up.
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS }),
);
......@@ -3782,7 +3782,7 @@ void main() {
);
// Long press toolbar.
expect(find.byType(CupertinoButton), findsNWidgets(2));
expect(find.byType(CupertinoButton), findsNWidgets(3));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS }),
);
......@@ -3876,7 +3876,7 @@ void main() {
const TextSelection(baseOffset: 8, extentOffset: 12),
);
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -3911,7 +3911,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 0, extentOffset: 7),
);
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
// Double tap selecting the same word somewhere else is fine.
await tester.pumpAndSettle(kDoubleTapTimeout);
......@@ -3928,7 +3928,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 0, extentOffset: 7),
);
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
// Hide the toolbar so it doesn't interfere with taps on the text.
final EditableTextState editableTextState =
......@@ -3950,7 +3950,7 @@ void main() {
controller.selection,
const TextSelection(baseOffset: 8, extentOffset: 12),
);
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(2) : findsNWidgets(1));
expect(find.byType(CupertinoButton), isTargetPlatformIOS ? findsNWidgets(3) : findsNWidgets(1));
},
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
);
......@@ -4029,7 +4029,7 @@ void main() {
await gesture.up();
await tester.pump();
expect(find.byType(CupertinoButton), findsNWidgets(2));
expect(find.byType(CupertinoButton), findsNWidgets(3));
}, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS }));
testWidgets('tap on non-force-press-supported devices work', (WidgetTester tester) async {
......
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Soek",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ፍለጋ",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -44,5 +44,6 @@
"searchTextFieldPlaceholderLabel": "بحث",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "সন্ধান কৰক",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Axtarın",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Пошук",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Търсене",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "সার্চ করুন",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -29,5 +29,6 @@
"searchTextFieldPlaceholderLabel": "Pretraživanje",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Cerca",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Hledat",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -44,5 +44,6 @@
"modalBarrierDismissLabel": "Diystyru",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Søg",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Suche",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Αναζήτηση",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -170,6 +170,11 @@
"description": "The label for the Look Up button and menu items on iOS."
},
"searchWebButtonLabel": "Search Web",
"@searchWebButtonLabel": {
"description": "The label for the Search Web button and menu items on iOS."
},
"noSpellCheckReplacementsLabel": "No Replacements Found",
"@noSpellCheckReplacementsLabel": {
"description": "The label shown in the text selection context menu on iOS when a misspelled word is tapped but the spell checker found no reasonable fixes for it."
......
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Buscar",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Otsige",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Bilatu",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "جستجو",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Hae",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Hanapin",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Rechercher",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Fai unha busca",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Suche",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "શોધો",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "חיפוש",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "खोजें",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -29,5 +29,6 @@
"searchTextFieldPlaceholderLabel": "Pretraživanje",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Keresés",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Որոնում",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Telusuri",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Leit",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Cerca",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "検索",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ძიება",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Іздеу",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ស្វែងរក",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf",
"noSpellCheckReplacementsLabel": "\u004e\u006f\u0020\u0052\u0065\u0070\u006c\u0061\u0063\u0065\u006d\u0065\u006e\u0074\u0073\u0020\u0046\u006f\u0075\u006e\u0064",
"menuDismissLabel": "\u0044\u0069\u0073\u006d\u0069\u0073\u0073\u0020\u006d\u0065\u006e\u0075",
"lookUpButtonLabel": "\u004c\u006f\u006f\u006b\u0020\u0055\u0070"
"lookUpButtonLabel": "\u004c\u006f\u006f\u006b\u0020\u0055\u0070",
"searchWebButtonLabel": "\u0053\u0065\u0061\u0072\u0063\u0068\u0020\u0057\u0065\u0062"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "검색",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Издөө",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ຊອກຫາ",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Paieška",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -29,5 +29,6 @@
"searchTextFieldPlaceholderLabel": "Meklēšana",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Пребарувајте",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "തിരയുക",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Хайх",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "शोधा",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Cari",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ရှာရန်",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Søk",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "खोज्नुहोस्",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Zoeken",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Søk",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ସନ୍ଧାନ କରନ୍ତୁ",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ਖੋਜੋ",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Szukaj",
"noSpellCheckReplacementsLabel": "Nie znaleziono zastąpień",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Pesquisar",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -29,5 +29,6 @@
"searchTextFieldPlaceholderLabel": "Căutați",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Поиск",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "සෙවීම",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Hľadať",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Iskanje",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Kërko",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -29,5 +29,6 @@
"searchTextFieldPlaceholderLabel": "Претражите",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Sök",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Tafuta",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "தேடுக",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "సెర్చ్ చేయి",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "ค้นหา",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Hanapin",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Ara",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -34,5 +34,6 @@
"searchTextFieldPlaceholderLabel": "Шукайте",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "تلاش کریں",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Qidiruv",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Tìm kiếm",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "搜索",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -24,5 +24,6 @@
"searchTextFieldPlaceholderLabel": "Sesha",
"noSpellCheckReplacementsLabel": "No Replacements Found",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -142,5 +142,6 @@
"expandedHint": "Collapsed",
"collapsedHint": "Expanded",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -142,5 +142,6 @@
"expandedHint": "Collapsed",
"collapsedHint": "Expanded",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
......@@ -153,5 +153,6 @@
"expandedHint": "Collapsed",
"collapsedHint": "Expanded",
"menuDismissLabel": "Dismiss menu",
"lookUpButtonLabel": "Look Up"
"lookUpButtonLabel": "Look Up",
"searchWebButtonLabel": "Search Web"
}
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