Unverified Commit 4841a7ed authored by Justin McCandless's avatar Justin McCandless Committed by GitHub

Text Selection Overflow (Android) (#49391)

Adds an overflow menu to the text selection menu on Android when the items overflow.
parent 5e74b004
......@@ -71,6 +71,9 @@ abstract class MaterialLocalizations {
/// The tooltip for the delete button on a [Chip].
String get deleteButtonTooltip;
/// The tooltip for the more button on an overflowing text selection menu.
String get moreButtonTooltip;
/// The tooltip for the [MonthPicker]'s "next month" button.
String get nextMonthTooltip;
......@@ -561,6 +564,9 @@ class DefaultMaterialLocalizations implements MaterialLocalizations {
@override
String get deleteButtonTooltip => 'Delete';
@override
String get moreButtonTooltip => 'More';
@override
String get nextMonthTooltip => 'Next month';
......
......@@ -4,11 +4,14 @@
import 'dart:math' as math;
import 'package:flutter/widgets.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
import 'debug.dart';
import 'flat_button.dart';
import 'icon_button.dart';
import 'icons.dart';
import 'material.dart';
import 'material_localizations.dart';
import 'theme.dart';
......@@ -20,17 +23,18 @@ const double _kHandleSize = 22.0;
const double _kToolbarScreenPadding = 8.0;
const double _kToolbarHeight = 44.0;
// Padding when positioning toolbar below selection.
const double _kToolbarContentDistanceBelow = 16.0;
const double _kToolbarContentDistanceBelow = _kHandleSize - 2.0;
const double _kToolbarContentDistance = 8.0;
/// Manages a copy/paste text selection toolbar.
class _TextSelectionToolbar extends StatelessWidget {
class _TextSelectionToolbar extends StatefulWidget {
const _TextSelectionToolbar({
Key key,
this.handleCut,
this.handleCopy,
this.handlePaste,
this.handleSelectAll,
this.isAbove,
}) : super(key: key);
final VoidCallback handleCut;
......@@ -38,14 +42,60 @@ class _TextSelectionToolbar extends StatelessWidget {
final VoidCallback handlePaste;
final VoidCallback handleSelectAll;
// When true, the toolbar fits above its anchor and will be positioned there.
final bool isAbove;
@override
_TextSelectionToolbarState createState() => _TextSelectionToolbarState();
}
class _TextSelectionToolbarState extends State<_TextSelectionToolbar> with TickerProviderStateMixin {
// Whether or not the overflow menu is open. When it is closed, the menu
// items that don't overflow are shown. When it is open, only the overflowing
// menu items are shown.
bool _overflowOpen = false;
// The key for _TextSelectionToolbarContainer.
UniqueKey _containerKey = UniqueKey();
FlatButton _getItem(VoidCallback onPressed, String label) {
assert(onPressed != null);
return FlatButton(
child: Text(label),
onPressed: onPressed,
);
}
@override
void didUpdateWidget(_TextSelectionToolbar oldWidget) {
if (((widget.handleCut == null) != (oldWidget.handleCut == null))
|| ((widget.handleCopy == null) != (oldWidget.handleCopy == null))
|| ((widget.handlePaste == null) != (oldWidget.handlePaste == null))
|| ((widget.handleSelectAll == null) != (oldWidget.handleSelectAll == null))) {
// Change _TextSelectionToolbarContainer's key when the menu changes in
// order to cause it to rebuild. This lets it recalculate its
// saved width for the new set of children, and it prevents AnimatedSize
// from animating the size change.
_containerKey = UniqueKey();
// If the menu items change, make sure the overflow menu is closed. This
// prevents an empty overflow menu.
_overflowOpen = false;
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final List<Widget> items = <Widget>[
if (handleCut != null) FlatButton(child: Text(localizations.cutButtonLabel), onPressed: handleCut),
if (handleCopy != null) FlatButton(child: Text(localizations.copyButtonLabel), onPressed: handleCopy),
if (handlePaste != null) FlatButton(child: Text(localizations.pasteButtonLabel), onPressed: handlePaste),
if (handleSelectAll != null) FlatButton(child: Text(localizations.selectAllButtonLabel), onPressed: handleSelectAll),
if (widget.handleCut != null)
_getItem(widget.handleCut, localizations.cutButtonLabel),
if (widget.handleCopy != null)
_getItem(widget.handleCopy, localizations.copyButtonLabel),
if (widget.handlePaste != null)
_getItem(widget.handlePaste, localizations.pasteButtonLabel),
if (widget.handleSelectAll != null)
_getItem(widget.handleSelectAll, localizations.selectAllButtonLabel),
];
// If there is no option available, build an empty widget.
......@@ -53,31 +103,481 @@ class _TextSelectionToolbar extends StatelessWidget {
return Container(width: 0.0, height: 0.0);
}
return Material(
return _TextSelectionToolbarContainer(
key: _containerKey,
overflowOpen: _overflowOpen,
child: AnimatedSize(
vsync: this,
// This duration was eyeballed on a Pixel 2 emulator running Android
// API 28.
duration: const Duration(milliseconds: 140),
child: Material(
elevation: 1.0,
child: Container(
height: _kToolbarHeight,
child: Row(mainAxisSize: MainAxisSize.min, children: items),
child: _TextSelectionToolbarItems(
isAbove: widget.isAbove,
overflowOpen: _overflowOpen,
children: <Widget>[
// The navButton that shows and hides the overflow menu is the
// first child.
Material(
child: IconButton(
// TODO(justinmc): This should be an AnimatedIcon, but
// AnimatedIcons doesn't yet support arrow_back to more_vert.
// https://github.com/flutter/flutter/issues/51209
icon: Icon(_overflowOpen ? Icons.arrow_back : Icons.more_vert),
onPressed: () {
setState(() {
_overflowOpen = !_overflowOpen;
});
},
tooltip: _overflowOpen
? localizations.backButtonTooltip
: localizations.moreButtonTooltip,
),
),
...items,
],
),
),
),
);
}
}
// When the overflow menu is open, it tries to align its right edge to the right
// edge of the closed menu. This widget handles this effect by measuring and
// maintaining the width of the closed menu and aligning the child to the right.
class _TextSelectionToolbarContainer extends SingleChildRenderObjectWidget {
const _TextSelectionToolbarContainer({
Key key,
@required Widget child,
@required this.overflowOpen,
}) : assert(child != null),
assert(overflowOpen != null),
super(key: key, child: child);
final bool overflowOpen;
@override
_TextSelectionToolbarContainerRenderBox createRenderObject(BuildContext context) {
return _TextSelectionToolbarContainerRenderBox(overflowOpen: overflowOpen);
}
@override
void updateRenderObject(BuildContext context, _TextSelectionToolbarContainerRenderBox renderObject) {
renderObject.overflowOpen = overflowOpen;
}
}
class _TextSelectionToolbarContainerRenderBox extends RenderProxyBox {
_TextSelectionToolbarContainerRenderBox({
@required bool overflowOpen,
}) : assert(overflowOpen != null),
_overflowOpen = overflowOpen,
super();
// The width of the menu when it was closed. This is used to achieve the
// behavior where the open menu aligns its right edge to the closed menu's
// right edge.
double _closedWidth;
bool _overflowOpen;
bool get overflowOpen => _overflowOpen;
set overflowOpen(bool value) {
if (value == overflowOpen) {
return;
}
_overflowOpen = value;
markNeedsLayout();
}
@override
void performLayout() {
child.layout(constraints.loosen(), parentUsesSize: true);
// Save the width when the menu is closed. If the menu changes, this width
// is invalid, so it's important that this RenderBox be recreated in that
// case. Currently, this is achieved by providing a new key to
// _TextSelectionToolbarContainer.
if (!overflowOpen && _closedWidth == null) {
_closedWidth = child.size.width;
}
size = constraints.constrain(Size(
// If the open menu is wider than the closed menu, just use its own width
// and don't worry about aligning the right edges.
// _closedWidth is used even when the menu is closed to allow it to
// animate its size while keeping the same right alignment.
_closedWidth == null || child.size.width > _closedWidth ? child.size.width : _closedWidth,
child.size.height,
));
final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
childParentData.offset = Offset(
size.width - child.size.width,
0.0,
);
}
// Paint at the offset set in the parent data.
@override
void paint(PaintingContext context, Offset offset) {
final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
context.paintChild(child, childParentData.offset + offset);
}
// Include the parent data offset in the hit test.
@override
bool hitTestChildren(BoxHitTestResult result, { Offset position }) {
// The x, y parameters have the top left of the node's box as the origin.
final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
return result.addWithPaintOffset(
offset: childParentData.offset,
position: position,
hitTest: (BoxHitTestResult result, Offset transformed) {
assert(transformed == position - childParentData.offset);
return child.hitTest(result, position: transformed);
},
);
}
@override
void setupParentData(RenderBox child) {
if (child.parentData is! _ToolbarParentData) {
child.parentData = _ToolbarParentData();
}
}
@override
void applyPaintTransform(RenderObject child, Matrix4 transform) {
final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
transform.translate(childParentData.offset.dx, childParentData.offset.dy);
super.applyPaintTransform(child, transform);
}
}
/// Centers the toolbar around the given position, ensuring that it remains on
// Renders the menu items in the correct positions in the menu and its overflow
// submenu based on calculating which item would first overflow.
class _TextSelectionToolbarItems extends MultiChildRenderObjectWidget {
_TextSelectionToolbarItems({
Key key,
@required this.isAbove,
@required this.overflowOpen,
@required List<Widget> children,
}) : assert(children != null),
assert(isAbove != null),
assert(overflowOpen != null),
super(key: key, children: children);
final bool isAbove;
final bool overflowOpen;
@override
_TextSelectionToolbarItemsRenderBox createRenderObject(BuildContext context) {
return _TextSelectionToolbarItemsRenderBox(
isAbove: isAbove,
overflowOpen: overflowOpen,
);
}
@override
void updateRenderObject(BuildContext context, _TextSelectionToolbarItemsRenderBox renderObject) {
renderObject
..isAbove = isAbove
..overflowOpen = overflowOpen;
}
@override
_TextSelectionToolbarItemsElement createElement() => _TextSelectionToolbarItemsElement(this);
}
class _ToolbarParentData extends ContainerBoxParentData<RenderBox> {
/// Whether or not this child is painted.
///
/// Children in the selection toolbar may be laid out for measurement purposes
/// but not painted. This allows these children to be identified.
bool shouldPaint;
@override
String toString() => '${super.toString()}; shouldPaint=$shouldPaint';
}
class _TextSelectionToolbarItemsElement extends MultiChildRenderObjectElement {
_TextSelectionToolbarItemsElement(
MultiChildRenderObjectWidget widget,
) : super(widget);
static bool _shouldPaint(Element child) {
return (child.renderObject.parentData as _ToolbarParentData).shouldPaint;
}
@override
void debugVisitOnstageChildren(ElementVisitor visitor) {
children.where(_shouldPaint).forEach(visitor);
}
}
class _TextSelectionToolbarItemsRenderBox extends RenderBox with ContainerRenderObjectMixin<RenderBox, _ToolbarParentData> {
_TextSelectionToolbarItemsRenderBox({
@required bool isAbove,
@required bool overflowOpen,
}) : assert(overflowOpen != null),
assert(isAbove != null),
_isAbove = isAbove,
_overflowOpen = overflowOpen,
super();
// The index of the last item that doesn't overflow.
int _lastIndexThatFits = -1;
bool _isAbove;
bool get isAbove => _isAbove;
set isAbove(bool value) {
if (value == isAbove) {
return;
}
_isAbove = value;
markNeedsLayout();
}
bool _overflowOpen;
bool get overflowOpen => _overflowOpen;
set overflowOpen(bool value) {
if (value == overflowOpen) {
return;
}
_overflowOpen = value;
markNeedsLayout();
}
// Layout the necessary children, and figure out where the children first
// overflow, if at all.
void _layoutChildren() {
// When overflow is not open, the toolbar is always a specific height.
final BoxConstraints sizedConstraints = _overflowOpen
? constraints
: BoxConstraints.loose(Size(
constraints.maxWidth,
_kToolbarHeight,
));
int i = -1;
double width = 0.0;
visitChildren((RenderObject renderObjectChild) {
i++;
// No need to layout children inside the overflow menu when it's closed.
// The opposite is not true. It is necessary to layout the children that
// don't overflow when the overflow menu is open in order to calculate
// _lastIndexThatFits.
if (_lastIndexThatFits != -1 && !overflowOpen) {
return;
}
final RenderBox child = renderObjectChild as RenderBox;
child.layout(sizedConstraints.loosen(), parentUsesSize: true);
width += child.size.width;
if (width > sizedConstraints.maxWidth && _lastIndexThatFits == -1) {
_lastIndexThatFits = i - 1;
}
});
// If the last child overflows, but only because of the width of the
// overflow button, then just show it and hide the overflow button.
final RenderBox navButton = firstChild;
if (_lastIndexThatFits != -1
&& _lastIndexThatFits == childCount - 2
&& width - navButton.size.width <= sizedConstraints.maxWidth) {
_lastIndexThatFits = -1;
}
}
// Returns true when the child should be painted, false otherwise.
bool _shouldPaintChild(RenderObject renderObjectChild, int index) {
// Paint the navButton when there is overflow.
if (renderObjectChild == firstChild) {
return _lastIndexThatFits != -1;
}
// If there is no overflow, all children besides the navButton are painted.
if (_lastIndexThatFits == -1) {
return true;
}
// When there is overflow, paint if the child is in the part of the menu
// that is currently open. Overflowing children are painted when the
// overflow menu is open, and the children that fit are painted when the
// overflow menu is closed.
return (index > _lastIndexThatFits) == overflowOpen;
}
// Decide which children will be pained and set their shouldPaint, and set the
// offset that painted children will be placed at.
void _placeChildren() {
int i = -1;
Size nextSize = const Size(0.0, 0.0);
double fitWidth = 0.0;
final RenderBox navButton = firstChild;
double overflowHeight = overflowOpen && !isAbove ? navButton.size.height : 0.0;
visitChildren((RenderObject renderObjectChild) {
i++;
final RenderBox child = renderObjectChild as RenderBox;
final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
// Handle placing the navigation button after iterating all children.
if (renderObjectChild == navButton) {
return;
}
// There is no need to place children that won't be painted.
if (!_shouldPaintChild(renderObjectChild, i)) {
childParentData.shouldPaint = false;
return;
}
childParentData.shouldPaint = true;
if (!overflowOpen) {
childParentData.offset = Offset(fitWidth, 0.0);
fitWidth += child.size.width;
nextSize = Size(
fitWidth,
math.max(child.size.height, nextSize.height),
);
} else {
childParentData.offset = Offset(0.0, overflowHeight);
overflowHeight += child.size.height;
nextSize = Size(
math.max(child.size.width, nextSize.width),
overflowHeight,
);
}
});
// Place the navigation button if needed.
final _ToolbarParentData navButtonParentData = navButton.parentData as _ToolbarParentData;
if (_shouldPaintChild(firstChild, 0)) {
navButtonParentData.shouldPaint = true;
if (overflowOpen) {
navButtonParentData.offset = isAbove
? Offset(0.0, overflowHeight)
: Offset.zero;
nextSize = Size(
nextSize.width,
isAbove ? nextSize.height + navButton.size.height : nextSize.height,
);
} else {
navButtonParentData.offset = Offset(fitWidth, 0.0);
nextSize = Size(nextSize.width + navButton.size.width, nextSize.height);
}
} else {
navButtonParentData.shouldPaint = false;
}
size = nextSize;
}
@override
void performLayout() {
_lastIndexThatFits = -1;
if (firstChild == null) {
performResize();
return;
}
_layoutChildren();
_placeChildren();
}
@override
void paint(PaintingContext context, Offset offset) {
visitChildren((RenderObject renderObjectChild) {
final RenderBox child = renderObjectChild as RenderBox;
final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
if (!childParentData.shouldPaint) {
return;
}
context.paintChild(child, childParentData.offset + offset);
});
}
@override
void setupParentData(RenderBox child) {
if (child.parentData is! _ToolbarParentData) {
child.parentData = _ToolbarParentData();
}
}
@override
bool hitTestChildren(BoxHitTestResult result, { Offset position }) {
// The x, y parameters have the top left of the node's box as the origin.
RenderBox child = lastChild;
while (child != null) {
final _ToolbarParentData childParentData = child.parentData as _ToolbarParentData;
// Don't hit test children aren't shown.
if (!childParentData.shouldPaint) {
child = childParentData.previousSibling;
continue;
}
final bool isHit = result.addWithPaintOffset(
offset: childParentData.offset,
position: position,
hitTest: (BoxHitTestResult result, Offset transformed) {
assert(transformed == position - childParentData.offset);
return child.hitTest(result, position: transformed);
},
);
if (isHit)
return true;
child = childParentData.previousSibling;
}
return false;
}
}
/// Centers the toolbar around the given anchor, ensuring that it remains on
/// screen.
class _TextSelectionToolbarLayout extends SingleChildLayoutDelegate {
_TextSelectionToolbarLayout(this.screenSize, this.globalEditableRegion, this.position);
_TextSelectionToolbarLayout(this.anchor, this.upperBounds, this.fitsAbove);
/// The size of the screen at the time that the toolbar was last laid out.
final Size screenSize;
/// Anchor position of the toolbar in global coordinates.
final Offset anchor;
/// Size and position of the editing region at the time the toolbar was last
/// laid out, in global coordinates.
final Rect globalEditableRegion;
/// The upper-most valid y value for the anchor.
final double upperBounds;
/// Whether the closed toolbar fits above the anchor position.
///
/// If the closed toolbar doesn't fit, then the menu is rendered below the
/// anchor position. It should never happen that the toolbar extends below the
/// padded bottom of the screen.
///
/// If the closed toolbar does fit but it doesn't fit when the overflow menu
/// is open, then the toolbar is still rendered above the anchor position. It
/// then grows downward, overlapping the selection.
final bool fitsAbove;
// Return the value that centers width as closely as possible to position
// while fitting inside of min and max.
static double _centerOn(double position, double width, double min, double max) {
// If it overflows on the left, put it as far left as possible.
if (position - width / 2.0 < min) {
return min;
}
// If it overflows on the right, put it as far right as possible.
if (position + width / 2.0 > max) {
return max - width;
}
/// Anchor position of the toolbar, relative to the top left of the
/// [globalEditableRegion].
final Offset position;
// Otherwise it fits while perfectly centered.
return position - width / 2.0;
}
@override
BoxConstraints getConstraintsForChild(BoxConstraints constraints) {
......@@ -86,27 +586,22 @@ class _TextSelectionToolbarLayout extends SingleChildLayoutDelegate {
@override
Offset getPositionForChild(Size size, Size childSize) {
final Offset globalPosition = globalEditableRegion.topLeft + position;
double x = globalPosition.dx - childSize.width / 2.0;
double y = globalPosition.dy - childSize.height;
if (x < _kToolbarScreenPadding)
x = _kToolbarScreenPadding;
else if (x + childSize.width > screenSize.width - _kToolbarScreenPadding)
x = screenSize.width - childSize.width - _kToolbarScreenPadding;
if (y < _kToolbarScreenPadding)
y = _kToolbarScreenPadding;
else if (y + childSize.height > screenSize.height - _kToolbarScreenPadding)
y = screenSize.height - childSize.height - _kToolbarScreenPadding;
return Offset(x, y);
return Offset(
_centerOn(
anchor.dx,
childSize.width,
_kToolbarScreenPadding,
size.width - _kToolbarScreenPadding,
),
fitsAbove
? math.max(upperBounds, anchor.dy - childSize.height)
: anchor.dy,
);
}
@override
bool shouldRelayout(_TextSelectionToolbarLayout oldDelegate) {
return position != oldDelegate.position;
return anchor != oldDelegate.anchor;
}
}
......@@ -143,42 +638,52 @@ class _MaterialTextSelectionControls extends TextSelectionControls {
BuildContext context,
Rect globalEditableRegion,
double textLineHeight,
Offset position,
Offset selectionMidpoint,
List<TextSelectionPoint> endpoints,
TextSelectionDelegate delegate,
) {
assert(debugCheckHasMediaQuery(context));
assert(debugCheckHasMaterialLocalizations(context));
// The toolbar should appear below the TextField
// when there is not enough space above the TextField to show it.
// The toolbar should appear below the TextField when there is not enough
// space above the TextField to show it.
final TextSelectionPoint startTextSelectionPoint = endpoints[0];
final double toolbarHeightNeeded = MediaQuery.of(context).padding.top
+ _kToolbarScreenPadding
final TextSelectionPoint endTextSelectionPoint = endpoints.length > 1
? endpoints[1]
: endpoints[0];
const double closedToolbarHeightNeeded = _kToolbarScreenPadding
+ _kToolbarHeight
+ _kToolbarContentDistance;
final double availableHeight = globalEditableRegion.top + endpoints.first.point.dy - textLineHeight;
final bool fitsAbove = toolbarHeightNeeded <= availableHeight;
final double y = fitsAbove
? startTextSelectionPoint.point.dy - _kToolbarContentDistance - textLineHeight
: startTextSelectionPoint.point.dy + _kToolbarHeight + _kToolbarContentDistanceBelow;
final Offset preciseMidpoint = Offset(position.dx, y);
return ConstrainedBox(
constraints: BoxConstraints.tight(globalEditableRegion.size),
child: CustomSingleChildLayout(
final double paddingTop = MediaQuery.of(context).padding.top;
final double availableHeight = globalEditableRegion.top
+ startTextSelectionPoint.point.dy
- textLineHeight
- paddingTop;
final bool fitsAbove = closedToolbarHeightNeeded <= availableHeight;
final Offset anchor = Offset(
globalEditableRegion.left + selectionMidpoint.dx,
fitsAbove
? globalEditableRegion.top + startTextSelectionPoint.point.dy - textLineHeight - _kToolbarContentDistance
: globalEditableRegion.top + endTextSelectionPoint.point.dy + _kToolbarContentDistanceBelow,
);
return Stack(
children: <Widget>[
CustomSingleChildLayout(
delegate: _TextSelectionToolbarLayout(
MediaQuery.of(context).size,
globalEditableRegion,
preciseMidpoint,
anchor,
_kToolbarScreenPadding + paddingTop,
fitsAbove,
),
child: _TextSelectionToolbar(
handleCut: canCut(delegate) ? () => handleCut(delegate) : null,
handleCopy: canCopy(delegate) ? () => handleCopy(delegate) : null,
handlePaste: canPaste(delegate) ? () => handlePaste(delegate) : null,
handleSelectAll: canSelectAll(delegate) ? () => handleSelectAll(delegate) : null,
isAbove: fitsAbove,
),
),
],
);
}
......@@ -190,7 +695,7 @@ class _MaterialTextSelectionControls extends TextSelectionControls {
height: _kHandleSize,
child: CustomPaint(
painter: _TextSelectionHandlePainter(
color: Theme.of(context).textSelectionHandleColor
color: Theme.of(context).textSelectionHandleColor,
),
),
);
......
......@@ -2483,7 +2483,7 @@ mixin RenderBoxContainerDefaultsMixin<ChildType extends RenderBox, ParentDataTyp
/// * [defaultPaint], which paints the children appropriate for this
/// hit-testing strategy.
bool defaultHitTestChildren(BoxHitTestResult result, { Offset position }) {
// the x, y parameters have the top left of the node's box as the origin
// The x, y parameters have the top left of the node's box as the origin.
ChildType child = lastChild;
while (child != null) {
final ParentDataType childParentData = child.parentData as ParentDataType;
......
......@@ -13,6 +13,7 @@ void main() {
expect(localizations.backButtonTooltip, isNotNull);
expect(localizations.closeButtonTooltip, isNotNull);
expect(localizations.deleteButtonTooltip, isNotNull);
expect(localizations.moreButtonTooltip, isNotNull);
expect(localizations.nextMonthTooltip, isNotNull);
expect(localizations.previousMonthTooltip, isNotNull);
expect(localizations.nextPageTooltip, isNotNull);
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
// Returns the first RenderEditable.
RenderEditable findRenderEditable(WidgetTester tester) {
final RenderObject root = tester.renderObject(find.byType(EditableText));
expect(root, isNotNull);
RenderEditable renderEditable;
void recursiveFinder(RenderObject child) {
if (child is RenderEditable) {
renderEditable = child;
return;
}
child.visitChildren(recursiveFinder);
}
root.visitChildren(recursiveFinder);
expect(renderEditable, isNotNull);
return renderEditable;
}
List<TextSelectionPoint> globalize(Iterable<TextSelectionPoint> points, RenderBox box) {
return points.map<TextSelectionPoint>((TextSelectionPoint point) {
return TextSelectionPoint(
box.localToGlobal(point.point),
point.direction,
);
}).toList();
}
Offset textOffsetToPosition(WidgetTester tester, int offset) {
final RenderEditable renderEditable = findRenderEditable(tester);
final List<TextSelectionPoint> endpoints = globalize(
renderEditable.getEndpointsForSelection(
TextSelection.collapsed(offset: offset),
),
renderEditable,
);
expect(endpoints.length, 1);
return endpoints[0].point + const Offset(0.0, -2.0);
}
......@@ -18,6 +18,7 @@ import 'package:flutter/gestures.dart' show DragStartBehavior, PointerDeviceKind
import '../rendering/mock_canvas.dart';
import '../widgets/semantics_tester.dart';
import 'feedback_tester.dart';
import 'text.dart' show findRenderEditable, globalize, textOffsetToPosition;
class MockClipboard {
Object _clipboardData = <String, dynamic>{
......@@ -141,45 +142,6 @@ void main() {
kThreeLines +
"\nFourth line won't display and ends at";
// Returns the first RenderEditable.
RenderEditable findRenderEditable(WidgetTester tester) {
final RenderObject root = tester.renderObject(find.byType(EditableText));
expect(root, isNotNull);
RenderEditable renderEditable;
void recursiveFinder(RenderObject child) {
if (child is RenderEditable) {
renderEditable = child;
return;
}
child.visitChildren(recursiveFinder);
}
root.visitChildren(recursiveFinder);
expect(renderEditable, isNotNull);
return renderEditable;
}
List<TextSelectionPoint> globalize(Iterable<TextSelectionPoint> points, RenderBox box) {
return points.map<TextSelectionPoint>((TextSelectionPoint point) {
return TextSelectionPoint(
box.localToGlobal(point.point),
point.direction,
);
}).toList();
}
Offset textOffsetToPosition(WidgetTester tester, int offset) {
final RenderEditable renderEditable = findRenderEditable(tester);
final List<TextSelectionPoint> endpoints = globalize(
renderEditable.getEndpointsForSelection(
TextSelection.collapsed(offset: offset),
),
renderEditable,
);
expect(endpoints.length, 1);
return endpoints[0].point + const Offset(0.0, -2.0);
}
setUp(() {
debugResetSemanticsIdCounter();
});
......
......@@ -3,8 +3,10 @@
// found in the LICENSE file.
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'text.dart' show findRenderEditable, globalize, textOffsetToPosition;
void main() {
group('canSelectAll', () {
......@@ -63,6 +65,445 @@ void main() {
});
});
group('Text selection menu overflow (Android)', () {
testWidgets('All menu items show when they fit.', (WidgetTester tester) async {
final TextEditingController controller = TextEditingController(text: 'abc def ghi');
await tester.pumpWidget(MaterialApp(
theme: ThemeData(platform: TargetPlatform.android),
home: Directionality(
textDirection: TextDirection.ltr,
child: MediaQuery(
data: const MediaQueryData(size: Size(800.0, 600.0)),
child: Center(
child: Material(
child: TextField(
controller: controller,
),
),
),
),
),
));
// 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.byType(IconButton), findsNothing);
// Tap to place the cursor in the field, then tap the handle to show the
// selection menu.
await tester.tap(find.byType(TextField));
await tester.pumpAndSettle();
final RenderEditable renderEditable = findRenderEditable(tester);
final List<TextSelectionPoint> endpoints = globalize(
renderEditable.getEndpointsForSelection(controller.selection),
renderEditable,
);
expect(endpoints.length, 1);
final Offset handlePos = endpoints[0].point + const Offset(0.0, 1.0);
await tester.tapAt(handlePos, pointer: 7);
await tester.pump();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsNothing);
// Long press to select a word and show the full selection menu.
final Offset textOffset = textOffsetToPosition(tester, 1);
await tester.longPressAt(textOffset);
await tester.pump();
await tester.pump();
// The full menu is shown without the more button.
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsNothing);
}, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
testWidgets('When menu items don\'t fit, an overflow menu is used.', (WidgetTester tester) async {
// Set the screen size to more narrow, so that SELECT ALL can't fit.
tester.binding.window.physicalSizeTestValue = const Size(1000, 800);
addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
final TextEditingController controller = TextEditingController(text: 'abc def ghi');
await tester.pumpWidget(MaterialApp(
theme: ThemeData(platform: TargetPlatform.android),
home: Directionality(
textDirection: TextDirection.ltr,
child: MediaQuery(
data: const MediaQueryData(size: Size(800.0, 600.0)),
child: Center(
child: Material(
child: TextField(
controller: controller,
),
),
),
),
),
));
// 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.byType(IconButton), findsNothing);
// Long press to show the menu.
final Offset textOffset = textOffsetToPosition(tester, 1);
await tester.longPressAt(textOffset);
await tester.pumpAndSettle();
// The last button is missing, and a more button is shown.
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsOneWidget);
final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
// Tapping the button shows the overflow menu.
await tester.tap(find.byType(IconButton));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsNothing);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsOneWidget);
// The back button is at the bottom of the overflow menu.
final Offset selectAllOffset = tester.getTopLeft(find.text('SELECT ALL'));
final Offset moreOffset = tester.getTopLeft(find.byType(IconButton));
expect(moreOffset.dy, greaterThan(selectAllOffset.dy));
// The overflow menu grows upward.
expect(selectAllOffset.dy, lessThan(cutOffset.dy));
// Tapping the back button shows the selection menu again.
expect(find.byType(IconButton), findsOneWidget);
await tester.tap(find.byType(IconButton));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsOneWidget);
}, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
testWidgets('A smaller menu bumps more items to the overflow menu.', (WidgetTester tester) async {
// Set the screen size so narrow that only CUT and COPY can fit.
tester.binding.window.physicalSizeTestValue = const Size(800, 800);
addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
final TextEditingController controller = TextEditingController(text: 'abc def ghi');
await tester.pumpWidget(MaterialApp(
theme: ThemeData(platform: TargetPlatform.android),
home: Directionality(
textDirection: TextDirection.ltr,
child: MediaQuery(
data: const MediaQueryData(size: Size(800.0, 600.0)),
child: Center(
child: Material(
child: TextField(
controller: controller,
),
),
),
),
),
));
// 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.byType(IconButton), findsNothing);
// Long press to show the menu.
final Offset textOffset = textOffsetToPosition(tester, 1);
await tester.longPressAt(textOffset);
await tester.pump();
// The last two buttons are missing, and a more button is shown.
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsNothing);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsOneWidget);
// Tapping the button shows the overflow menu, which contains both buttons
// missing from the main menu, and a back button.
await tester.tap(find.byType(IconButton));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsOneWidget);
// Tapping the back button shows the selection menu again.
await tester.tap(find.byType(IconButton));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsNothing);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsOneWidget);
}, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
testWidgets('When the menu renders below the text, the overflow menu back button is at the top.', (WidgetTester tester) async {
// Set the screen size to more narrow, so that SELECT ALL can't fit.
tester.binding.window.physicalSizeTestValue = const Size(1000, 800);
addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
final TextEditingController controller = TextEditingController(text: 'abc def ghi');
await tester.pumpWidget(MaterialApp(
theme: ThemeData(platform: TargetPlatform.android),
home: Directionality(
textDirection: TextDirection.ltr,
child: MediaQuery(
data: const MediaQueryData(size: Size(800.0, 600.0)),
child: Align(
alignment: Alignment.topLeft,
child: Material(
child: TextField(
controller: controller,
),
),
),
),
),
));
// 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.byType(IconButton), findsNothing);
// Long press to show the menu.
final Offset textOffset = textOffsetToPosition(tester, 1);
await tester.longPressAt(textOffset);
await tester.pump();
// The last button is missing, and a more button is shown.
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsOneWidget);
final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
// Tapping the button shows the overflow menu.
await tester.tap(find.byType(IconButton));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsNothing);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsOneWidget);
// The back button is at the top of the overflow menu.
final Offset selectAllOffset = tester.getTopLeft(find.text('SELECT ALL'));
final Offset moreOffset = tester.getTopLeft(find.byType(IconButton));
expect(moreOffset.dy, lessThan(selectAllOffset.dy));
// The overflow menu grows downward.
expect(selectAllOffset.dy, greaterThan(cutOffset.dy));
// Tapping the back button shows the selection menu again.
await tester.tap(find.byType(IconButton));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsOneWidget);
}, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
testWidgets('When the menu items change, the menu is closed and _closedWidth reset.', (WidgetTester tester) async {
// Set the screen size to more narrow, so that SELECT ALL can't fit.
tester.binding.window.physicalSizeTestValue = const Size(1000, 800);
addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
final TextEditingController controller = TextEditingController(text: 'abc def ghi');
await tester.pumpWidget(MaterialApp(
theme: ThemeData(platform: TargetPlatform.android),
home: Directionality(
textDirection: TextDirection.ltr,
child: MediaQuery(
data: const MediaQueryData(size: Size(800.0, 600.0)),
child: Align(
alignment: Alignment.topLeft,
child: Material(
child: TextField(
controller: controller,
),
),
),
),
),
));
// 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.byType(IconButton), findsNothing);
// Tap to place the cursor and tap again to show the menu without a
// selection.
await tester.tapAt(textOffsetToPosition(tester, 0));
await tester.pumpAndSettle();
final RenderEditable renderEditable = findRenderEditable(tester);
final List<TextSelectionPoint> endpoints = globalize(
renderEditable.getEndpointsForSelection(controller.selection),
renderEditable,
);
expect(endpoints.length, 1);
final Offset handlePos = endpoints[0].point + const Offset(0.0, 1.0);
await tester.tapAt(handlePos, pointer: 7);
await tester.pumpAndSettle();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsNothing);
// Tap SELECT ALL and measure the usual position of CUT, without
// _closedWidth having been used yet.
await tester.tap(find.text('SELECT ALL'));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsNothing);
final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
// Tap to clear the selection.
await tester.tapAt(textOffsetToPosition(tester, 0));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsNothing);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsNothing);
// Long press to show the menu.
await tester.longPressAt(textOffsetToPosition(tester, 1));
await tester.pump();
// The last button is missing, and a more button is shown.
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsOneWidget);
// Tapping the button shows the overflow menu.
await tester.tap(find.byType(IconButton));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsNothing);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsOneWidget);
// Tapping SELECT ALL changes the menu items so that there is no no longer
// any overflow.
await tester.tap(find.text('SELECT ALL'));
await tester.pumpAndSettle();
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsNothing);
final Offset newCutOffset = tester.getTopLeft(find.text('CUT'));
expect(newCutOffset, equals(cutOffset));
}, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
});
group('menu position', () {
testWidgets('When renders below a block of text, menu appears below bottom endpoint', (WidgetTester tester) async {
final TextEditingController controller = TextEditingController(text: 'abc\ndef\nghi\njkl\nmno\npqr');
await tester.pumpWidget(MaterialApp(
theme: ThemeData(platform: TargetPlatform.android),
home: Directionality(
textDirection: TextDirection.ltr,
child: MediaQuery(
data: const MediaQueryData(size: Size(800.0, 600.0)),
child: Align(
alignment: Alignment.topLeft,
child: Material(
child: TextField(
controller: controller,
),
),
),
),
),
));
// 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.byType(IconButton), findsNothing);
// Tap to place the cursor in the field, then tap the handle to show the
// selection menu.
await tester.tap(find.byType(TextField));
await tester.pumpAndSettle();
RenderEditable renderEditable = findRenderEditable(tester);
List<TextSelectionPoint> endpoints = globalize(
renderEditable.getEndpointsForSelection(controller.selection),
renderEditable,
);
expect(endpoints.length, 1);
final Offset handlePos = endpoints[0].point + const Offset(0.0, 1.0);
await tester.tapAt(handlePos, pointer: 7);
await tester.pump();
expect(find.text('CUT'), findsNothing);
expect(find.text('COPY'), findsNothing);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsOneWidget);
expect(find.byType(IconButton), findsNothing);
// Tap to select all.
await tester.tap(find.text('SELECT ALL'));
await tester.pumpAndSettle();
// Only CUT, COPY, and PASTE are shown.
expect(find.text('CUT'), findsOneWidget);
expect(find.text('COPY'), findsOneWidget);
expect(find.text('PASTE'), findsOneWidget);
expect(find.text('SELECT ALL'), findsNothing);
expect(find.byType(IconButton), findsNothing);
// The menu appears below the bottom handle.
renderEditable = findRenderEditable(tester);
endpoints = globalize(
renderEditable.getEndpointsForSelection(controller.selection),
renderEditable,
);
expect(endpoints.length, 2);
final Offset bottomHandlePos = endpoints[1].point;
final Offset cutOffset = tester.getTopLeft(find.text('CUT'));
expect(cutOffset.dy, greaterThan(bottomHandlePos.dy));
}, skip: isBrowser, variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }));
});
group('material handles', () {
testWidgets('draws transparent handle correctly', (WidgetTester tester) async {
await tester.pumpWidget(RepaintBoundary(
......
......@@ -98,6 +98,9 @@ class MaterialLocalizationAf extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Maak toe';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Volgende maand';
......@@ -302,6 +305,9 @@ class MaterialLocalizationAm extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'አሰናብት';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'ቀጣይ ወር';
......@@ -506,6 +512,9 @@ class MaterialLocalizationAr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'رفض';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'الشهر التالي';
......@@ -710,6 +719,9 @@ class MaterialLocalizationAs extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'অগ্ৰাহ্য কৰক';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'পৰৱৰ্তী মাহ';
......@@ -914,6 +926,9 @@ class MaterialLocalizationAz extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'İmtina edin';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Növbəti ay';
......@@ -1118,6 +1133,9 @@ class MaterialLocalizationBe extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Адхіліць';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Наступны месяц';
......@@ -1322,6 +1340,9 @@ class MaterialLocalizationBg extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Отхвърляне';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Следващият месец';
......@@ -1526,6 +1547,9 @@ class MaterialLocalizationBn extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'খারিজ করুন';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'পরের মাস';
......@@ -1730,6 +1754,9 @@ class MaterialLocalizationBs extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Odbaci';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Sljedeći mjesec';
......@@ -1934,6 +1961,9 @@ class MaterialLocalizationCa extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Ignora';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Mes següent';
......@@ -2138,6 +2168,9 @@ class MaterialLocalizationCs extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Zavřít';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Další měsíc';
......@@ -2342,6 +2375,9 @@ class MaterialLocalizationDa extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Afvis';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Næste måned';
......@@ -2546,6 +2582,9 @@ class MaterialLocalizationDe extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Schließen';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Nächster Monat';
......@@ -2780,6 +2819,9 @@ class MaterialLocalizationEl extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Παράβλεψη';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Επόμενος μήνας';
......@@ -2984,6 +3026,9 @@ class MaterialLocalizationEn extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Dismiss';
@override
String get moreButtonTooltip => 'More';
@override
String get nextMonthTooltip => 'Next month';
......@@ -3533,6 +3578,9 @@ class MaterialLocalizationEs extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Cerrar';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Mes siguiente';
......@@ -5360,6 +5408,9 @@ class MaterialLocalizationEt extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Loobu';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Järgmine kuu';
......@@ -5564,6 +5615,9 @@ class MaterialLocalizationEu extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Baztertu';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Hurrengo hilabetea';
......@@ -5768,6 +5822,9 @@ class MaterialLocalizationFa extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'نپذیرفتن';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'ماه بعد';
......@@ -5972,6 +6029,9 @@ class MaterialLocalizationFi extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Ohita';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Seuraava kuukausi';
......@@ -6176,6 +6236,9 @@ class MaterialLocalizationFil extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'I-dismiss';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Susunod na buwan';
......@@ -6380,6 +6443,9 @@ class MaterialLocalizationFr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Ignorer';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Mois suivant';
......@@ -6638,6 +6704,9 @@ class MaterialLocalizationGl extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Ignorar';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Mes seguinte';
......@@ -6842,6 +6911,9 @@ class MaterialLocalizationGsw extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Schließen';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Nächster Monat';
......@@ -7046,6 +7118,9 @@ class MaterialLocalizationGu extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'છોડી દો';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'આગલો મહિનો';
......@@ -7250,6 +7325,9 @@ class MaterialLocalizationHe extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'סגירה';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'החודש הבא';
......@@ -7454,6 +7532,9 @@ class MaterialLocalizationHi extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'खारिज करें';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'अगला महीना';
......@@ -7658,6 +7739,9 @@ class MaterialLocalizationHr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Odbaci';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Sljedeći mjesec';
......@@ -7862,6 +7946,9 @@ class MaterialLocalizationHu extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Elvetés';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Következő hónap';
......@@ -8066,6 +8153,9 @@ class MaterialLocalizationHy extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Փակել';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Հաջորդ ամիս';
......@@ -8270,6 +8360,9 @@ class MaterialLocalizationId extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Tutup';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Bulan berikutnya';
......@@ -8474,6 +8567,9 @@ class MaterialLocalizationIs extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Hunsa';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Næsti mánuður';
......@@ -8678,6 +8774,9 @@ class MaterialLocalizationIt extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Ignora';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Mese successivo';
......@@ -8882,6 +8981,9 @@ class MaterialLocalizationJa extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => '閉じる';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => '来月';
......@@ -9086,6 +9188,9 @@ class MaterialLocalizationKa extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'დახურვა';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'შემდეგი თვე';
......@@ -9290,6 +9395,9 @@ class MaterialLocalizationKk extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Жабу';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Келесі ай';
......@@ -9494,6 +9602,9 @@ class MaterialLocalizationKm extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'ច្រាន​ចោល';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'ខែ​​ក្រោយ';
......@@ -9698,6 +9809,9 @@ class MaterialLocalizationKn extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => '\u{cb5}\u{c9c}\u{cbe}\u{c97}\u{cca}\u{cb3}\u{cbf}\u{cb8}\u{cbf}';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => '\u{cae}\u{cc1}\u{c82}\u{ca6}\u{cbf}\u{ca8}\u{20}\u{ca4}\u{cbf}\u{c82}\u{c97}\u{cb3}\u{cc1}';
......@@ -9902,6 +10016,9 @@ class MaterialLocalizationKo extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => '닫기';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => '다음 달';
......@@ -10106,6 +10223,9 @@ class MaterialLocalizationKy extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Жабуу';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Кийинки ай';
......@@ -10310,6 +10430,9 @@ class MaterialLocalizationLo extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'ປິດໄວ້';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'ເດືອນໜ້າ';
......@@ -10514,6 +10637,9 @@ class MaterialLocalizationLt extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Atsisakyti';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Kitas mėnuo';
......@@ -10718,6 +10844,9 @@ class MaterialLocalizationLv extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Nerādīt';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Nākamais mēnesis';
......@@ -10922,6 +11051,9 @@ class MaterialLocalizationMk extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Отфрли';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Следниот месец';
......@@ -11126,6 +11258,9 @@ class MaterialLocalizationMl extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'നിരസിക്കുക';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'അടുത്ത മാസം';
......@@ -11330,6 +11465,9 @@ class MaterialLocalizationMn extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Үл хэрэгсэх';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Дараах сар';
......@@ -11534,6 +11672,9 @@ class MaterialLocalizationMr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'डिसमिस करा';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'पुढील महिना';
......@@ -11738,6 +11879,9 @@ class MaterialLocalizationMs extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Tolak';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Bulan depan';
......@@ -11942,6 +12086,9 @@ class MaterialLocalizationMy extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'ပယ်ရန်';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'နောက်လ';
......@@ -12146,6 +12293,9 @@ class MaterialLocalizationNb extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Avvis';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Neste måned';
......@@ -12350,6 +12500,9 @@ class MaterialLocalizationNe extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'खारेज गर्नुहोस्';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'अर्को महिना';
......@@ -12554,6 +12707,9 @@ class MaterialLocalizationNl extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Sluiten';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Volgende maand';
......@@ -12758,6 +12914,9 @@ class MaterialLocalizationOr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'ଖାରଜ କରନ୍ତୁ';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'ପରବର୍ତ୍ତୀ ମାସ';
......@@ -12962,6 +13121,9 @@ class MaterialLocalizationPa extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'ਖਾਰਜ ਕਰੋ';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'ਅਗਲਾ ਮਹੀਨਾ';
......@@ -13166,6 +13328,9 @@ class MaterialLocalizationPl extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Zamknij';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Następny miesiąc';
......@@ -13370,6 +13535,9 @@ class MaterialLocalizationPs extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'رد کړه';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'بله میاشت';
......@@ -13574,6 +13742,9 @@ class MaterialLocalizationPt extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Dispensar';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Próximo mês';
......@@ -13856,6 +14027,9 @@ class MaterialLocalizationRo extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Închideți';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Luna viitoare';
......@@ -14060,6 +14234,9 @@ class MaterialLocalizationRu extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Закрыть';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Следующий месяц';
......@@ -14264,6 +14441,9 @@ class MaterialLocalizationSi extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'ඉවත ලන්න';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'ඊළඟ මාසය';
......@@ -14468,6 +14648,9 @@ class MaterialLocalizationSk extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Odmietnuť';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Budúci mesiac';
......@@ -14672,6 +14855,9 @@ class MaterialLocalizationSl extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Opusti';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Naslednji mesec';
......@@ -14876,6 +15062,9 @@ class MaterialLocalizationSq extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Hiq';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Muaji i ardhshëm';
......@@ -15080,6 +15269,9 @@ class MaterialLocalizationSr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Одбаци';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Следећи месец';
......@@ -15488,6 +15680,9 @@ class MaterialLocalizationSv extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Stäng';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Nästa månad';
......@@ -15692,6 +15887,9 @@ class MaterialLocalizationSw extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Ondoa';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Mwezi ujao';
......@@ -15896,6 +16094,9 @@ class MaterialLocalizationTa extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'நிராகரிக்கும்';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'அடுத்த மாதம்';
......@@ -16100,6 +16301,9 @@ class MaterialLocalizationTe extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'విస్మరించు';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'తర్వాత నెల';
......@@ -16304,6 +16508,9 @@ class MaterialLocalizationTh extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'ปิด';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'เดือนหน้า';
......@@ -16508,6 +16715,9 @@ class MaterialLocalizationTl extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'I-dismiss';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Susunod na buwan';
......@@ -16712,6 +16922,9 @@ class MaterialLocalizationTr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Kapat';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Gelecek ay';
......@@ -16916,6 +17129,9 @@ class MaterialLocalizationUk extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Закрити';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Наступний місяць';
......@@ -17120,6 +17336,9 @@ class MaterialLocalizationUr extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'برخاست کریں';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'اگلا مہینہ';
......@@ -17324,6 +17543,9 @@ class MaterialLocalizationUz extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Yopish';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Keyingi oy';
......@@ -17528,6 +17750,9 @@ class MaterialLocalizationVi extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Bỏ qua';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Tháng sau';
......@@ -17732,6 +17957,9 @@ class MaterialLocalizationZh extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => '关闭';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => '下个月';
......@@ -18209,6 +18437,9 @@ class MaterialLocalizationZu extends GlobalMaterialLocalizations {
@override
String get modalBarrierDismissLabel => 'Cashisa';
@override
String get moreButtonTooltip => 'TBD';
@override
String get nextMonthTooltip => 'Inyanga ezayo';
......
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Vou uit",
"remainingTextFieldCharacterCountOne": "1 karakter oor",
"remainingTextFieldCharacterCountOther": "$remainingCount karakters oor",
"refreshIndicatorSemanticLabel": "Herlaai"
"refreshIndicatorSemanticLabel": "Herlaai",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "ዘርጋ",
"remainingTextFieldCharacterCountOne": "1 ቁምፊ ይቀራል",
"remainingTextFieldCharacterCountOther": "$remainingCount ቁምፊዎች ይቀራሉ",
"refreshIndicatorSemanticLabel": "አድስ"
"refreshIndicatorSemanticLabel": "አድስ",
"moreButtonTooltip": "TBD"
}
......@@ -58,5 +58,6 @@
"remainingTextFieldCharacterCountZero": "لا أحرف متبقية",
"remainingTextFieldCharacterCountOne": "حرف واحد متبقٍ",
"remainingTextFieldCharacterCountOther": "$remainingCount حرف متبقٍ",
"refreshIndicatorSemanticLabel": "إعادة تحميل"
"refreshIndicatorSemanticLabel": "إعادة تحميل",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "বিস্তাৰ কৰক",
"remainingTextFieldCharacterCountOne": "১টা বর্ণ বাকী আছে",
"remainingTextFieldCharacterCountOther": "$remainingCountটা বর্ণ বাকী আছে",
"refreshIndicatorSemanticLabel": "ৰিফ্ৰেশ্ব কৰক"
"refreshIndicatorSemanticLabel": "ৰিফ্ৰেশ্ব কৰক",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Genişləndirin",
"remainingTextFieldCharacterCountOne": "1 simvol qalır",
"remainingTextFieldCharacterCountOther": "$remainingCount simvol qalır",
"refreshIndicatorSemanticLabel": "Yeniləyin"
"refreshIndicatorSemanticLabel": "Yeniləyin",
"moreButtonTooltip": "TBD"
}
......@@ -54,5 +54,6 @@
"collapsedIconTapHint": "Разгарнуць",
"remainingTextFieldCharacterCountOne": "Застаўся 1 сімвал",
"remainingTextFieldCharacterCountOther": "Засталося $remainingCount сімвала",
"refreshIndicatorSemanticLabel": "Абнавіць"
"refreshIndicatorSemanticLabel": "Абнавіць",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Остава 1 знак",
"remainingTextFieldCharacterCountOther": "Остават $remainingCount знака",
"refreshIndicatorSemanticLabel": "Опресняване"
"refreshIndicatorSemanticLabel": "Опресняване",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "বড় করুন",
"remainingTextFieldCharacterCountOne": "আর ১টি অক্ষর লেখা যাবে",
"remainingTextFieldCharacterCountOther": "আর $remainingCountটি অক্ষর লেখা যাবে",
"refreshIndicatorSemanticLabel": "রিফ্রেশ করুন"
"refreshIndicatorSemanticLabel": "রিফ্রেশ করুন",
"moreButtonTooltip": "TBD"
}
......@@ -53,5 +53,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Još jedan znak",
"remainingTextFieldCharacterCountOther": "Još $remainingCount znakova",
"refreshIndicatorSemanticLabel": "Osvježi"
"refreshIndicatorSemanticLabel": "Osvježi",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Queda 1 caràcter",
"remainingTextFieldCharacterCountOther": "Queden $remainingCount caràcters",
"refreshIndicatorSemanticLabel": "Actualitza"
"refreshIndicatorSemanticLabel": "Actualitza",
"moreButtonTooltip": "TBD"
}
......@@ -55,5 +55,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Zbývá 1 znak",
"remainingTextFieldCharacterCountOther": "Zbývá $remainingCount znaků",
"refreshIndicatorSemanticLabel": "Obnovit"
"refreshIndicatorSemanticLabel": "Obnovit",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Ét tegn tilbage",
"remainingTextFieldCharacterCountOther": "$remainingCount tegn tilbage",
"refreshIndicatorSemanticLabel": "Opdater"
"refreshIndicatorSemanticLabel": "Opdater",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Noch 1 Zeichen",
"remainingTextFieldCharacterCountOther": "Noch $remainingCount Zeichen",
"refreshIndicatorSemanticLabel": "Aktualisieren"
"refreshIndicatorSemanticLabel": "Aktualisieren",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "απομένει 1 χαρακτήρας",
"remainingTextFieldCharacterCountOther": "απομένουν $remainingCount χαρακτήρες",
"refreshIndicatorSemanticLabel": "Ανανέωση"
"refreshIndicatorSemanticLabel": "Ανανέωση",
"moreButtonTooltip": "TBD"
}
......@@ -31,6 +31,11 @@
"description": "The tooltip for the delete button of chips."
},
"moreButtonTooltip": "More",
"@moreButtonTooltip": {
"description": "The tooltip for the more button in the text selection menu, which shows the overflowing menu items."
},
"nextMonthTooltip": "Next month",
"@nextMonthTooltip": {
"description": "The tooltip for the month picker's 'next month' button."
......
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Queda 1 carácter.",
"remainingTextFieldCharacterCountOther": "Quedan $remainingCount caracteres",
"refreshIndicatorSemanticLabel": "Actualizar"
"refreshIndicatorSemanticLabel": "Actualizar",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Jäänud on 1 tähemärk",
"remainingTextFieldCharacterCountOther": "Jäänud on $remainingCount tähemärki",
"refreshIndicatorSemanticLabel": "Värskendamine"
"refreshIndicatorSemanticLabel": "Värskendamine",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Zabaldu",
"remainingTextFieldCharacterCountOne": "1 karaktere geratzen da",
"remainingTextFieldCharacterCountOther": "$remainingCount karaktere geratzen dira",
"refreshIndicatorSemanticLabel": "Freskatu"
"refreshIndicatorSemanticLabel": "Freskatu",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "۱ نویسه باقی مانده است",
"remainingTextFieldCharacterCountOther": "$remainingCount نویسه باقی مانده است",
"refreshIndicatorSemanticLabel": "بازخوانی"
"refreshIndicatorSemanticLabel": "بازخوانی",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 merkki jäljellä",
"remainingTextFieldCharacterCountOther": "$remainingCount merkkiä jäljellä",
"refreshIndicatorSemanticLabel": "Päivitys"
"refreshIndicatorSemanticLabel": "Päivitys",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 character ang natitira",
"remainingTextFieldCharacterCountOther": "$remainingCount na character ang natitira",
"refreshIndicatorSemanticLabel": "Nagre-refresh"
"refreshIndicatorSemanticLabel": "Nagre-refresh",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 caractère restant",
"remainingTextFieldCharacterCountOther": "$remainingCount caractères restants",
"refreshIndicatorSemanticLabel": "Actualiser"
"refreshIndicatorSemanticLabel": "Actualiser",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 carácter restante",
"remainingTextFieldCharacterCountOther": "$remainingCount caracteres restantes",
"refreshIndicatorSemanticLabel": "Actualizar"
"refreshIndicatorSemanticLabel": "Actualizar",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Noch 1 Zeichen",
"remainingTextFieldCharacterCountOther": "Noch $remainingCount Zeichen",
"refreshIndicatorSemanticLabel": "Aktualisieren"
"refreshIndicatorSemanticLabel": "Aktualisieren",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "વિસ્તૃત કરો",
"remainingTextFieldCharacterCountOne": "1 અક્ષર બાકી",
"remainingTextFieldCharacterCountOther": "$remainingCount અક્ષર બાકી",
"refreshIndicatorSemanticLabel": "રિફ્રેશ કરો"
"refreshIndicatorSemanticLabel": "રિફ્રેશ કરો",
"moreButtonTooltip": "TBD"
}
......@@ -55,5 +55,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "נותר תו אחד",
"remainingTextFieldCharacterCountOther": "נותרו $remainingCount תווים",
"refreshIndicatorSemanticLabel": "רענון"
"refreshIndicatorSemanticLabel": "רענון",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "एक वर्ण अाैर डाला जा सकता है",
"remainingTextFieldCharacterCountOther": "$remainingCount वर्ण अाैर डाले जा सकते हैं",
"refreshIndicatorSemanticLabel": "रीफ़्रेश करें"
"refreshIndicatorSemanticLabel": "रीफ़्रेश करें",
"moreButtonTooltip": "TBD"
}
......@@ -53,5 +53,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Preostao je 1 znak",
"remainingTextFieldCharacterCountOther": "Preostalo je $remainingCount znakova",
"refreshIndicatorSemanticLabel": "Osvježi"
"refreshIndicatorSemanticLabel": "Osvježi",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 karakter maradt",
"remainingTextFieldCharacterCountOther": "$remainingCount karakter maradt",
"refreshIndicatorSemanticLabel": "Frissítés"
"refreshIndicatorSemanticLabel": "Frissítés",
"moreButtonTooltip": "TBD"
}
......@@ -56,5 +56,6 @@
"remainingTextFieldCharacterCountZero": "Նիշի հնարավորություն չկա",
"remainingTextFieldCharacterCountOne": "Մնացել է 1 նիշ",
"remainingTextFieldCharacterCountOther": "Մնացել է $remainingCount նիշ",
"refreshIndicatorSemanticLabel": "Թարմացնել"
"refreshIndicatorSemanticLabel": "Թարմացնել",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Sisa 1 karakter",
"remainingTextFieldCharacterCountOther": "Sisa $remainingCount karakter",
"refreshIndicatorSemanticLabel": "Memuat ulang"
"refreshIndicatorSemanticLabel": "Memuat ulang",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Stækka",
"remainingTextFieldCharacterCountOne": "1 stafur eftir",
"remainingTextFieldCharacterCountOther": "$remainingCount stafir eftir",
"refreshIndicatorSemanticLabel": "Endurnýja"
"refreshIndicatorSemanticLabel": "Endurnýja",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 carattere rimanente",
"remainingTextFieldCharacterCountOther": "$remainingCount caratteri rimanenti",
"refreshIndicatorSemanticLabel": "Aggiorna"
"refreshIndicatorSemanticLabel": "Aggiorna",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "残り 1 文字(半角相当)",
"remainingTextFieldCharacterCountOther": "残り $remainingCount 文字(半角相当)",
"refreshIndicatorSemanticLabel": "更新"
"refreshIndicatorSemanticLabel": "更新",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "გაშლა",
"remainingTextFieldCharacterCountOne": "დარჩა 1 სიმბოლო",
"remainingTextFieldCharacterCountOther": "დარჩა $remainingCount სიმბოლო",
"refreshIndicatorSemanticLabel": "განახლება"
"refreshIndicatorSemanticLabel": "განახლება",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"collapsedIconTapHint": "Жаю",
"remainingTextFieldCharacterCountZero": "Таңбалар қалмады",
"remainingTextFieldCharacterCountOther": "$remainingCount таңба қалды.",
"refreshIndicatorSemanticLabel": "Жаңарту"
"refreshIndicatorSemanticLabel": "Жаңарту",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "នៅសល់​ 1 តួ​ទៀត",
"remainingTextFieldCharacterCountOther": "នៅសល់ $remainingCount តួ​ទៀត",
"refreshIndicatorSemanticLabel": "ផ្ទុកឡើងវិញ"
"refreshIndicatorSemanticLabel": "ផ្ទុកឡើងវិញ",
"moreButtonTooltip": "TBD"
}
{
"scriptCategory": "\u0074\u0061\u006c\u006c",
"timeOfDayFormat": "\u0048\u003a\u006d\u006d",
"openAppDrawerTooltip": "\u0ca8\u0ccd\u0caf\u0cbe\u0cb5\u0cbf\u0c97\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0020\u0cae\u0cc6\u0ca8\u0cc1\u0020\u0ca4\u0cc6\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf",
"backButtonTooltip": "\u0cb9\u0cbf\u0c82\u0ca4\u0cbf\u0cb0\u0cc1\u0c97\u0cbf",
"closeButtonTooltip": "\u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf\u0cb0\u0cbf",
"deleteButtonTooltip": "\u0c85\u0cb3\u0cbf\u0cb8\u0cbf",
"nextMonthTooltip": "\u0cae\u0cc1\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",
"previousMonthTooltip": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",
"nextPageTooltip": "\u0cae\u0cc1\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0caa\u0cc1\u0c9f",
"previousPageTooltip": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8\u0020\u0caa\u0cc1\u0c9f",
"showMenuTooltip": "\u0cae\u0cc6\u0ca8\u0cc1\u0020\u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf",
"aboutListTileTitle": "\u0024\u0061\u0070\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u006f\u006e\u004e\u0061\u006d\u0065\u0020\u0cac\u0c97\u0ccd\u0c97\u0cc6",
"licensesPageTitle": "\u0caa\u0cb0\u0cb5\u0cbe\u0ca8\u0c97\u0cbf\u0c97\u0cb3\u0cc1",
"pageRowsInfoTitle": "\u0024\u0072\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0020\u0024\u0066\u0069\u0072\u0073\u0074\u0052\u006f\u0077\u2013\u0024\u006c\u0061\u0073\u0074\u0052\u006f\u0077",
"pageRowsInfoTitleApproximate": "\u0024\u0072\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0020\u0024\u0066\u0069\u0072\u0073\u0074\u0052\u006f\u0077\u2013\u0024\u006c\u0061\u0073\u0074\u0052\u006f\u0077",
"rowsPerPageTitle": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0020\u0caa\u0cc1\u0c9f\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cbe\u0cb2\u0cc1\u0c97\u0cb3\u0cc1\u003a",
"tabLabel": "\u0024\u0074\u0061\u0062\u0043\u006f\u0075\u006e\u0074\u0020\u0cb0\u0cb2\u0ccd\u0cb2\u0cbf\u0ca8\u0020\u0024\u0074\u0061\u0062\u0049\u006e\u0064\u0065\u0078\u0020\u0c9f\u0ccd\u0caf\u0cbe\u0cac\u0ccd",
"selectedRowCountTitleOne": "\u0031\u0020\u0c90\u0c9f\u0c82\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"selectedRowCountTitleOther": "\u0024\u0073\u0065\u006c\u0065\u0063\u0074\u0065\u0064\u0052\u006f\u0077\u0043\u006f\u0075\u006e\u0074\u0020\u0c90\u0c9f\u0c82\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"cancelButtonLabel": "\u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0cae\u0cbe\u0ca1\u0cbf",
"closeButtonLabel": "\u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf\u0cb0\u0cbf",
"continueButtonLabel": "\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf",
"copyButtonLabel": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf",
"cutButtonLabel": "\u0c95\u0ca4\u0ccd\u0ca4\u0cb0\u0cbf\u0cb8\u0cbf",
"okButtonLabel": "\u0cb8\u0cb0\u0cbf",
"pasteButtonLabel": "\u0c85\u0c82\u0c9f\u0cbf\u0cb8\u0cbf",
"selectAllButtonLabel": "\u0c8e\u0cb2\u0ccd\u0cb2\u0cb5\u0ca8\u0ccd\u0ca8\u0cc2\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"viewLicensesButtonLabel": "\u0caa\u0cb0\u0cb5\u0cbe\u0ca8\u0c97\u0cbf\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0cb5\u0cbf\u0cd5\u0c95\u0ccd\u0cb7\u0cbf\u0cb8\u0cbf",
"anteMeridiemAbbreviation": "\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6",
"postMeridiemAbbreviation": "\u0cb8\u0c82\u0c9c\u0cc6",
"timePickerHourModeAnnouncement": "\u0c97\u0c82\u0c9f\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"timePickerMinuteModeAnnouncement": "\u0ca8\u0cbf\u0cae\u0cbf\u0cb7\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"modalBarrierDismissLabel": "\u0cb5\u0c9c\u0cbe\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cbf",
"signedInLabel": "\u0cb8\u0cc8\u0ca8\u0ccd\u0020\u0c87\u0ca8\u0ccd\u0020\u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"hideAccountsLabel": "\u0c96\u0cbe\u0ca4\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0cae\u0cb0\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"showAccountsLabel": "\u0c96\u0cbe\u0ca4\u0cc6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1\u0020\u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf",
"drawerLabel": "\u0ca8\u0ccd\u0caf\u0cbe\u0cb5\u0cbf\u0c97\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0020\u0cae\u0cc6\u0ca8\u0cc1",
"popupMenuLabel": "\u0caa\u0cbe\u0caa\u0ccd\u0c85\u0caa\u0ccd\u0020\u0cae\u0cc6\u0ca8\u0cc1",
"dialogLabel": "\u0ca1\u0cc8\u0cb2\u0cbe\u0c97\u0ccd",
"alertDialogLabel": "\u0c8e\u0c9a\u0ccd\u0c9a\u0cb0\u0cbf\u0c95\u0cc6",
"searchFieldLabel": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf",
"reorderItemToStart": "\u0caa\u0ccd\u0cb0\u0cbe\u0cb0\u0c82\u0cad\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemToEnd": "\u0c95\u0cca\u0ca8\u0cc6\u0c97\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemUp": "\u0cae\u0cc7\u0cb2\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemDown": "\u0c95\u0cc6\u0cb3\u0c97\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemLeft": "\u0c8e\u0ca1\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"reorderItemRight": "\u0cac\u0cb2\u0c95\u0ccd\u0c95\u0cc6\u0020\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"expandedIconTapHint": "\u0c95\u0cc1\u0c97\u0ccd\u0c97\u0cbf\u0cb8\u0cbf",
"collapsedIconTapHint": "\u0cb5\u0cbf\u0cb8\u0ccd\u0ca4\u0cb0\u0cbf\u0cb8\u0cbf",
"remainingTextFieldCharacterCountOne": "\u0031\u0020\u0c85\u0c95\u0ccd\u0cb7\u0cb0\u0020\u0c89\u0cb3\u0cbf\u0ca6\u0cbf\u0ca6\u0cc6",
"remainingTextFieldCharacterCountOther": "\u0024\u0072\u0065\u006d\u0061\u0069\u006e\u0069\u006e\u0067\u0043\u006f\u0075\u006e\u0074\u0020\u0c85\u0c95\u0ccd\u0cb7\u0cb0\u0c97\u0cb3\u0cc1\u0020\u0c89\u0cb3\u0cbf\u0ca6\u0cbf\u0cb5\u0cc6",
"refreshIndicatorSemanticLabel": "\u0cb0\u0cbf\u0cab\u0ccd\u0cb0\u0cc6\u0cb6\u0ccd\u0020\u0cae\u0cbe\u0ca1\u0cbf"
"scriptCategory": "tall",
"timeOfDayFormat": "H:mm",
"openAppDrawerTooltip": "ನ್ಯಾವಿಗೇಶನ್‌ ಮೆನು ತೆರೆಯಿರಿ",
"backButtonTooltip": "ಹಿಂತಿರುಗಿ",
"closeButtonTooltip": "ಮುಚ್ಚಿರಿ",
"deleteButtonTooltip": "ಅಳಿಸಿ",
"nextMonthTooltip": "ಮುಂದಿನ ತಿಂಗಳು",
"previousMonthTooltip": "ಹಿಂದಿನ ತಿಂಗಳು",
"nextPageTooltip": "ಮುಂದಿನ ಪುಟ",
"previousPageTooltip": "ಹಿಂದಿನ ಪುಟ",
"showMenuTooltip": "ಮೆನು ತೋರಿಸಿ",
"aboutListTileTitle": "$applicationName ಬಗ್ಗೆ",
"licensesPageTitle": "ಪರವಾನಗಿಗಳು",
"pageRowsInfoTitle": "$rowCount ರಲ್ಲಿ $firstRow–$lastRow",
"pageRowsInfoTitleApproximate": "$rowCount ರಲ್ಲಿ $firstRow–$lastRow",
"rowsPerPageTitle": "ಪ್ರತಿ ಪುಟಕ್ಕೆ ಸಾಲುಗಳು:",
"tabLabel": "$tabCount ರಲ್ಲಿನ $tabIndex ಟ್ಯಾಬ್",
"selectedRowCountTitleOne": "1 ಐಟಂ ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ",
"selectedRowCountTitleOther": "$selectedRowCount ಐಟಂಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ",
"cancelButtonLabel": "ರದ್ದುಮಾಡಿ",
"closeButtonLabel": "ಮುಚ್ಚಿರಿ",
"continueButtonLabel": "ಮುಂದುವರಿಸಿ",
"copyButtonLabel": "ನಕಲಿಸಿ",
"cutButtonLabel": "ಕತ್ತರಿಸಿ",
"okButtonLabel": "ಸರಿ",
"pasteButtonLabel": "ಅಂಟಿಸಿ",
"selectAllButtonLabel": "ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆಮಾಡಿ",
"viewLicensesButtonLabel": "ಪರವಾನಗಿಗಳನ್ನು ವೀಕ್ಷಿಸಿ",
"anteMeridiemAbbreviation": "ಬೆಳಿಗ್ಗೆ",
"postMeridiemAbbreviation": "ಸಂಜೆ",
"timePickerHourModeAnnouncement": "ಗಂಟೆಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ",
"timePickerMinuteModeAnnouncement": "ನಿಮಿಷಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ",
"modalBarrierDismissLabel": "ವಜಾಗೊಳಿಸಿ",
"signedInLabel": "ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ",
"hideAccountsLabel": "ಖಾತೆಗಳನ್ನು ಮರೆಮಾಡಿ",
"showAccountsLabel": "ಖಾತೆಗಳನ್ನು ತೋರಿಸಿ",
"drawerLabel": "ನ್ಯಾವಿಗೇಶನ್‌ ಮೆನು",
"popupMenuLabel": "ಪಾಪ್ಅಪ್ ಮೆನು",
"dialogLabel": "ಡೈಲಾಗ್",
"alertDialogLabel": "ಎಚ್ಚರಿಕೆ",
"searchFieldLabel": "ಹುಡುಕಿ",
"reorderItemToStart": "ಪ್ರಾರಂಭಕ್ಕೆ ಸರಿಸಿ",
"reorderItemToEnd": "ಕೊನೆಗೆ ಸರಿಸಿ",
"reorderItemUp": "ಮೇಲೆ ಸರಿಸಿ",
"reorderItemDown": "ಕೆಳಗೆ ಸರಿಸಿ",
"reorderItemLeft": "ಎಡಕ್ಕೆ ಸರಿಸಿ",
"reorderItemRight": "ಬಲಕ್ಕೆ ಸರಿಸಿ",
"expandedIconTapHint": "ಕುಗ್ಗಿಸಿ",
"collapsedIconTapHint": "ವಿಸ್ತರಿಸಿ",
"remainingTextFieldCharacterCountOne": "1 ಅಕ್ಷರ ಉಳಿದಿದೆ",
"remainingTextFieldCharacterCountOther": "$remainingCount ಅಕ್ಷರಗಳು ಉಳಿದಿವೆ",
"refreshIndicatorSemanticLabel": "ರಿಫ್ರೆಶ್ ಮಾಡಿ",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1자 남음",
"remainingTextFieldCharacterCountOther": "$remainingCount자 남음",
"refreshIndicatorSemanticLabel": "새로고침"
"refreshIndicatorSemanticLabel": "새로고침",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Жайып көрсөтүү",
"remainingTextFieldCharacterCountOne": "1 белги калды",
"remainingTextFieldCharacterCountOther": "$remainingCount белги калды",
"refreshIndicatorSemanticLabel": "Жаңыртуу"
"refreshIndicatorSemanticLabel": "Жаңыртуу",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "ຂະຫຍາຍ",
"remainingTextFieldCharacterCountOne": "ຍັງອີກ 1 ຕົວອັກສອນ",
"remainingTextFieldCharacterCountOther": "ຍັງອີກ $remainingCount ຕົວອັກສອນ",
"refreshIndicatorSemanticLabel": "ໂຫຼດຄືນໃໝ່"
"refreshIndicatorSemanticLabel": "ໂຫຼດຄືນໃໝ່",
"moreButtonTooltip": "TBD"
}
......@@ -55,5 +55,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Liko 1 simbolis",
"remainingTextFieldCharacterCountOther": "Liko $remainingCount simbolių",
"refreshIndicatorSemanticLabel": "Atnaujinti"
"refreshIndicatorSemanticLabel": "Atnaujinti",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "Nav atlikusi neviena rakstzīme.",
"remainingTextFieldCharacterCountOne": "Atlikusi 1 rakstzīme.",
"remainingTextFieldCharacterCountOther": "Atlikušas $remainingCount rakstzīmes.",
"refreshIndicatorSemanticLabel": "Atsvaidzināt"
"refreshIndicatorSemanticLabel": "Atsvaidzināt",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Прошири",
"remainingTextFieldCharacterCountOne": "Преостанува уште 1 знак",
"remainingTextFieldCharacterCountOther": "Преостануваат уште $remainingCount знаци",
"refreshIndicatorSemanticLabel": "Освежи"
"refreshIndicatorSemanticLabel": "Освежи",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "വികസിപ്പിക്കുക",
"remainingTextFieldCharacterCountOne": "ഒരു പ്രതീകം ശേഷിക്കുന്നു",
"remainingTextFieldCharacterCountOther": "$remainingCount പ്രതീകങ്ങൾ ശേഷിക്കുന്നു",
"refreshIndicatorSemanticLabel": "പുതുക്കിയെടുക്കുക"
"refreshIndicatorSemanticLabel": "പുതുക്കിയെടുക്കുക",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "No characters remaining",
"remainingTextFieldCharacterCountOne": "1 тэмдэгт үлдсэн",
"remainingTextFieldCharacterCountOther": "$remainingCount тэмдэгт үлдсэн",
"refreshIndicatorSemanticLabel": "Сэргээх"
"refreshIndicatorSemanticLabel": "Сэргээх",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "कोणतेही वर्ण शिल्लक नाहीत",
"remainingTextFieldCharacterCountOne": "एक वर्ण शिल्लक",
"remainingTextFieldCharacterCountOther": "$remainingCount वर्ण शिल्लक",
"refreshIndicatorSemanticLabel": "रिफ्रेश करा"
"refreshIndicatorSemanticLabel": "रिफ्रेश करा",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 aksara lagi",
"remainingTextFieldCharacterCountOther": "$remainingCount aksara lagi",
"refreshIndicatorSemanticLabel": "Muat semula"
"refreshIndicatorSemanticLabel": "Muat semula",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "ချဲ့ရန်",
"remainingTextFieldCharacterCountOne": "အက္ခရာ ၁ လုံးကျန်သည်",
"remainingTextFieldCharacterCountOther": "အက္ခရာ $remainingCount လုံးကျန်သည်",
"refreshIndicatorSemanticLabel": "ပြန်လည်စတင်ရန်"
"refreshIndicatorSemanticLabel": "ပြန်လည်စတင်ရန်",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 tegn gjenstår",
"remainingTextFieldCharacterCountOther": "$remainingCount tegn gjenstår",
"refreshIndicatorSemanticLabel": "Laster inn på nytt"
"refreshIndicatorSemanticLabel": "Laster inn på nytt",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "विस्तार गर्नुहोस्",
"remainingTextFieldCharacterCountOne": "१ वर्ण बाँकी",
"remainingTextFieldCharacterCountOther": "$remainingCount वर्णहरू बाँकी",
"refreshIndicatorSemanticLabel": "पुनः ताजा गर्नुहोस्"
"refreshIndicatorSemanticLabel": "पुनः ताजा गर्नुहोस्",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 teken resterend",
"remainingTextFieldCharacterCountOther": "$remainingCount tekens resterend",
"refreshIndicatorSemanticLabel": "Vernieuwen"
"refreshIndicatorSemanticLabel": "Vernieuwen",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "ପ୍ରସାରିତ କରନ୍ତୁ",
"remainingTextFieldCharacterCountOne": "1ଟି ଅକ୍ଷର ବାକି ଅଛି",
"remainingTextFieldCharacterCountOther": "$remainingCountଟି ଅକ୍ଷର ବାକି ଅଛି",
"refreshIndicatorSemanticLabel": "ରିଫ୍ରେସ୍ କରନ୍ତୁ"
"refreshIndicatorSemanticLabel": "ରିଫ୍ରେସ୍ କରନ୍ତୁ",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "ਵਿਸਤਾਰ ਕਰੋ",
"remainingTextFieldCharacterCountOne": "1 ਅੱਖਰ-ਚਿੰਨ੍ਹ ਬਾਕੀ",
"remainingTextFieldCharacterCountOther": "$remainingCount ਅੱਖਰ-ਚਿੰਨ੍ਹ ਬਾਕੀ",
"refreshIndicatorSemanticLabel": "ਰਿਫ੍ਰੈਸ਼ ਕਰੋ"
"refreshIndicatorSemanticLabel": "ਰਿਫ੍ਰੈਸ਼ ਕਰੋ",
"moreButtonTooltip": "TBD"
}
......@@ -55,5 +55,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Jeszcze 1 znak",
"remainingTextFieldCharacterCountOther": "Pozostało $remainingCount znaków",
"refreshIndicatorSemanticLabel": "Odśwież"
"refreshIndicatorSemanticLabel": "Odśwież",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "TBD",
"remainingTextFieldCharacterCountOther": "TBD",
"refreshIndicatorSemanticLabel": "TBD"
"refreshIndicatorSemanticLabel": "TBD",
"moreButtonTooltip": "TBD"
}
......@@ -53,5 +53,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 caractere restante",
"remainingTextFieldCharacterCountOther": "$remainingCount caracteres restantes",
"refreshIndicatorSemanticLabel": "Atualizar"
"refreshIndicatorSemanticLabel": "Atualizar",
"moreButtonTooltip": "TBD"
}
......@@ -54,5 +54,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "un caracter rămas",
"remainingTextFieldCharacterCountOther": "$remainingCount de caractere rămase",
"refreshIndicatorSemanticLabel": "Actualizați"
"refreshIndicatorSemanticLabel": "Actualizați",
"moreButtonTooltip": "TBD"
}
......@@ -56,5 +56,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Остался 1 символ",
"remainingTextFieldCharacterCountOther": "Осталось $remainingCount символа",
"refreshIndicatorSemanticLabel": "Обновление"
"refreshIndicatorSemanticLabel": "Обновление",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "දිග හරින්න",
"remainingTextFieldCharacterCountOne": "අනුලකුණු 1ක් ඉතිරිය",
"remainingTextFieldCharacterCountOther": "අනුලකුණු $remainingCountක් ඉතිරිය",
"refreshIndicatorSemanticLabel": "නැවුම් කරන්න"
"refreshIndicatorSemanticLabel": "නැවුම් කරන්න",
"moreButtonTooltip": "TBD"
}
......@@ -55,5 +55,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Zostáva 1 znak",
"remainingTextFieldCharacterCountOther": "Zostáva $remainingCount znakov",
"refreshIndicatorSemanticLabel": "Obnoviť"
"refreshIndicatorSemanticLabel": "Obnoviť",
"moreButtonTooltip": "TBD"
}
......@@ -55,5 +55,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Še 1 znak",
"remainingTextFieldCharacterCountOther": "Še $remainingCount znakov",
"refreshIndicatorSemanticLabel": "Osveži"
"refreshIndicatorSemanticLabel": "Osveži",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Zgjero",
"remainingTextFieldCharacterCountOne": "1 karakter i mbetur",
"remainingTextFieldCharacterCountOther": "$remainingCount karaktere të mbetura",
"refreshIndicatorSemanticLabel": "Rifresko"
"refreshIndicatorSemanticLabel": "Rifresko",
"moreButtonTooltip": "TBD"
}
......@@ -53,5 +53,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Преостао је 1 знак",
"remainingTextFieldCharacterCountOther": "Преостало је $remainingCount знакова",
"refreshIndicatorSemanticLabel": "Освежи"
"refreshIndicatorSemanticLabel": "Освежи",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 tecken kvar",
"remainingTextFieldCharacterCountOther": "$remainingCount tecken kvar",
"refreshIndicatorSemanticLabel": "Uppdatera"
"refreshIndicatorSemanticLabel": "Uppdatera",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "Hapana herufi zilizo baki",
"remainingTextFieldCharacterCountOne": "Imesalia herufi 1",
"remainingTextFieldCharacterCountOther": "Zimesalia herufi $remainingCount",
"refreshIndicatorSemanticLabel": "Onyesha upya"
"refreshIndicatorSemanticLabel": "Onyesha upya",
"moreButtonTooltip": "TBD"
}
......@@ -52,5 +52,6 @@
"remainingTextFieldCharacterCountZero": "எழுத்துக்கள் எதுவும் இல்லை",
"remainingTextFieldCharacterCountOne": "1 எழுத்து மீதமுள்ளது",
"remainingTextFieldCharacterCountOther": "$remainingCount எழுத்துகள் மீதமுள்ளன",
"refreshIndicatorSemanticLabel": "ரெஃப்ரெஷ் செய்யும்"
"refreshIndicatorSemanticLabel": "ரெஃப்ரெஷ் செய்யும்",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "విస్తరించు",
"remainingTextFieldCharacterCountOne": "1 అక్షరం మిగిలి ఉంది",
"remainingTextFieldCharacterCountOther": "$remainingCount అక్షరాలు మిగిలి ఉన్నాయి",
"refreshIndicatorSemanticLabel": "రిఫ్రెష్ చేయి"
"refreshIndicatorSemanticLabel": "రిఫ్రెష్ చేయి",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "เหลือ 1 อักขระ",
"remainingTextFieldCharacterCountOther": "เหลือ $remainingCount อักขระ",
"refreshIndicatorSemanticLabel": "รีเฟรช"
"refreshIndicatorSemanticLabel": "รีเฟรช",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 character ang natitira",
"remainingTextFieldCharacterCountOther": "$remainingCount na character ang natitira",
"refreshIndicatorSemanticLabel": "Nagre-refresh"
"refreshIndicatorSemanticLabel": "Nagre-refresh",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 karakter kaldı",
"remainingTextFieldCharacterCountOther": "$remainingCount karakter kaldı",
"refreshIndicatorSemanticLabel": "Yenile"
"refreshIndicatorSemanticLabel": "Yenile",
"moreButtonTooltip": "TBD"
}
......@@ -55,5 +55,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Залишився 1 символ",
"remainingTextFieldCharacterCountOther": "Залишилося $remainingCount символу",
"refreshIndicatorSemanticLabel": "Оновити"
"refreshIndicatorSemanticLabel": "Оновити",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "1 حرف باقی ہے",
"remainingTextFieldCharacterCountOther": "$remainingCount حروف باقی ہیں",
"refreshIndicatorSemanticLabel": "ریفریش کریں"
"refreshIndicatorSemanticLabel": "ریفریش کریں",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Yoyish",
"remainingTextFieldCharacterCountOne": "1 ta belgi qoldi",
"remainingTextFieldCharacterCountOther": "$remainingCount ta belgi qoldi",
"refreshIndicatorSemanticLabel": "Yangilash"
"refreshIndicatorSemanticLabel": "Yangilash",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "Còn lại 1 ký tự",
"remainingTextFieldCharacterCountOther": "Còn lại $remainingCount ký tự",
"refreshIndicatorSemanticLabel": "Làm mới"
"refreshIndicatorSemanticLabel": "Làm mới",
"moreButtonTooltip": "TBD"
}
......@@ -51,5 +51,6 @@
"remainingTextFieldCharacterCountZero": "TBD",
"remainingTextFieldCharacterCountOne": "还可输入 1 个字符",
"remainingTextFieldCharacterCountOther": "还可输入 $remainingCount 个字符",
"refreshIndicatorSemanticLabel": "刷新"
"refreshIndicatorSemanticLabel": "刷新",
"moreButtonTooltip": "TBD"
}
......@@ -50,5 +50,6 @@
"collapsedIconTapHint": "Nweba",
"remainingTextFieldCharacterCountOne": "1 uhlamvu olusele",
"remainingTextFieldCharacterCountOther": "$remainingCount izinhlamvu ezisele",
"refreshIndicatorSemanticLabel": "Vuselela"
"refreshIndicatorSemanticLabel": "Vuselela",
"moreButtonTooltip": "TBD"
}
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