mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 12:09:43 +00:00
Merge branch 'main' of https://github.com/cake-tech/cake_wallet into CW-78-Ethereum
Conflicts: lib/src/screens/dashboard/widgets/balance_page.dart res/values/strings_ar.arb res/values/strings_bg.arb res/values/strings_cs.arb res/values/strings_de.arb res/values/strings_en.arb res/values/strings_es.arb res/values/strings_fr.arb res/values/strings_ha.arb res/values/strings_hi.arb res/values/strings_hr.arb res/values/strings_id.arb res/values/strings_it.arb res/values/strings_ja.arb res/values/strings_ko.arb res/values/strings_my.arb res/values/strings_nl.arb res/values/strings_pl.arb res/values/strings_pt.arb res/values/strings_ru.arb res/values/strings_th.arb res/values/strings_tr.arb res/values/strings_uk.arb res/values/strings_ur.arb res/values/strings_yo.arb res/values/strings_zh.arb
This commit is contained in:
commit
fa494af5ab
51 changed files with 476 additions and 322 deletions
|
@ -86,4 +86,5 @@ abstract class ElectrumTransactionHistoryBase
|
|||
|
||||
void _update(ElectrumTransactionInfo transaction) =>
|
||||
transactions[transaction.id] = transaction;
|
||||
|
||||
}
|
||||
|
|
|
@ -14,6 +14,8 @@ abstract class TransactionHistoryBase<TransactionType extends TransactionInfo> {
|
|||
|
||||
void addMany(Map<String, TransactionType> transactions);
|
||||
|
||||
void clear() => transactions.clear();
|
||||
|
||||
// bool _isUpdating;
|
||||
|
||||
// @action
|
||||
|
|
|
@ -24,4 +24,5 @@ abstract class MoneroTransactionHistoryBase
|
|||
@override
|
||||
void addMany(Map<String, MoneroTransactionInfo> transactions) =>
|
||||
this.transactions.addAll(transactions);
|
||||
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import 'package:cake_wallet/palette.dart';
|
|||
import 'package:cake_wallet/di.dart';
|
||||
import 'package:cake_wallet/store/settings_store.dart';
|
||||
import 'package:cake_wallet/src/widgets/nav_bar.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
||||
enum AppBarStyle { regular, withShadow, transparent }
|
||||
|
||||
|
@ -58,7 +59,7 @@ abstract class BasePage extends StatelessWidget {
|
|||
child: ButtonTheme(
|
||||
minWidth: double.minPositive,
|
||||
child: Semantics(
|
||||
label: 'Back',
|
||||
label: S.of(context).seed_alert_back,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
overlayColor: MaterialStateColor.resolveWith(
|
||||
|
|
|
@ -24,35 +24,40 @@ class ContactListPage extends BasePage {
|
|||
|
||||
@override
|
||||
Widget? trailing(BuildContext context) {
|
||||
return Container(
|
||||
width: 32.0,
|
||||
height: 32.0,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Theme.of(context)
|
||||
return MergeSemantics(
|
||||
child: Container(
|
||||
width: 32.0,
|
||||
height: 32.0,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme!
|
||||
.bodySmall!
|
||||
.color!),
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: <Widget>[
|
||||
Icon(Icons.add,
|
||||
color: Theme.of(context).primaryTextTheme!.titleLarge!.color!,
|
||||
size: 22.0),
|
||||
ButtonTheme(
|
||||
minWidth: 32.0,
|
||||
height: 32.0,
|
||||
child: TextButton(
|
||||
// FIX-ME: Style
|
||||
//shape: CircleBorder(),
|
||||
onPressed: () async {
|
||||
await Navigator.of(context)
|
||||
.pushNamed(Routes.addressBookAddContact);
|
||||
},
|
||||
child: Offstage()),
|
||||
)
|
||||
],
|
||||
));
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: <Widget>[
|
||||
Icon(Icons.add,
|
||||
color: Theme.of(context).primaryTextTheme!.titleLarge!.color!,
|
||||
size: 22.0),
|
||||
ButtonTheme(
|
||||
minWidth: 32.0,
|
||||
height: 32.0,
|
||||
child: Semantics(
|
||||
label: S.of(context).add,
|
||||
child: TextButton(
|
||||
// FIX-ME: Style
|
||||
//shape: CircleBorder(),
|
||||
onPressed: () async {
|
||||
await Navigator.of(context)
|
||||
.pushNamed(Routes.addressBookAddContact);
|
||||
},
|
||||
child: Offstage()),
|
||||
),
|
||||
)
|
||||
],
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -111,7 +111,8 @@ class _DashboardPageView extends BasePage {
|
|||
//splashColor: Colors.transparent,
|
||||
//padding: EdgeInsets.all(0),
|
||||
onPressed: () => onOpenEndDrawer(),
|
||||
child: Semantics(label: 'Menu', child: menuButton)));
|
||||
child: Semantics(
|
||||
label: S.of(context).wallet_menu, child: menuButton)));
|
||||
}
|
||||
|
||||
final DashboardViewModel dashboardViewModel;
|
||||
|
@ -248,7 +249,7 @@ class _DashboardPageView extends BasePage {
|
|||
}
|
||||
if (dashboardViewModel.shouldShowMarketPlaceInDashboard) {
|
||||
pages.add(Semantics(
|
||||
label: 'Marketplace Page',
|
||||
label: S.of(context).market_place,
|
||||
child: MarketPlacePage(
|
||||
dashboardViewModel: dashboardViewModel,
|
||||
marketPlaceViewModel: getIt.get<MarketPlaceViewModel>(),
|
||||
|
@ -256,9 +257,9 @@ class _DashboardPageView extends BasePage {
|
|||
),
|
||||
);
|
||||
}
|
||||
pages.add(Semantics(label: 'Balance Page', child: balancePage));
|
||||
pages.add(Semantics(label: S.of(context).balance_page, child: balancePage));
|
||||
pages.add(Semantics(
|
||||
label: 'Transactions Page',
|
||||
label: S.of(context).settings_transactions,
|
||||
child: TransactionsPage(dashboardViewModel: dashboardViewModel)));
|
||||
_isEffectsInstalled = true;
|
||||
|
||||
|
|
|
@ -14,72 +14,75 @@ class DesktopDashboardActions extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Observer(
|
||||
builder: (_) {
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 16),
|
||||
DesktopActionButton(
|
||||
title: MainActions.exchangeAction.name(context),
|
||||
image: MainActions.exchangeAction.image,
|
||||
canShow: MainActions.exchangeAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.exchangeAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.exchangeAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.receiveAction.name(context),
|
||||
image: MainActions.receiveAction.image,
|
||||
canShow: MainActions.receiveAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.receiveAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async =>
|
||||
await MainActions.receiveAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.sendAction.name(context),
|
||||
image: MainActions.sendAction.image,
|
||||
canShow: MainActions.sendAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.sendAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.sendAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.buyAction.name(context),
|
||||
image: MainActions.buyAction.image,
|
||||
canShow: MainActions.buyAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.buyAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.buyAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.sellAction.name(context),
|
||||
image: MainActions.sellAction.image,
|
||||
canShow: MainActions.sellAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.sellAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.sellAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
child: MarketPlacePage(
|
||||
dashboardViewModel: dashboardViewModel,
|
||||
marketPlaceViewModel: getIt.get<MarketPlaceViewModel>(),
|
||||
return Container(
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
child: Observer(
|
||||
builder: (_) {
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 16),
|
||||
DesktopActionButton(
|
||||
title: MainActions.exchangeAction.name(context),
|
||||
image: MainActions.exchangeAction.image,
|
||||
canShow: MainActions.exchangeAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.exchangeAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.exchangeAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.receiveAction.name(context),
|
||||
image: MainActions.receiveAction.image,
|
||||
canShow: MainActions.receiveAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.receiveAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async =>
|
||||
await MainActions.receiveAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.sendAction.name(context),
|
||||
image: MainActions.sendAction.image,
|
||||
canShow: MainActions.sendAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.sendAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.sendAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.buyAction.name(context),
|
||||
image: MainActions.buyAction.image,
|
||||
canShow: MainActions.buyAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.buyAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.buyAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: DesktopActionButton(
|
||||
title: MainActions.sellAction.name(context),
|
||||
image: MainActions.sellAction.image,
|
||||
canShow: MainActions.sellAction.canShow?.call(dashboardViewModel),
|
||||
isEnabled: MainActions.sellAction.isEnabled?.call(dashboardViewModel),
|
||||
onTap: () async => await MainActions.sellAction.onTap(context, dashboardViewModel),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
child: MarketPlacePage(
|
||||
dashboardViewModel: dashboardViewModel,
|
||||
marketPlaceViewModel: getIt.get<MarketPlaceViewModel>(),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -77,27 +77,21 @@ class DesktopSidebarWrapper extends BasePage {
|
|||
SideMenuItem(
|
||||
imagePath: 'assets/images/wallet_outline.png',
|
||||
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.dashboard,
|
||||
onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.dashboard),
|
||||
onTap: () {
|
||||
desktopSidebarViewModel.onPageChange(SidebarItem.dashboard);
|
||||
desktopNavigatorKey.currentState
|
||||
?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
|
||||
},
|
||||
),
|
||||
SideMenuItem(
|
||||
onTap: () {
|
||||
String? currentPath;
|
||||
|
||||
desktopNavigatorKey.currentState?.popUntil((route) {
|
||||
currentPath = route.settings.name;
|
||||
return true;
|
||||
});
|
||||
|
||||
switch (currentPath) {
|
||||
case Routes.transactionsPage:
|
||||
desktopSidebarViewModel.resetSidebar();
|
||||
break;
|
||||
default:
|
||||
desktopSidebarViewModel.resetSidebar();
|
||||
Future.delayed(Duration(milliseconds: 10), () {
|
||||
desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
|
||||
desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
|
||||
});
|
||||
if (desktopSidebarViewModel.currentPage == SidebarItem.transactions) {
|
||||
desktopNavigatorKey.currentState
|
||||
?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
|
||||
desktopSidebarViewModel.resetSidebar();
|
||||
} else {
|
||||
desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
|
||||
desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
|
||||
}
|
||||
},
|
||||
isSelected: desktopSidebarViewModel.currentPage == SidebarItem.transactions,
|
||||
|
@ -156,20 +150,11 @@ class DesktopSidebarWrapper extends BasePage {
|
|||
|
||||
void _setEffects() async {
|
||||
reaction<SidebarItem>((_) => desktopSidebarViewModel.currentPage, (page) {
|
||||
String? currentPath;
|
||||
|
||||
desktopNavigatorKey.currentState?.popUntil((route) {
|
||||
currentPath = route.settings.name;
|
||||
return true;
|
||||
});
|
||||
if (page == SidebarItem.transactions) {
|
||||
if (page == SidebarItem.dashboard) {
|
||||
pageController.jumpToPage(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentPath == Routes.transactionsPage) {
|
||||
Navigator.of(desktopNavigatorKey.currentContext!).pop();
|
||||
}
|
||||
pageController.jumpToPage(page.index);
|
||||
pageController.jumpToPage(page.index - 1);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,7 +82,9 @@ class AddressPage extends BasePage {
|
|||
child: ButtonTheme(
|
||||
minWidth: double.minPositive,
|
||||
child: Semantics(
|
||||
label: !isMobileView ? 'Close' : 'Back',
|
||||
label: !isMobileView
|
||||
? S.of(context).close
|
||||
: S.of(context).seed_alert_back,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
overlayColor: MaterialStateColor.resolveWith(
|
||||
|
|
|
@ -2,6 +2,7 @@ import 'package:cake_wallet/routes.dart';
|
|||
import 'package:cake_wallet/src/screens/exchange_trade/information_page.dart';
|
||||
import 'package:cake_wallet/store/settings_store.dart';
|
||||
import 'package:cake_wallet/themes/theme_base.dart';
|
||||
import 'package:cake_wallet/utils/feature_flag.dart';
|
||||
import 'package:cake_wallet/utils/responsive_layout_util.dart';
|
||||
import 'package:cake_wallet/utils/show_pop_up.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -17,9 +18,6 @@ class BalancePage extends StatelessWidget {
|
|||
final DashboardViewModel dashboardViewModel;
|
||||
final SettingsStore settingsStore;
|
||||
|
||||
Color get backgroundLightColor =>
|
||||
settingsStore.currentTheme.type == ThemeType.bright ? Colors.transparent : Colors.white;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
|
@ -70,7 +68,7 @@ class BalancePage extends StatelessWidget {
|
|||
),
|
||||
Observer(
|
||||
builder: (_) {
|
||||
if (dashboardViewModel.balanceViewModel.isShowCard) {
|
||||
if (dashboardViewModel.balanceViewModel.isShowCard && FeatureFlag.isCakePayEnabled) {
|
||||
return IntroducingCard(
|
||||
title: S.of(context).introducing_cake_pay,
|
||||
subTitle: S.of(context).cake_pay_learn_more,
|
||||
|
|
|
@ -52,7 +52,10 @@ class MarketPlacePage extends StatelessWidget {
|
|||
children: <Widget>[
|
||||
SizedBox(height: 20),
|
||||
DashBoardRoundedCardWidget(
|
||||
onTap: () => _navigatorToGiftCardsPage(context),
|
||||
onTap: () => launchUrl(
|
||||
Uri.parse("https://cakelabs.com/news/cake-pay-mobile-to-shut-down/"),
|
||||
mode: LaunchMode.externalApplication,
|
||||
),
|
||||
title: S.of(context).cake_pay_title,
|
||||
subTitle: S.of(context).cake_pay_subtitle,
|
||||
),
|
||||
|
@ -75,6 +78,7 @@ class MarketPlacePage extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
|
||||
// TODO: Remove ionia flow/files if we will discard it
|
||||
void _navigatorToGiftCardsPage(BuildContext context) {
|
||||
final walletType = dashboardViewModel.type;
|
||||
|
||||
|
|
|
@ -126,7 +126,9 @@ class ExchangePage extends BasePage {
|
|||
child: ButtonTheme(
|
||||
minWidth: double.minPositive,
|
||||
child: Semantics(
|
||||
label: !isMobileView ? 'Close' : 'Back',
|
||||
label: !isMobileView
|
||||
? S.of(context).close
|
||||
: S.of(context).seed_alert_back,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
overlayColor: MaterialStateColor.resolveWith(
|
||||
|
|
|
@ -66,40 +66,6 @@ class IoniaManageCardsPage extends BasePage {
|
|||
@override
|
||||
Widget get endDrawer => CardMenu();
|
||||
|
||||
@override
|
||||
Widget leading(BuildContext context) {
|
||||
final _backButton = Icon(
|
||||
Icons.arrow_back_ios,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme!
|
||||
.displayMedium!
|
||||
.backgroundColor!,
|
||||
size: 16,
|
||||
);
|
||||
|
||||
return SizedBox(
|
||||
height: 37,
|
||||
width: 37,
|
||||
child: ButtonTheme(
|
||||
minWidth: double.minPositive,
|
||||
child: TextButton(
|
||||
// FIX-ME: Style
|
||||
//highlightColor: Colors.transparent,
|
||||
//splashColor: Colors.transparent,
|
||||
//padding: EdgeInsets.all(0),
|
||||
onPressed: (){
|
||||
if (searchFocusNode.hasFocus) {
|
||||
searchFocusNode.unfocus();
|
||||
return;
|
||||
}
|
||||
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
child: _backButton),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget middle(BuildContext context) {
|
||||
return Text(
|
||||
|
@ -123,26 +89,28 @@ class IoniaManageCardsPage extends BasePage {
|
|||
|
||||
@override
|
||||
Widget body(BuildContext context) {
|
||||
final filterButton = InkWell(
|
||||
onTap: () async {
|
||||
await showCategoryFilter(context);
|
||||
_cardsListViewModel.getMerchants();
|
||||
},
|
||||
child: Container(
|
||||
width: 32,
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).textTheme!.titleLarge!.backgroundColor!,
|
||||
border: Border.all(
|
||||
color: Colors.white.withOpacity(0.2),
|
||||
final filterButton = Semantics(
|
||||
label: S.of(context).filter_by,
|
||||
child: InkWell(
|
||||
onTap: () async {
|
||||
await showCategoryFilter(context);
|
||||
_cardsListViewModel.getMerchants();
|
||||
},
|
||||
child: Container(
|
||||
width: 32,
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).textTheme!.titleLarge!.backgroundColor!,
|
||||
border: Border.all(
|
||||
color: Colors.white.withOpacity(0.2),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
child: Image.asset(
|
||||
'assets/images/filter.png',
|
||||
color: Theme.of(context).textTheme!.bodySmall!.decorationColor!,
|
||||
),
|
||||
)
|
||||
child: Image.asset(
|
||||
'assets/images/filter.png',
|
||||
color: Theme.of(context).textTheme!.bodySmall!.decorationColor!,
|
||||
),
|
||||
)),
|
||||
);
|
||||
|
||||
return Padding(
|
||||
|
@ -281,11 +249,13 @@ class _SearchWidget extends StatelessWidget {
|
|||
final FocusNode focusNode;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final searchIcon = Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Image.asset(
|
||||
'assets/images/mini_search_icon.png',
|
||||
color: Theme.of(context).textTheme!.bodySmall!.decorationColor!,
|
||||
final searchIcon = ExcludeSemantics(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8),
|
||||
child: Image.asset(
|
||||
'assets/images/mini_search_icon.png',
|
||||
color: Theme.of(context).textTheme!.bodySmall!.decorationColor!,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
|
@ -335,18 +305,22 @@ class _TrailingIcon extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Material(
|
||||
color: Colors.transparent,
|
||||
child: IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
constraints: BoxConstraints(),
|
||||
highlightColor: Colors.transparent,
|
||||
splashColor: Colors.transparent,
|
||||
iconSize: 25,
|
||||
onPressed: onPressed,
|
||||
icon: Image.asset(
|
||||
asset,
|
||||
color: Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!,
|
||||
return Semantics(
|
||||
label: S.of(context).profile,
|
||||
child: Material(
|
||||
color: Colors.transparent,
|
||||
child: IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
constraints: BoxConstraints(),
|
||||
highlightColor: Colors.transparent,
|
||||
splashColor: Colors.transparent,
|
||||
iconSize: 25,
|
||||
onPressed: onPressed,
|
||||
icon: Image.asset(
|
||||
asset,
|
||||
color:
|
||||
Theme.of(context).accentTextTheme!.displayMedium!.backgroundColor!,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -118,19 +118,21 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
|
|||
textColor: Colors.white,
|
||||
),
|
||||
const SizedBox(height: 25),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: MediaQuery.of(context).size.width * 0.15),
|
||||
child: Text(
|
||||
S.of(context).settings_can_be_changed_later,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
LayoutBuilder(
|
||||
builder: (_, constraints) => SizedBox(
|
||||
width: constraints.maxWidth * 0.8,
|
||||
child: Text(
|
||||
S.of(context).settings_can_be_changed_later,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme!
|
||||
.displayMedium!
|
||||
.color,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -146,7 +146,7 @@ class _WalletNameFormState extends State<WalletNameForm> {
|
|||
width: 1.0),
|
||||
),
|
||||
suffixIcon: Semantics(
|
||||
label: 'Generate Name',
|
||||
label: S.of(context).generate_name,
|
||||
child: IconButton(
|
||||
onPressed: () async {
|
||||
final rName = await generateName();
|
||||
|
|
|
@ -115,6 +115,7 @@ class NodeCreateOrEditPage extends BasePage {
|
|||
bottomSectionPadding: EdgeInsets.only(bottom: 24),
|
||||
bottomSection: Observer(
|
||||
builder: (_) => Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Flexible(
|
||||
child: Container(
|
||||
|
|
|
@ -226,7 +226,7 @@ class PinCodeState<T extends PinCodeWidget> extends State<T> {
|
|||
child: Container(
|
||||
margin: EdgeInsets.only(left: marginLeft, right: marginRight),
|
||||
child: Semantics(
|
||||
label: 'Delete',
|
||||
label: S.of(context).delete,
|
||||
button: true,
|
||||
onTap: () => _pop(),
|
||||
child: TextButton(
|
||||
|
|
|
@ -87,7 +87,7 @@ class ReceivePage extends BasePage {
|
|||
return Material(
|
||||
color: Colors.transparent,
|
||||
child: Semantics(
|
||||
label: 'Share',
|
||||
label: S.of(context).share,
|
||||
child: IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
constraints: BoxConstraints(),
|
||||
|
|
|
@ -71,7 +71,7 @@ class AddressCell extends StatelessWidget {
|
|||
),
|
||||
));
|
||||
return Semantics(
|
||||
label: 'Slidable',
|
||||
label: S.of(context).slidable,
|
||||
selected: isCurrent,
|
||||
enabled: !isCurrent,
|
||||
child: Slidable(
|
||||
|
|
|
@ -71,7 +71,9 @@ class SendPage extends BasePage {
|
|||
child: ButtonTheme(
|
||||
minWidth: double.minPositive,
|
||||
child: Semantics(
|
||||
label: !isMobileView ? 'Close' : 'Back',
|
||||
label: !isMobileView
|
||||
? S.of(context).close
|
||||
: S.of(context).seed_alert_back,
|
||||
child: TextButton(
|
||||
style: ButtonStyle(
|
||||
overlayColor: MaterialStateColor.resolveWith(
|
||||
|
|
|
@ -114,55 +114,66 @@ class AddressTextField extends StatelessWidget {
|
|||
width: prefixIconWidth,
|
||||
height: prefixIconHeight,
|
||||
padding: EdgeInsets.only(top: 0),
|
||||
child: InkWell(
|
||||
onTap: () async => _pasteAddress(context),
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: buttonColor ??
|
||||
Theme.of(context)
|
||||
.accentTextTheme!
|
||||
child: Semantics(
|
||||
label: S.of(context).paste,
|
||||
child: InkWell(
|
||||
onTap: () async => _pasteAddress(context),
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: buttonColor ??
|
||||
Theme.of(context)
|
||||
.accentTextTheme
|
||||
!
|
||||
.titleLarge!
|
||||
.color!,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/paste_ios.png',
|
||||
color: iconColor ??
|
||||
Theme.of(context)
|
||||
.primaryTextTheme!
|
||||
.color!,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/paste_ios.png',
|
||||
color: iconColor ??
|
||||
Theme.of(context)
|
||||
.primaryTextTheme
|
||||
!
|
||||
.headlineMedium!
|
||||
.decorationColor!,
|
||||
)),
|
||||
.decorationColor!,
|
||||
)),
|
||||
),
|
||||
)),
|
||||
],
|
||||
if (this.options.contains(AddressTextFieldOption.qrCode) && DeviceInfo.instance.isMobile)
|
||||
...[
|
||||
if (this.options.contains(AddressTextFieldOption.qrCode) &&
|
||||
DeviceInfo.instance.isMobile) ...[
|
||||
Container(
|
||||
width: prefixIconWidth,
|
||||
height: prefixIconHeight,
|
||||
padding: EdgeInsets.only(top: 0),
|
||||
child: InkWell(
|
||||
onTap: () async => _presentQRScanner(context),
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: buttonColor ??
|
||||
Theme.of(context)
|
||||
.accentTextTheme
|
||||
child: Semantics(
|
||||
label: S.of(context).scan_qr_code,
|
||||
child: InkWell(
|
||||
onTap: () async => _presentQRScanner(context),
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: buttonColor ??
|
||||
Theme.of(context)
|
||||
.accentTextTheme
|
||||
|
||||
.titleLarge!
|
||||
.color!,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/qr_code_icon.png',
|
||||
color: iconColor ??
|
||||
Theme.of(context)
|
||||
.primaryTextTheme!.headlineMedium!
|
||||
.decorationColor!,
|
||||
)),
|
||||
.color!,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/qr_code_icon.png',
|
||||
color: iconColor ??
|
||||
Theme.of(context)
|
||||
.primaryTextTheme
|
||||
!.headlineMedium!
|
||||
.decorationColor!,
|
||||
)),
|
||||
),
|
||||
))
|
||||
] else SizedBox(width: 5),
|
||||
] else
|
||||
SizedBox(width: 5),
|
||||
if (this
|
||||
.options
|
||||
.contains(AddressTextFieldOption.addressBook)) ...[
|
||||
|
@ -170,26 +181,32 @@ class AddressTextField extends StatelessWidget {
|
|||
width: prefixIconWidth,
|
||||
height: prefixIconHeight,
|
||||
padding: EdgeInsets.only(top: 0),
|
||||
child: InkWell(
|
||||
onTap: () async => _presetAddressBookPicker(context),
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: buttonColor ??
|
||||
Theme.of(context)
|
||||
.accentTextTheme!
|
||||
child: Semantics(
|
||||
label: S.of(context).address_book,
|
||||
child: InkWell(
|
||||
onTap: () async =>
|
||||
_presetAddressBookPicker(context),
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(8),
|
||||
decoration: BoxDecoration(
|
||||
color: buttonColor ??
|
||||
Theme.of(context)
|
||||
.accentTextTheme
|
||||
!
|
||||
.titleLarge!
|
||||
.color!,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/open_book.png',
|
||||
color: iconColor ??
|
||||
Theme.of(context)
|
||||
.primaryTextTheme!
|
||||
.color!,
|
||||
borderRadius:
|
||||
BorderRadius.all(Radius.circular(6))),
|
||||
child: Image.asset(
|
||||
'assets/images/open_book.png',
|
||||
color: iconColor ??
|
||||
Theme.of(context)
|
||||
.primaryTextTheme
|
||||
!
|
||||
.headlineMedium!
|
||||
.decorationColor!,
|
||||
)),
|
||||
.decorationColor!,
|
||||
)),
|
||||
),
|
||||
))
|
||||
]
|
||||
],
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
||||
class IntroducingCard extends StatelessWidget {
|
||||
IntroducingCard(
|
||||
|
@ -70,7 +71,7 @@ class IntroducingCard extends StatelessWidget {
|
|||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(0,16,16,0),
|
||||
child: Semantics(
|
||||
label: 'Close',
|
||||
label: S.of(context).close,
|
||||
child: GestureDetector(
|
||||
onTap: closeCard,
|
||||
child: Container(
|
||||
|
|
3
lib/utils/feature_flag.dart
Normal file
3
lib/utils/feature_flag.dart
Normal file
|
@ -0,0 +1,3 @@
|
|||
class FeatureFlag {
|
||||
static const bool isCakePayEnabled = false;
|
||||
}
|
|
@ -4,9 +4,9 @@ part 'desktop_sidebar_view_model.g.dart';
|
|||
|
||||
enum SidebarItem {
|
||||
dashboard,
|
||||
transactions,
|
||||
support,
|
||||
settings,
|
||||
transactions;
|
||||
}
|
||||
|
||||
class DesktopSidebarViewModel = DesktopSidebarViewModelBase with _$DesktopSidebarViewModel;
|
||||
|
|
|
@ -24,6 +24,7 @@ abstract class RescanViewModelBase with Store {
|
|||
Future<void> rescanCurrentWallet({required int restoreHeight}) async {
|
||||
state = RescanWalletState.rescaning;
|
||||
await _wallet.rescan(height: restoreHeight);
|
||||
_wallet.transactionHistory.clear();
|
||||
state = RescanWalletState.none;
|
||||
}
|
||||
}
|
|
@ -115,10 +115,10 @@ SPEC CHECKSUMS:
|
|||
platform_device_id_macos: f763bb55f088be804d61b96eb4710b8ab6598e94
|
||||
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
|
||||
share_plus_macos: 853ee48e7dce06b633998ca0735d482dd671ade4
|
||||
shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c
|
||||
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
|
||||
url_launcher_macos: 5335912b679c073563f29d89d33d10d459f95451
|
||||
wakelock_macos: bc3f2a9bd8d2e6c89fee1e1822e7ddac3bd004a9
|
||||
|
||||
PODFILE CHECKSUM: 5107934592df7813b33d744aebc8ddc6b5a5445f
|
||||
|
||||
COCOAPODS: 1.11.3
|
||||
COCOAPODS: 1.12.1
|
||||
|
|
|
@ -606,6 +606,8 @@
|
|||
"error_text_input_above_maximum_limit": "المبلغ أكبر من الحد الأقصى",
|
||||
"show_market_place": "إظهار السوق",
|
||||
"prevent_screenshots": "منع لقطات الشاشة وتسجيل الشاشة",
|
||||
"profile": "حساب تعريفي",
|
||||
"close": "يغلق",
|
||||
"modify_2fa": "تعديل 2 عامل المصادقة",
|
||||
"disable_cake_2fa": "تعطيل 2 عامل المصادقة",
|
||||
"question_to_disable_2fa": "هل أنت متأكد أنك تريد تعطيل Cake 2FA؟ لن تكون هناك حاجة إلى رمز 2FA للوصول إلى المحفظة ووظائف معينة.",
|
||||
|
@ -628,21 +630,25 @@
|
|||
"available_balance_description": "الرصيد المتاح هو الرصيد الذي يمكنك إنفاقه أو تحويله إلى محفظة أخرى. يتم تجميد الرصيد المتاح للمعاملات الصادرة والمعاملات الواردة غير المؤكدة.",
|
||||
"syncing_wallet_alert_title": "محفظتك تتم مزامنتها",
|
||||
"syncing_wallet_alert_content": "قد لا يكتمل رصيدك وقائمة المعاملات الخاصة بك حتى تظهر عبارة “SYNCHRONIZED“ في الأعلى. انقر / اضغط لمعرفة المزيد.",
|
||||
"home_screen_settings": "إعدادات الشاشة الرئيسية",
|
||||
"sort_by": "ترتيب حسب",
|
||||
"search_add_token": "بحث / إضافة رمز",
|
||||
"edit_token": "تحرير الرمز المميز",
|
||||
"warning": "تحذير",
|
||||
"add_token_warning": "لا تقم بتحرير أو إضافة رموز وفقًا لتعليمات المحتالين.\nقم دائمًا بتأكيد عناوين الرموز مع مصادر حسنة السمعة!",
|
||||
"add_token_disclaimer_check": "لقد قمت بتأكيد عنوان ومعلومات عقد الرمز المميز باستخدام مصدر حسن السمعة. يمكن أن تؤدي إضافة معلومات خبيثة أو غير صحيحة إلى خسارة الأموال.",
|
||||
"token_contract_address": "عنوان عقد الرمز",
|
||||
"token_name": "اسم الرمز ، على سبيل المثال: Tether",
|
||||
"token_symbol": "رمز العملة ، على سبيل المثال: USDT",
|
||||
"token_decimal": "رمز عشري",
|
||||
"field_required": "هذه الخانة مطلوبه",
|
||||
"pin_at_top": "تثبيت ${token} في الأعلى",
|
||||
"invalid_input": "مدخل غير صالح",
|
||||
"fiat_balance": "الرصيد فيات",
|
||||
"gross_balance": "إجمالي الرصيد",
|
||||
"alphabetical": "مرتب حسب الحروف الأبجدية"
|
||||
"home_screen_settings": "إعدادات الشاشة الرئيسية",
|
||||
"sort_by": "ترتيب حسب",
|
||||
"search_add_token": "بحث / إضافة رمز",
|
||||
"edit_token": "تحرير الرمز المميز",
|
||||
"warning": "تحذير",
|
||||
"add_token_warning": "لا تقم بتحرير أو إضافة رموز وفقًا لتعليمات المحتالين.\nقم دائمًا بتأكيد عناوين الرموز مع مصادر حسنة السمعة!",
|
||||
"add_token_disclaimer_check": "لقد قمت بتأكيد عنوان ومعلومات عقد الرمز المميز باستخدام مصدر حسن السمعة. يمكن أن تؤدي إضافة معلومات خبيثة أو غير صحيحة إلى خسارة الأموال.",
|
||||
"token_contract_address": "عنوان عقد الرمز",
|
||||
"token_name": "اسم الرمز ، على سبيل المثال: Tether",
|
||||
"token_symbol": "رمز العملة ، على سبيل المثال: USDT",
|
||||
"token_decimal": "رمز عشري",
|
||||
"field_required": "هذه الخانة مطلوبه",
|
||||
"pin_at_top": "تثبيت ${token} في الأعلى",
|
||||
"invalid_input": "مدخل غير صالح",
|
||||
"fiat_balance": "الرصيد فيات",
|
||||
"gross_balance": "إجمالي الرصيد",
|
||||
"alphabetical": "مرتب حسب الحروف الأبجدية",
|
||||
"generate_name": "توليد الاسم",
|
||||
"balance_page": "صفحة التوازن",
|
||||
"share": "يشارك",
|
||||
"slidable": "قابل للانزلاق"
|
||||
}
|
||||
|
|
|
@ -602,6 +602,8 @@
|
|||
"error_text_input_above_maximum_limit": "Сумата надвишава максималната",
|
||||
"show_market_place": "Покажи пазар",
|
||||
"prevent_screenshots": "Предотвратете екранни снимки и запис на екрана",
|
||||
"profile": "Профил",
|
||||
"close": "затвори",
|
||||
"modify_2fa": "Модифициране на тортата 2FA",
|
||||
"disable_cake_2fa": "Деактивирайте Cake 2FA",
|
||||
"question_to_disable_2fa": "Сигурни ли сте, че искате да деактивирате Cake 2FA? Вече няма да е необходим 2FA код за достъп до портфейла и определени функции.",
|
||||
|
@ -640,5 +642,9 @@
|
|||
"invalid_input": "Невалиден вход",
|
||||
"fiat_balance": "Фиат Баланс",
|
||||
"gross_balance": "Брутен баланс",
|
||||
"alphabetical": "Азбучен ред"
|
||||
"alphabetical": "Азбучен ред",
|
||||
"generate_name": "Генериране на име",
|
||||
"balance_page": "Страница за баланс",
|
||||
"share": "Дял",
|
||||
"slidable": "Плъзгащ се"
|
||||
}
|
||||
|
|
|
@ -602,6 +602,8 @@
|
|||
"error_text_input_above_maximum_limit": "Částka je větší než maximální hodnota",
|
||||
"show_market_place": "Zobrazit trh",
|
||||
"prevent_screenshots": "Zabránit vytváření snímků obrazovky a nahrávání obrazovky",
|
||||
"profile": "Profil",
|
||||
"close": "zavřít",
|
||||
"modify_2fa": "Upravte Cake 2FA",
|
||||
"disable_cake_2fa": "Zakázat Cake 2FA",
|
||||
"question_to_disable_2fa": "Opravdu chcete deaktivovat Cake 2FA? Pro přístup k peněžence a některým funkcím již nebude potřeba kód 2FA.",
|
||||
|
@ -640,5 +642,9 @@
|
|||
"invalid_input": "Neplatný vstup",
|
||||
"fiat_balance": "Fiat Balance",
|
||||
"gross_balance": "Hrubý zůstatek",
|
||||
"alphabetical": "Abecední"
|
||||
"alphabetical": "Abecední",
|
||||
"generate_name": "Generovat jméno",
|
||||
"balance_page": "Stránka zůstatku",
|
||||
"share": "Podíl",
|
||||
"slidable": "Posuvné"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Menge ist über dem Maximum",
|
||||
"show_market_place": "Marktplatz anzeigen",
|
||||
"prevent_screenshots": "Verhindern Sie Screenshots und Bildschirmaufzeichnungen",
|
||||
"profile": "Profil",
|
||||
"close": "Schließen",
|
||||
"modify_2fa": "Kuchen 2FA ändern",
|
||||
"disable_cake_2fa": "Kuchen 2FA deaktivieren",
|
||||
"question_to_disable_2fa": "Sind Sie sicher, dass Sie Cake 2FA deaktivieren möchten? Für den Zugriff auf die Brieftasche und bestimmte Funktionen wird kein 2FA-Code mehr benötigt.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Ungültige Eingabe",
|
||||
"fiat_balance": "Fiat Balance",
|
||||
"gross_balance": "Bruttosaldo",
|
||||
"alphabetical": "Alphabetisch"
|
||||
"alphabetical": "Alphabetisch",
|
||||
"generate_name": "Namen generieren",
|
||||
"balance_page": "Balance-Seite",
|
||||
"share": "Aktie",
|
||||
"slidable": "Verschiebbar"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Amount is more than the maximum",
|
||||
"show_market_place": "Show Marketplace",
|
||||
"prevent_screenshots": "Prevent screenshots and screen recording",
|
||||
"profile": "Profile",
|
||||
"close": "Close",
|
||||
"modify_2fa": "Modify Cake 2FA",
|
||||
"disable_cake_2fa": "Disable Cake 2FA",
|
||||
"question_to_disable_2fa": "Are you sure that you want to disable Cake 2FA? A 2FA code will no longer be needed to access the wallet and certain functions.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Invalid input",
|
||||
"fiat_balance": "Fiat Balance",
|
||||
"gross_balance": "Gross Balance",
|
||||
"alphabetical": "Alphabetical"
|
||||
"alphabetical": "Alphabetical",
|
||||
"generate_name": "Generate Name",
|
||||
"balance_page": "Balance Page",
|
||||
"share": "Share",
|
||||
"slidable": "Slidable"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "La cantidad es más que el máximo",
|
||||
"show_market_place": "Mostrar mercado",
|
||||
"prevent_screenshots": "Evitar capturas de pantalla y grabación de pantalla",
|
||||
"profile": "Perfil",
|
||||
"close": "Cerca",
|
||||
"modify_2fa": "Modificar torta 2FA",
|
||||
"disable_cake_2fa": "Desactivar pastel 2FA",
|
||||
"question_to_disable_2fa": "¿Está seguro de que desea deshabilitar Cake 2FA? Ya no se necesitará un código 2FA para acceder a la billetera y a ciertas funciones.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Entrada inválida",
|
||||
"fiat_balance": "Equilibrio Fiat",
|
||||
"gross_balance": "Saldo bruto",
|
||||
"alphabetical": "Alfabético"
|
||||
"alphabetical": "Alfabético",
|
||||
"generate_name": "Generar nombre",
|
||||
"balance_page": "Página de saldo",
|
||||
"share": "Compartir",
|
||||
"slidable": "deslizable"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Le montant est supérieur au maximum",
|
||||
"show_market_place": "Afficher la place de marché",
|
||||
"prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran",
|
||||
"profile": "Profil",
|
||||
"close": "Fermer",
|
||||
"modify_2fa": "Modifier les paramètres Cake 2FA",
|
||||
"disable_cake_2fa": "Désactiver Cake 2FA",
|
||||
"question_to_disable_2fa": "Êtes-vous sûr de vouloir désactiver Cake 2FA ? Un code 2FA ne sera plus nécessaire pour accéder au portefeuille (wallet) et à certaines fonctions.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Entrée invalide",
|
||||
"fiat_balance": "Fiat Balance",
|
||||
"gross_balance": "Solde brut",
|
||||
"alphabetical": "Alphabétique"
|
||||
"alphabetical": "Alphabétique",
|
||||
"generate_name": "Générer un nom",
|
||||
"balance_page": "Page Solde",
|
||||
"share": "Partager",
|
||||
"slidable": "Glissable"
|
||||
}
|
||||
|
|
|
@ -628,5 +628,9 @@
|
|||
"invalid_input": "Shigar da ba daidai ba",
|
||||
"fiat_balance": "Fiat Balance",
|
||||
"gross_balance": "Babban Ma'auni",
|
||||
"alphabetical": "Harafi"
|
||||
"alphabetical": "Harafi",
|
||||
"generate_name": "Ƙirƙirar Suna",
|
||||
"balance_page": "Ma'auni Page",
|
||||
"share": "Raba",
|
||||
"slidable": "Mai iya zamewa"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "राशि अधिकतम से अधिक है",
|
||||
"show_market_place": "बाज़ार दिखाएँ",
|
||||
"prevent_screenshots": "स्क्रीनशॉट और स्क्रीन रिकॉर्डिंग रोकें",
|
||||
"profile": "प्रोफ़ाइल",
|
||||
"close": "बंद करना",
|
||||
"modify_2fa": "केक 2FA संशोधित करें",
|
||||
"disable_cake_2fa": "केक 2FA अक्षम करें",
|
||||
"question_to_disable_2fa": "क्या आप सुनिश्चित हैं कि आप Cake 2FA को अक्षम करना चाहते हैं? वॉलेट और कुछ कार्यों तक पहुँचने के लिए अब 2FA कोड की आवश्यकता नहीं होगी।",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "अमान्य निवेश",
|
||||
"fiat_balance": "फिएट बैलेंस",
|
||||
"gross_balance": "सकल संतुलन",
|
||||
"alphabetical": "वर्णमाला"
|
||||
"alphabetical": "वर्णमाला",
|
||||
"generate_name": "नाम जनरेट करें",
|
||||
"balance_page": "बैलेंस पेज",
|
||||
"share": "शेयर करना",
|
||||
"slidable": "फिसलने लायक"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Iznos je veći od maskimalnog",
|
||||
"show_market_place": "Prikaži tržište",
|
||||
"prevent_screenshots": "Spriječite snimke zaslona i snimanje zaslona",
|
||||
"profile": "Profil",
|
||||
"close": "Zatvoriti",
|
||||
"modify_2fa": "Izmijenite tortu 2FA",
|
||||
"disable_cake_2fa": "Onemogući Cake 2FA",
|
||||
"question_to_disable_2fa": "Jeste li sigurni da želite onemogućiti Cake 2FA? 2FA kod više neće biti potreban za pristup novčaniku i određenim funkcijama.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Pogrešan unos",
|
||||
"fiat_balance": "Fiat Bilans",
|
||||
"gross_balance": "Bruto bilanca",
|
||||
"alphabetical": "Abecedno"
|
||||
"alphabetical": "Abecedno",
|
||||
"generate_name": "Generiraj ime",
|
||||
"balance_page": "Stranica sa stanjem",
|
||||
"share": "Udio",
|
||||
"slidable": "Klizna"
|
||||
}
|
||||
|
|
|
@ -598,6 +598,8 @@
|
|||
"error_text_input_above_maximum_limit": "Jumlah lebih dari maksimal",
|
||||
"show_market_place": "Tampilkan Pasar",
|
||||
"prevent_screenshots": "Cegah tangkapan layar dan perekaman layar",
|
||||
"profile": "Profil",
|
||||
"close": "Menutup",
|
||||
"modify_2fa": "Ubah Kue 2FA",
|
||||
"disable_cake_2fa": "Nonaktifkan Kue 2FA",
|
||||
"question_to_disable_2fa": "Apakah Anda yakin ingin menonaktifkan Cake 2FA? Kode 2FA tidak lagi diperlukan untuk mengakses dompet dan fungsi tertentu.",
|
||||
|
@ -636,5 +638,9 @@
|
|||
"invalid_input": "Masukan tidak valid",
|
||||
"fiat_balance": "Saldo Fiat",
|
||||
"gross_balance": "Saldo Kotor",
|
||||
"alphabetical": "Alfabetis"
|
||||
"alphabetical": "Alfabetis",
|
||||
"generate_name": "Hasilkan Nama",
|
||||
"balance_page": "Halaman Saldo",
|
||||
"share": "Membagikan",
|
||||
"slidable": "Dapat digeser"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "L'ammontare è superiore al massimo",
|
||||
"show_market_place": "Mostra mercato",
|
||||
"prevent_screenshots": "Impedisci screenshot e registrazione dello schermo",
|
||||
"profile": "Profilo",
|
||||
"close": "Chiudere",
|
||||
"modify_2fa": "Modifica Torta 2FA",
|
||||
"disable_cake_2fa": "Disabilita Cake 2FA",
|
||||
"question_to_disable_2fa": "Sei sicuro di voler disabilitare Cake 2FA? Non sarà più necessario un codice 2FA per accedere al portafoglio e ad alcune funzioni.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Inserimento non valido",
|
||||
"fiat_balance": "Equilibrio fiat",
|
||||
"gross_balance": "Saldo lordo",
|
||||
"alphabetical": "Alfabetico"
|
||||
"alphabetical": "Alfabetico",
|
||||
"generate_name": "Genera nome",
|
||||
"balance_page": "Pagina di equilibrio",
|
||||
"share": "Condividere",
|
||||
"slidable": "Scorrevole"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "金額は最大値を超えています",
|
||||
"show_market_place": "マーケットプレイスを表示",
|
||||
"prevent_screenshots": "スクリーンショットと画面録画を防止する",
|
||||
"profile": "プロフィール",
|
||||
"close": "近い",
|
||||
"modify_2fa": "ケーキの 2FA を変更する",
|
||||
"disable_cake_2fa": "Cake 2FA を無効にする",
|
||||
"question_to_disable_2fa": "Cake 2FA を無効にしてもよろしいですか?ウォレットと特定の機能にアクセスするために 2FA コードは必要なくなります。",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "無効入力",
|
||||
"fiat_balance": "フィアットバランス",
|
||||
"gross_balance": "グロス残高",
|
||||
"alphabetical": "アルファベット順"
|
||||
"alphabetical": "アルファベット順",
|
||||
"generate_name": "名前の生成",
|
||||
"balance_page": "残高ページ",
|
||||
"share": "共有",
|
||||
"slidable": "スライド可能"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "금액이 최대 값보다 많습니다.",
|
||||
"show_market_place": "마켓플레이스 표시",
|
||||
"prevent_screenshots": "스크린샷 및 화면 녹화 방지",
|
||||
"profile": "프로필",
|
||||
"close": "닫다",
|
||||
"modify_2fa": "수정 케이크 2FA",
|
||||
"disable_cake_2fa": "케이크 2FA 비활성화",
|
||||
"question_to_disable_2fa": "Cake 2FA를 비활성화하시겠습니까? 지갑 및 특정 기능에 액세스하는 데 더 이상 2FA 코드가 필요하지 않습니다.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "잘못된 입력",
|
||||
"fiat_balance": "피아트 잔액",
|
||||
"gross_balance": "총 잔액",
|
||||
"alphabetical": "알파벳순"
|
||||
"alphabetical": "알파벳순",
|
||||
"generate_name": "이름 생성",
|
||||
"balance_page": "잔액 페이지",
|
||||
"share": "공유하다",
|
||||
"slidable": "슬라이딩 가능"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "ပမာဏသည် အများဆုံးထက် ပိုများသည်။",
|
||||
"show_market_place": "စျေးကွက်ကိုပြသပါ။",
|
||||
"prevent_screenshots": "ဖန်သားပြင်ဓာတ်ပုံများနှင့် မျက်နှာပြင်ရိုက်ကူးခြင်းကို တားဆီးပါ။",
|
||||
"profile": "ကိုယ်ရေးအကျဉ်း",
|
||||
"close": "အနီးကပ်",
|
||||
"modify_2fa": "ကိတ်မုန့် 2FA ကို ပြင်ဆင်ပါ။",
|
||||
"disable_cake_2fa": "ကိတ်မုန့် 2FA ကို ပိတ်ပါ။",
|
||||
"question_to_disable_2fa": "Cake 2FA ကို ပိတ်လိုသည်မှာ သေချာပါသလား။ ပိုက်ဆံအိတ်နှင့် အချို့သောလုပ်ဆောင်ချက်များကို အသုံးပြုရန်အတွက် 2FA ကုဒ်တစ်ခု မလိုအပ်တော့ပါ။",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "ထည့်သွင်းမှု မမှန်ကန်ပါ။",
|
||||
"fiat_balance": "Fiat Balance",
|
||||
"gross_balance": "စုစုပေါင်းလက်ကျန်ငွေ",
|
||||
"alphabetical": "အက္ခရာစဉ်"
|
||||
"alphabetical": "အက္ခရာစဉ်",
|
||||
"generate_name": "အမည်ဖန်တီးပါ။",
|
||||
"balance_page": "လက်ကျန်စာမျက်နှာ",
|
||||
"share": "မျှဝေပါ။",
|
||||
"slidable": "လျှောချနိုင်သည်။"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Bedrag is meer dan maximaal",
|
||||
"show_market_place": "Toon Marktplaats",
|
||||
"prevent_screenshots": "Voorkom screenshots en schermopname",
|
||||
"profile": "Profiel",
|
||||
"close": "Dichtbij",
|
||||
"modify_2fa": "Wijzig Cake 2FA",
|
||||
"disable_cake_2fa": "Taart 2FA uitschakelen",
|
||||
"question_to_disable_2fa": "Weet je zeker dat je Cake 2FA wilt uitschakelen? Er is geen 2FA-code meer nodig om toegang te krijgen tot de portemonnee en bepaalde functies.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Ongeldige invoer",
|
||||
"fiat_balance": "Fiat Balans",
|
||||
"gross_balance": "Bruto saldo",
|
||||
"alphabetical": "Alfabetisch"
|
||||
"alphabetical": "Alfabetisch",
|
||||
"generate_name": "Naam genereren",
|
||||
"balance_page": "Saldo pagina",
|
||||
"share": "Deel",
|
||||
"slidable": "Verschuifbaar"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Kwota jest większa niż maksymalna",
|
||||
"show_market_place": "Pokaż rynek",
|
||||
"prevent_screenshots": "Zapobiegaj zrzutom ekranu i nagrywaniu ekranu",
|
||||
"profile": "Profil",
|
||||
"close": "Zamknąć",
|
||||
"modify_2fa": "Zmodyfikuj ciasto 2FA",
|
||||
"disable_cake_2fa": "Wyłącz Cake 2FA",
|
||||
"question_to_disable_2fa": "Czy na pewno chcesz wyłączyć Cake 2FA? Kod 2FA nie będzie już potrzebny do uzyskania dostępu do portfela i niektórych funkcji.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Nieprawidłowe dane wejściowe",
|
||||
"fiat_balance": "Bilans Fiata",
|
||||
"gross_balance": "Saldo brutto",
|
||||
"alphabetical": "Alfabetyczny"
|
||||
"alphabetical": "Alfabetyczny",
|
||||
"generate_name": "Wygeneruj nazwę",
|
||||
"balance_page": "Strona salda",
|
||||
"share": "Udział",
|
||||
"slidable": "Przesuwne"
|
||||
}
|
||||
|
|
|
@ -436,7 +436,7 @@
|
|||
"electrum_address_disclaimer": "Geramos novos endereços cada vez que você usa um, mas os endereços anteriores continuam funcionando",
|
||||
"wallet_name_exists": "A carteira com esse nome já existe",
|
||||
"market_place": "Mercado",
|
||||
"cake_pay_title": "Cartões de presente de pagamento de bolo",
|
||||
"cake_pay_title": "Cartões de presente de CakePay",
|
||||
"cake_pay_subtitle": "Compre vales-presente com desconto (somente nos EUA)",
|
||||
"cake_pay_web_cards_title": "Cartões Cake Pay Web",
|
||||
"cake_pay_web_cards_subtitle": "Compre cartões pré-pagos e cartões-presente em todo o mundo",
|
||||
|
@ -607,11 +607,13 @@
|
|||
"error_text_input_above_maximum_limit": "O valor é superior ao máximo",
|
||||
"show_market_place": "Mostrar mercado",
|
||||
"prevent_screenshots": "Evite capturas de tela e gravação de tela",
|
||||
"modify_2fa": "Modificar Bolo 2FA",
|
||||
"disable_cake_2fa": "Desabilitar Bolo 2FA",
|
||||
"profile": "Perfil",
|
||||
"close": "Fechar",
|
||||
"modify_2fa": "Modificar o Cake 2FA",
|
||||
"disable_cake_2fa": "Desabilitar o Cake 2FA",
|
||||
"question_to_disable_2fa": "Tem certeza de que deseja desativar o Cake 2FA? Um código 2FA não será mais necessário para acessar a carteira e certas funções.",
|
||||
"disable": "Desativar",
|
||||
"setup_2fa": "Bolo de Configuração 2FA",
|
||||
"setup_2fa": "Configurar o Cake 2FA",
|
||||
"verify_with_2fa": "Verificar com Cake 2FA",
|
||||
"totp_code": "Código TOTP",
|
||||
"please_fill_totp": "Por favor, preencha o código de 8 dígitos presente em seu outro dispositivo",
|
||||
|
@ -645,5 +647,9 @@
|
|||
"invalid_input": "Entrada inválida",
|
||||
"fiat_balance": "Equilíbrio Fiat",
|
||||
"gross_balance": "Saldo Bruto",
|
||||
"alphabetical": "alfabética"
|
||||
"alphabetical": "alfabética",
|
||||
"generate_name": "Gerar nome",
|
||||
"balance_page": "Página de saldo",
|
||||
"share": "Compartilhar",
|
||||
"slidable": "Deslizável"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Сумма больше максимальной",
|
||||
"show_market_place": "Показать торговую площадку",
|
||||
"prevent_screenshots": "Предотвратить скриншоты и запись экрана",
|
||||
"profile": "Профиль",
|
||||
"close": "Закрывать",
|
||||
"modify_2fa": "Изменить торт 2FA",
|
||||
"disable_cake_2fa": "Отключить торт 2FA",
|
||||
"question_to_disable_2fa": "Вы уверены, что хотите отключить Cake 2FA? Код 2FA больше не потребуется для доступа к кошельку и некоторым функциям.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Неверный Ввод",
|
||||
"fiat_balance": "Фиатный баланс",
|
||||
"gross_balance": "Валовой баланс",
|
||||
"alphabetical": "Алфавитный"
|
||||
"alphabetical": "Алфавитный",
|
||||
"generate_name": "Создать имя",
|
||||
"balance_page": "Страница баланса",
|
||||
"share": "Делиться",
|
||||
"slidable": "Скользящий"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "จำนวนเงินสูงกว่าค่าสูงสุด",
|
||||
"show_market_place": "แสดงตลาดกลาง",
|
||||
"prevent_screenshots": "ป้องกันภาพหน้าจอและการบันทึกหน้าจอ",
|
||||
"profile": "ประวัติโดยย่อ",
|
||||
"close": "ปิด",
|
||||
"modify_2fa": "แก้ไขเค้ก 2FA",
|
||||
"disable_cake_2fa": "ปิดการใช้งานเค้ก 2FA",
|
||||
"question_to_disable_2fa": "คุณแน่ใจหรือไม่ว่าต้องการปิดการใช้งาน Cake 2FA ไม่จำเป็นต้องใช้รหัส 2FA ในการเข้าถึงกระเป๋าเงินและฟังก์ชั่นบางอย่างอีกต่อไป",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "อินพุตไม่ถูกต้อง",
|
||||
"fiat_balance": "เฟียต บาลานซ์",
|
||||
"gross_balance": "ยอดคงเหลือ",
|
||||
"alphabetical": "ตามตัวอักษร"
|
||||
"alphabetical": "ตามตัวอักษร",
|
||||
"generate_name": "สร้างชื่อ",
|
||||
"balance_page": "หน้ายอดคงเหลือ",
|
||||
"share": "แบ่งปัน",
|
||||
"slidable": "เลื่อนได้"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Miktar maksimumdan daha fazla",
|
||||
"show_market_place": "Pazar Yerini Göster",
|
||||
"prevent_screenshots": "Ekran görüntülerini ve ekran kaydını önleyin",
|
||||
"profile": "Profil",
|
||||
"close": "Kapalı",
|
||||
"modify_2fa": "Cake 2FA'yı Değiştirin",
|
||||
"disable_cake_2fa": "Cake 2FA'yı Devre Dışı Bırak",
|
||||
"question_to_disable_2fa": "Cake 2FA'yı devre dışı bırakmak istediğinizden emin misiniz? M-cüzdana ve belirli işlevlere erişmek için artık 2FA koduna gerek kalmayacak.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Geçersiz Giriş",
|
||||
"fiat_balance": "Fiat Bakiyesi",
|
||||
"gross_balance": "Brüt Bakiye",
|
||||
"alphabetical": "Alfabetik"
|
||||
"alphabetical": "Alfabetik",
|
||||
"generate_name": "İsim Oluştur",
|
||||
"balance_page": "Bakiye Sayfası",
|
||||
"share": "Paylaşmak",
|
||||
"slidable": "kaydırılabilir"
|
||||
}
|
||||
|
|
|
@ -608,6 +608,8 @@
|
|||
"error_text_input_above_maximum_limit": "Сума більше максимальної",
|
||||
"show_market_place": "Відображати маркетплейс",
|
||||
"prevent_screenshots": "Запобігати знімкам екрана та запису екрана",
|
||||
"profile": "Профіль",
|
||||
"close": "Закрити",
|
||||
"modify_2fa": "Змінити торт 2FA",
|
||||
"disable_cake_2fa": "Вимкнути Cake 2FA",
|
||||
"question_to_disable_2fa": "Ви впевнені, що хочете вимкнути Cake 2FA? Код 2FA більше не потрібен для доступу до гаманця та певних функцій.",
|
||||
|
@ -646,5 +648,9 @@
|
|||
"invalid_input": "Неправильні дані",
|
||||
"fiat_balance": "Фіат Баланс",
|
||||
"gross_balance": "Валовий баланс",
|
||||
"alphabetical": "Алфавітний"
|
||||
"alphabetical": "Алфавітний",
|
||||
"generate_name": "Згенерувати назву",
|
||||
"balance_page": "Сторінка балансу",
|
||||
"share": "Поділіться",
|
||||
"slidable": "Розсувний"
|
||||
}
|
||||
|
|
|
@ -602,6 +602,8 @@
|
|||
"error_text_input_above_maximum_limit": "رقم زیادہ سے زیادہ سے زیادہ ہے۔",
|
||||
"show_market_place": "بازار دکھائیں۔",
|
||||
"prevent_screenshots": "اسکرین شاٹس اور اسکرین ریکارڈنگ کو روکیں۔",
|
||||
"profile": "پروفائل",
|
||||
"close": "بند کریں",
|
||||
"modify_2fa": "کیک 2FA میں ترمیم کریں۔",
|
||||
"disable_cake_2fa": "کیک 2FA کو غیر فعال کریں۔",
|
||||
"question_to_disable_2fa": "کیا آپ واقعی کیک 2FA کو غیر فعال کرنا چاہتے ہیں؟ بٹوے اور بعض افعال تک رسائی کے لیے اب 2FA کوڈ کی ضرورت نہیں ہوگی۔",
|
||||
|
@ -640,5 +642,9 @@
|
|||
"invalid_input": "غلط ان پٹ",
|
||||
"fiat_balance": "فیاٹ بیلنس",
|
||||
"gross_balance": "مجموعی بیلنس",
|
||||
"alphabetical": "حروف تہجی کے مطابق"
|
||||
"alphabetical": "حروف تہجی کے مطابق",
|
||||
"generate_name": "نام پیدا کریں۔",
|
||||
"balance_page": "بیلنس صفحہ",
|
||||
"share": "بانٹیں",
|
||||
"slidable": "سلائیڈ ایبل"
|
||||
}
|
||||
|
|
|
@ -604,6 +604,8 @@
|
|||
"error_text_input_above_maximum_limit": "Iye jọwọ ni o yẹ diẹ ti o wọle diẹ",
|
||||
"show_market_place": "Wa Sopọ Pataki",
|
||||
"prevent_screenshots": "Pese asapọ ti awọn ẹrọ eto aṣa",
|
||||
"profile": "profaili",
|
||||
"close": "sunmo",
|
||||
"modify_2fa": "Fi iṣiro 2FA sii Cake",
|
||||
"disable_cake_2fa": "Ko 2FA Cake sii",
|
||||
"question_to_disable_2fa": "Ṣe o wa daadaa pe o fẹ ko 2FA Cake? Ko si itumọ ti a yoo nilo lati ranse si iwe iwe naa ati eyikeyi iṣẹ ti o ni.",
|
||||
|
@ -642,5 +644,9 @@
|
|||
"invalid_input": "Iṣawọle ti ko tọ",
|
||||
"fiat_balance": "Fiat Iwontunws.funfun",
|
||||
"gross_balance": "Iwontunws.funfun apapọ",
|
||||
"alphabetical": "Labidibi"
|
||||
"alphabetical": "Labidibi",
|
||||
"generate_name": "Ṣẹda Orukọ",
|
||||
"balance_page": "Oju-iwe iwọntunwọnsi",
|
||||
"share": "Pinpin",
|
||||
"slidable": "Slidable"
|
||||
}
|
||||
|
|
|
@ -607,6 +607,8 @@
|
|||
"error_text_input_above_maximum_limit": "金额大于最大值",
|
||||
"show_market_place": "显示市场",
|
||||
"prevent_screenshots": "防止截屏和录屏",
|
||||
"profile": "轮廓",
|
||||
"close": "关闭",
|
||||
"modify_2fa": "修改蛋糕2FA",
|
||||
"disable_cake_2fa": "禁用蛋糕 2FA",
|
||||
"question_to_disable_2fa": "您确定要禁用 Cake 2FA 吗?访问钱包和某些功能将不再需要 2FA 代码。",
|
||||
|
@ -645,5 +647,9 @@
|
|||
"invalid_input": "输入无效",
|
||||
"fiat_balance": "法币余额",
|
||||
"gross_balance": "毛余额",
|
||||
"alphabetical": "按字母顺序"
|
||||
"alphabetical": "按字母顺序",
|
||||
"generate_name": "生成名称",
|
||||
"balance_page": "余额页",
|
||||
"share": "分享",
|
||||
"slidable": "可滑动"
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue