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