mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Text Selection Overflow (Android) (#49391)
Adds an overflow menu to the text selection menu on Android when the items overflow.
This commit is contained in:
parent
5e74b004b8
commit
4841a7ed6f
@ -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(
|
||||
elevation: 1.0,
|
||||
child: Container(
|
||||
height: _kToolbarHeight,
|
||||
child: Row(mainAxisSize: MainAxisSize.min, children: items),
|
||||
|
||||
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: _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,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Centers the toolbar around the given position, ensuring that it remains on
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
/// Anchor position of the toolbar, relative to the top left of the
|
||||
/// [globalEditableRegion].
|
||||
final Offset position;
|
||||
/// 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;
|
||||
}
|
||||
|
||||
// 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);
|
||||
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 ConstrainedBox(
|
||||
constraints: BoxConstraints.tight(globalEditableRegion.size),
|
||||
child: CustomSingleChildLayout(
|
||||
delegate: _TextSelectionToolbarLayout(
|
||||
MediaQuery.of(context).size,
|
||||
globalEditableRegion,
|
||||
preciseMidpoint,
|
||||
return Stack(
|
||||
children: <Widget>[
|
||||
CustomSingleChildLayout(
|
||||
delegate: _TextSelectionToolbarLayout(
|
||||
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,
|
||||
),
|
||||
),
|
||||
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,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
47
packages/flutter/test/material/text.dart
Normal file
47
packages/flutter/test/material/text.dart
Normal file
@ -0,0 +1,47 @@
|
||||
// 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"
|
||||
}
|
||||
|
||||
@ -1,54 +1,55 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user