diff --git a/lib/entities/list_order_mode.dart b/lib/entities/list_order_mode.dart new file mode 100644 index 000000000..b9eae6820 --- /dev/null +++ b/lib/entities/list_order_mode.dart @@ -0,0 +1,34 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cw_core/enumerable_item.dart'; + +class ListOrderMode extends EnumerableItem with Serializable { + const ListOrderMode({required String title, required int raw}) : super(title: title, raw: raw); + + static const all = [ListOrderMode.ascending, ListOrderMode.descending]; + + static const ascending = ListOrderMode(raw: 0, title: 'Ascending'); + static const descending = ListOrderMode(raw: 1, title: 'Descending'); + + static ListOrderMode deserialize({required int raw}) { + switch (raw) { + case 0: + return ascending; + case 1: + return descending; + default: + throw Exception('Unexpected token: $raw for ListOrderMode deserialize'); + } + } + + @override + String toString() { + switch (this) { + case ListOrderMode.ascending: + return S.current.ascending; + case ListOrderMode.descending: + return S.current.descending; + default: + return ''; + } + } +} diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 67f1aca97..2d5e64817 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -20,6 +20,8 @@ class PreferencesKey { static const disableBuyKey = 'disable_buy'; static const disableSellKey = 'disable_sell'; static const defaultBuyProvider = 'default_buy_provider'; + static const walletListOrder = 'wallet_list_order'; + static const walletListAscending = 'wallet_list_ascending'; static const currentFiatApiModeKey = 'current_fiat_api_mode'; static const allowBiometricalAuthenticationKey = 'allow_biometrical_authentication'; static const useTOTP2FA = 'use_totp_2fa'; diff --git a/lib/entities/wallet_list_order_types.dart b/lib/entities/wallet_list_order_types.dart new file mode 100644 index 000000000..f848170f4 --- /dev/null +++ b/lib/entities/wallet_list_order_types.dart @@ -0,0 +1,22 @@ +import 'package:cake_wallet/generated/i18n.dart'; + +enum WalletListOrderType { + CreationDate, + Alphabetical, + GroupByType, + Custom; + + @override + String toString() { + switch (this) { + case WalletListOrderType.CreationDate: + return S.current.creation_date; + case WalletListOrderType.Alphabetical: + return S.current.alphabetical; + case WalletListOrderType.GroupByType: + return S.current.group_by_type; + case WalletListOrderType.Custom: + return S.current.custom_drag; + } + } +} diff --git a/lib/src/screens/dashboard/widgets/filter_list_widget.dart b/lib/src/screens/dashboard/widgets/filter_list_widget.dart new file mode 100644 index 000000000..cda4f5f10 --- /dev/null +++ b/lib/src/screens/dashboard/widgets/filter_list_widget.dart @@ -0,0 +1,158 @@ +import 'package:cake_wallet/entities/list_order_mode.dart'; +import 'package:cake_wallet/entities/wallet_list_order_types.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart'; +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; +import 'package:cake_wallet/src/widgets/section_divider.dart'; +import 'package:cake_wallet/themes/extensions/menu_theme.dart'; +import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; +import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/src/widgets/picker_wrapper_widget.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart'; + +class FilterListWidget extends StatefulWidget { + FilterListWidget({ + required this.initalType, + required this.initalAscending, + required this.onClose, + }); + + final WalletListOrderType? initalType; + final bool initalAscending; + final Function(bool, WalletListOrderType) onClose; + + @override + FilterListWidgetState createState() => FilterListWidgetState(); +} + +class FilterListWidgetState extends State { + late bool ascending; + late WalletListOrderType? type; + + @override + void initState() { + super.initState(); + ascending = widget.initalAscending; + type = widget.initalType; + } + + void setSelectedOrderType(WalletListOrderType? orderType) { + setState(() { + type = orderType; + }); + } + + @override + Widget build(BuildContext context) { + const sectionDivider = const HorizontalSectionDivider(); + return PickerWrapperWidget( + onClose: () { + widget.onClose(ascending, type!); + Navigator.of(context).pop(); + }, + children: [ + Padding( + padding: EdgeInsets.only(left: 24, right: 24, top: 24), + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(24)), + child: Container( + color: Theme.of(context).extension()!.backgroundColor, + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Padding( + padding: EdgeInsets.all(24.0), + child: Text( + S.of(context).order_by, + style: TextStyle( + color: + Theme.of(context).extension()!.detailsTitlesColor, + fontSize: 16, + fontFamily: 'Lato', + decoration: TextDecoration.none, + ), + ), + ), + if (type != WalletListOrderType.Custom) ...[ + sectionDivider, + SettingsChoicesCell( + ChoicesListItem( + title: "", + items: ListOrderMode.all, + selectedItem: ascending ? ListOrderMode.ascending : ListOrderMode.descending, + onItemSelected: (ListOrderMode listOrderMode) { + setState(() { + ascending = listOrderMode == ListOrderMode.ascending; + }); + }, + ), + ), + ], + sectionDivider, + RadioListTile( + value: WalletListOrderType.CreationDate, + groupValue: type, + title: Text( + WalletListOrderType.CreationDate.toString(), + style: TextStyle( + color: Theme.of(context).extension()!.titleColor, + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.bold, + decoration: TextDecoration.none), + ), + onChanged: setSelectedOrderType, + activeColor: Theme.of(context).primaryColor, + ), + RadioListTile( + value: WalletListOrderType.Alphabetical, + groupValue: type, + title: Text( + WalletListOrderType.Alphabetical.toString(), + style: TextStyle( + color: Theme.of(context).extension()!.titleColor, + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.bold, + decoration: TextDecoration.none), + ), + onChanged: setSelectedOrderType, + activeColor: Theme.of(context).primaryColor, + ), + RadioListTile( + value: WalletListOrderType.GroupByType, + groupValue: type, + title: Text( + WalletListOrderType.GroupByType.toString(), + style: TextStyle( + color: Theme.of(context).extension()!.titleColor, + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.bold, + decoration: TextDecoration.none), + ), + onChanged: setSelectedOrderType, + activeColor: Theme.of(context).primaryColor, + ), + RadioListTile( + value: WalletListOrderType.Custom, + groupValue: type, + title: Text( + WalletListOrderType.Custom.toString(), + style: TextStyle( + color: Theme.of(context).extension()!.titleColor, + fontSize: 16, + fontFamily: 'Lato', + fontWeight: FontWeight.bold, + decoration: TextDecoration.none), + ), + onChanged: setSelectedOrderType, + activeColor: Theme.of(context).primaryColor, + ), + ]), + ), + ), + ) + ], + ); + } +} diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index 1f441ea99..b3fbd19a7 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -411,10 +411,6 @@ class ExchangePage extends BasePage { } }); - reaction((_) => exchangeViewModel.isReceiveAddressEnabled, (bool isEnabled) { - receiveKey.currentState!.isAddressEditable(isEditable: isEnabled); - }); - reaction((_) => exchangeViewModel.isReceiveAmountEditable, (bool isReceiveAmountEditable) { receiveKey.currentState!.isAmountEditable(isEditable: isReceiveAmountEditable); }); @@ -670,7 +666,6 @@ class ExchangePage extends BasePage { ? exchangeViewModel.wallet.walletAddresses.address : exchangeViewModel.receiveAddress, initialIsAmountEditable: exchangeViewModel.isReceiveAmountEditable, - initialIsAddressEditable: exchangeViewModel.isReceiveAddressEnabled, isAmountEstimated: true, isMoneroWallet: exchangeViewModel.isMoneroWallet, currencies: exchangeViewModel.receiveCurrencies, diff --git a/lib/src/screens/exchange/exchange_template_page.dart b/lib/src/screens/exchange/exchange_template_page.dart index 31f35661d..3a7456dd8 100644 --- a/lib/src/screens/exchange/exchange_template_page.dart +++ b/lib/src/screens/exchange/exchange_template_page.dart @@ -174,8 +174,6 @@ class ExchangeTemplatePage extends BasePage { ? exchangeViewModel.wallet.walletAddresses.address : exchangeViewModel.receiveAddress, initialIsAmountEditable: false, - initialIsAddressEditable: - exchangeViewModel.isReceiveAddressEnabled, isAmountEstimated: true, isMoneroWallet: exchangeViewModel.isMoneroWallet, currencies: exchangeViewModel.receiveCurrencies, @@ -328,11 +326,6 @@ class ExchangeTemplatePage extends BasePage { } }); - reaction((_) => exchangeViewModel.isReceiveAddressEnabled, - (bool isEnabled) { - receiveKey.currentState!.isAddressEditable(isEditable: isEnabled); - }); - reaction((_) => exchangeViewModel.provider, (ExchangeProvider? provider) { receiveKey.currentState!.isAmountEditable(isEditable: false); }); diff --git a/lib/src/screens/exchange/widgets/exchange_card.dart b/lib/src/screens/exchange/widgets/exchange_card.dart index b55e96e85..706ace7de 100644 --- a/lib/src/screens/exchange/widgets/exchange_card.dart +++ b/lib/src/screens/exchange/widgets/exchange_card.dart @@ -23,7 +23,6 @@ class ExchangeCard extends StatefulWidget { required this.initialAddress, required this.initialWalletName, required this.initialIsAmountEditable, - required this.initialIsAddressEditable, required this.isAmountEstimated, required this.currencies, required this.onCurrencySelected, @@ -31,6 +30,7 @@ class ExchangeCard extends StatefulWidget { this.currencyValueValidator, this.addressTextFieldValidator, this.title = '', + this.initialIsAddressEditable = true, this.hasRefundAddress = false, this.isMoneroWallet = false, this.currencyButtonColor = Colors.transparent, diff --git a/lib/src/screens/settings/widgets/settings_choices_cell.dart b/lib/src/screens/settings/widgets/settings_choices_cell.dart index 79f74699d..63ad1ef9a 100644 --- a/lib/src/screens/settings/widgets/settings_choices_cell.dart +++ b/lib/src/screens/settings/widgets/settings_choices_cell.dart @@ -17,19 +17,21 @@ class SettingsChoicesCell extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - children: [ - Text( - choicesListItem.title, - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.normal, - color: Theme.of(context).extension()!.titleColor, + if (choicesListItem.title.isNotEmpty) ...[ + Row( + children: [ + Text( + choicesListItem.title, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: Theme.of(context).extension()!.titleColor, + ), ), - ), - ], - ), - const SizedBox(height: 24), + ], + ), + const SizedBox(height: 24), + ], Center( child: Container( decoration: BoxDecoration( @@ -49,9 +51,7 @@ class SettingsChoicesCell extends StatelessWidget { padding: EdgeInsets.symmetric(vertical: 8), decoration: BoxDecoration( borderRadius: BorderRadius.circular(30), - color: isSelected - ? Theme.of(context).primaryColor - : null, + color: isSelected ? Theme.of(context).primaryColor : null, ), child: Center( child: Text( diff --git a/lib/src/screens/wallet_list/filtered_list.dart b/lib/src/screens/wallet_list/filtered_list.dart new file mode 100644 index 000000000..7149833a8 --- /dev/null +++ b/lib/src/screens/wallet_list/filtered_list.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:mobx/mobx.dart'; + +class FilteredList extends StatefulWidget { + FilteredList({ + required this.list, + required this.itemBuilder, + required this.updateFunction, + }); + + final ObservableList list; + final Widget Function(BuildContext, int) itemBuilder; + final Function updateFunction; + + @override + FilteredListState createState() => FilteredListState(); +} + +class FilteredListState extends State { + @override + Widget build(BuildContext context) { + return Observer( + builder: (_) => ReorderableListView.builder( + physics: const BouncingScrollPhysics(), + itemBuilder: widget.itemBuilder, + itemCount: widget.list.length, + onReorder: (int oldIndex, int newIndex) { + if (oldIndex < newIndex) { + newIndex -= 1; + } + final dynamic item = widget.list.removeAt(oldIndex); + widget.list.insert(newIndex, item); + widget.updateFunction(); + }, + ), + ); + } +} diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index 53a9b3eca..8dcd23d29 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -1,8 +1,15 @@ +import 'package:cake_wallet/entities/wallet_list_order_types.dart'; +import 'package:cake_wallet/src/screens/dashboard/widgets/filter_list_widget.dart'; +import 'package:cake_wallet/src/screens/dashboard/widgets/filter_widget.dart'; +import 'package:cake_wallet/src/screens/wallet_list/filtered_list.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/core/auth_service.dart'; +import 'package:cake_wallet/themes/extensions/filter_theme.dart'; import 'package:cake_wallet/themes/extensions/receive_page_theme.dart'; +import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/show_bar.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; import 'package:another_flushbar/flushbar.dart'; import 'package:flutter/material.dart'; @@ -28,6 +35,53 @@ class WalletListPage extends BasePage { @override Widget body(BuildContext context) => WalletListBody(walletListViewModel: walletListViewModel, authService: authService); + + @override + Widget trailing(BuildContext context) { + final filterIcon = Image.asset('assets/images/filter_icon.png', + color: Theme.of(context).extension()!.iconColor); + return MergeSemantics( + child: SizedBox( + height: 37, + width: 37, + child: ButtonTheme( + minWidth: double.minPositive, + child: Semantics( + container: true, + child: GestureDetector( + onTap: () async { + await showPopUp( + context: context, + builder: (context) => FilterListWidget( + initalType: walletListViewModel.orderType, + initalAscending: walletListViewModel.ascending, + onClose: (bool ascending, WalletListOrderType type) async { + walletListViewModel.setAscending(ascending); + await walletListViewModel.setOrderType(type); + }, + ), + ); + }, + child: Semantics( + label: 'Transaction Filter', + button: true, + enabled: true, + child: Container( + height: 36, + width: 36, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Theme.of(context).extension()!.buttonColor, + ), + child: filterIcon, + ), + ), + ), + ), + ), + ), + ); + } } class WalletListBody extends StatefulWidget { @@ -70,11 +124,9 @@ class WalletListBodyState extends State { Expanded( child: Container( child: Observer( - builder: (_) => ListView.separated( - physics: const BouncingScrollPhysics(), - separatorBuilder: (_, index) => - Divider(color: Theme.of(context).colorScheme.background, height: 32), - itemCount: widget.walletListViewModel.wallets.length, + builder: (_) => FilteredList( + list: widget.walletListViewModel.wallets, + updateFunction: widget.walletListViewModel.reorderAccordingToWalletList, itemBuilder: (__, index) { final wallet = widget.walletListViewModel.wallets[index]; final currentColor = wallet.isCurrent @@ -83,6 +135,7 @@ class WalletListBodyState extends State { .createNewWalletButtonBackgroundColor : Theme.of(context).colorScheme.background; final row = GestureDetector( + key: ValueKey(wallet.name), onTap: () => wallet.isCurrent ? null : _loadWallet(wallet), child: Container( height: tileHeight, @@ -117,7 +170,7 @@ class WalletListBodyState extends State { maxLines: null, softWrap: true, style: TextStyle( - fontSize: 22, + fontSize: 20, fontWeight: FontWeight.w500, color: Theme.of(context) .extension()! @@ -137,13 +190,15 @@ class WalletListBodyState extends State { return wallet.isCurrent ? row : Row( + key: ValueKey(wallet.name), children: [ Expanded(child: row), GestureDetector( onTap: () => Navigator.of(context).pushNamed(Routes.walletEdit, arguments: [widget.walletListViewModel, wallet]), child: Container( - padding: EdgeInsets.only(right: 20), + padding: EdgeInsets.only( + right: DeviceInfo.instance.isMobile ? 20 : 40), child: Center( child: Container( height: 40, diff --git a/lib/src/widgets/picker_wrapper_widget.dart b/lib/src/widgets/picker_wrapper_widget.dart index f69bcd514..f4e52c5cd 100644 --- a/lib/src/widgets/picker_wrapper_widget.dart +++ b/lib/src/widgets/picker_wrapper_widget.dart @@ -4,10 +4,11 @@ import 'package:cake_wallet/src/widgets/alert_background.dart'; import 'package:cake_wallet/src/widgets/alert_close_button.dart'; class PickerWrapperWidget extends StatelessWidget { - PickerWrapperWidget({required this.children, this.hasTitle = false}); + PickerWrapperWidget({required this.children, this.hasTitle = false, this.onClose}); final List children; final bool hasTitle; + final Function()? onClose; @override Widget build(BuildContext context) { @@ -45,7 +46,7 @@ class PickerWrapperWidget extends StatelessWidget { children: children, ), SizedBox(height: ResponsiveLayoutUtilBase.kPopupSpaceHeight), - AlertCloseButton(bottom: closeButtonBottom), + AlertCloseButton(bottom: closeButtonBottom, onTap: onClose), ], ), ), diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 4078827d0..95254e557 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -12,6 +12,7 @@ import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/entities/seed_phrase_length.dart'; import 'package:cake_wallet/entities/seed_type.dart'; import 'package:cake_wallet/entities/sort_balance_types.dart'; +import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:cake_wallet/polygon/polygon.dart'; import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart'; import 'package:cake_wallet/view_model/settings/sync_mode.dart'; @@ -53,7 +54,8 @@ abstract class SettingsStoreBase with Store { required bool initialAppSecure, required bool initialDisableBuy, required bool initialDisableSell, - required BuyProviderType initialDefaultBuyProvider, + required WalletListOrderType initialWalletListOrder, + required bool initialWalletListAscending, required FiatApiMode initialFiatMode, required bool initialAllowBiometricalAuthentication, required String initialTotpSecretKey, @@ -122,6 +124,8 @@ abstract class SettingsStoreBase with Store { isAppSecure = initialAppSecure, disableBuy = initialDisableBuy, disableSell = initialDisableSell, + walletListOrder = initialWalletListOrder, + walletListAscending = initialWalletListAscending, shouldShowMarketPlaceInDashboard = initialShouldShowMarketPlaceInDashboard, exchangeStatus = initialExchangeStatus, currentTheme = initialTheme, @@ -257,6 +261,16 @@ abstract class SettingsStoreBase with Store { } ); + reaction( + (_) => walletListOrder, + (WalletListOrderType walletListOrder) => + sharedPreferences.setInt(PreferencesKey.walletListOrder, walletListOrder.index)); + + reaction( + (_) => walletListAscending, + (bool walletListAscending) => + sharedPreferences.setBool(PreferencesKey.walletListAscending, walletListAscending)); + reaction( (_) => autoGenerateSubaddressStatus, (AutoGenerateSubaddressStatus autoGenerateSubaddressStatus) => sharedPreferences.setInt( @@ -504,6 +518,12 @@ abstract class SettingsStoreBase with Store { @observable bool disableSell; + @observable + WalletListOrderType walletListOrder; + + @observable + bool walletListAscending; + @observable bool allowBiometricalAuthentication; @@ -717,8 +737,10 @@ abstract class SettingsStoreBase with Store { final isAppSecure = sharedPreferences.getBool(PreferencesKey.isAppSecureKey) ?? false; final disableBuy = sharedPreferences.getBool(PreferencesKey.disableBuyKey) ?? false; final disableSell = sharedPreferences.getBool(PreferencesKey.disableSellKey) ?? false; - final defaultBuyProvider = - BuyProviderType.values[sharedPreferences.getInt(PreferencesKey.defaultBuyProvider) ?? 0]; + final walletListOrder = + WalletListOrderType.values[sharedPreferences.getInt(PreferencesKey.walletListOrder) ?? 0]; + final walletListAscending = + sharedPreferences.getBool(PreferencesKey.walletListAscending) ?? true; final currentFiatApiMode = FiatApiMode.deserialize( raw: sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey) ?? FiatApiMode.enabled.raw); @@ -897,7 +919,8 @@ abstract class SettingsStoreBase with Store { initialAppSecure: isAppSecure, initialDisableBuy: disableBuy, initialDisableSell: disableSell, - initialDefaultBuyProvider: defaultBuyProvider, + initialWalletListOrder: walletListOrder, + initialWalletListAscending: walletListAscending, initialFiatMode: currentFiatApiMode, initialAllowBiometricalAuthentication: allowBiometricalAuthentication, initialCake2FAPresetOptions: selectedCake2FAPreset, @@ -1013,6 +1036,9 @@ abstract class SettingsStoreBase with Store { isAppSecure = sharedPreferences.getBool(PreferencesKey.isAppSecureKey) ?? isAppSecure; disableBuy = sharedPreferences.getBool(PreferencesKey.disableBuyKey) ?? disableBuy; disableSell = sharedPreferences.getBool(PreferencesKey.disableSellKey) ?? disableSell; + walletListOrder = + WalletListOrderType.values[sharedPreferences.getInt(PreferencesKey.walletListOrder) ?? 0]; + walletListAscending = sharedPreferences.getBool(PreferencesKey.walletListAscending) ?? true; allowBiometricalAuthentication = sharedPreferences.getBool(PreferencesKey.allowBiometricalAuthenticationKey) ?? allowBiometricalAuthentication; diff --git a/lib/themes/bright_theme.dart b/lib/themes/bright_theme.dart index 0ea2bb6f2..42510a389 100644 --- a/lib/themes/bright_theme.dart +++ b/lib/themes/bright_theme.dart @@ -78,7 +78,7 @@ class BrightTheme extends LightTheme { FilterTheme get filterTheme => super.filterTheme.copyWith( checkboxSecondGradientColor: Palette.pinkFlamingo, checkboxBackgroundColor: Colors.white, - buttonColor: Colors.white.withOpacity(0.2), + buttonColor: Palette.darkGray.withOpacity(0.2), iconColor: Colors.white); @override diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index fb7019885..afe617803 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -66,7 +66,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with receiveAddress = '', depositAddress = '', isDepositAddressEnabled = false, - isReceiveAddressEnabled = false, isReceiveAmountEditable = false, _useTorOnly = false, receiveCurrencies = [], @@ -108,7 +107,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with bestRateSync = Timer.periodic(Duration(seconds: 10), (timer) => _calculateBestRate()); isDepositAddressEnabled = !(depositCurrency == wallet.currency); - isReceiveAddressEnabled = !(receiveCurrency == wallet.currency); depositAmount = ''; receiveAmount = ''; receiveAddress = ''; @@ -201,9 +199,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with @observable bool isDepositAddressEnabled; - @observable - bool isReceiveAddressEnabled; - @observable bool isReceiveAmountEntered; @@ -315,7 +310,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with isFixedRateMode = false; _onPairChange(); isDepositAddressEnabled = !(depositCurrency == wallet.currency); - isReceiveAddressEnabled = !(receiveCurrency == wallet.currency); } @action @@ -324,7 +318,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with isFixedRateMode = false; _onPairChange(); isDepositAddressEnabled = !(depositCurrency == wallet.currency); - isReceiveAddressEnabled = !(receiveCurrency == wallet.currency); } @action @@ -535,7 +528,6 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with depositAddress = depositCurrency == wallet.currency ? wallet.walletAddresses.address : ''; receiveAddress = receiveCurrency == wallet.currency ? wallet.walletAddresses.address : ''; isDepositAddressEnabled = !(depositCurrency == wallet.currency); - isReceiveAddressEnabled = !(receiveCurrency == wallet.currency); isFixedRateMode = false; _onPairChange(); } diff --git a/lib/view_model/wallet_list/wallet_list_view_model.dart b/lib/view_model/wallet_list/wallet_list_view_model.dart index 0abebba15..3df6491bb 100644 --- a/lib/view_model/wallet_list/wallet_list_view_model.dart +++ b/lib/view_model/wallet_list/wallet_list_view_model.dart @@ -1,5 +1,6 @@ import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/core/wallet_loading_service.dart'; +import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/store/app_store.dart'; @@ -19,7 +20,7 @@ abstract class WalletListViewModelBase with Store { this._walletLoadingService, this._authService, ) : wallets = ObservableList() { - updateList(); + setOrderType(_appStore.settingsStore.walletListOrder); reaction((_) => _appStore.wallet, (_) => updateList()); } @@ -43,11 +44,14 @@ abstract class WalletListViewModelBase with Store { @action Future loadWallet(WalletListItem walletItem) async { - final wallet = - await _walletLoadingService.load(walletItem.type, walletItem.name); + final wallet = await _walletLoadingService.load(walletItem.type, walletItem.name); _appStore.changeCurrentWallet(wallet); } + WalletListOrderType? get orderType => _appStore.settingsStore.walletListOrder; + + bool get ascending => _appStore.settingsStore.walletListAscending; + @action void updateList() { wallets.clear(); @@ -57,14 +61,105 @@ abstract class WalletListViewModelBase with Store { name: info.name, type: info.type, key: info.key, - isCurrent: info.name == _appStore.wallet?.name && - info.type == _appStore.wallet?.type, + isCurrent: info.name == _appStore.wallet?.name && info.type == _appStore.wallet?.type, isEnabled: availableWalletTypes.contains(info.type), ), ), ); } + Future reorderAccordingToWalletList() async { + if (wallets.isEmpty) { + updateList(); + return; + } + + _appStore.settingsStore.walletListOrder = WalletListOrderType.Custom; + + // make a copy of the walletInfoSource: + List walletInfoSourceCopy = _walletInfoSource.values.toList(); + // delete all wallets from walletInfoSource: + await _walletInfoSource.clear(); + + // add wallets from wallets list in order of wallets list, by name: + for (WalletListItem wallet in wallets) { + for (int i = 0; i < walletInfoSourceCopy.length; i++) { + if (walletInfoSourceCopy[i].name == wallet.name) { + await _walletInfoSource.add(walletInfoSourceCopy[i]); + walletInfoSourceCopy.removeAt(i); + break; + } + } + } + + updateList(); + } + + Future sortGroupByType() async { + // sort the wallets by type: + List walletInfoSourceCopy = _walletInfoSource.values.toList(); + await _walletInfoSource.clear(); + if (ascending) { + walletInfoSourceCopy.sort((a, b) => a.type.toString().compareTo(b.type.toString())); + } else { + walletInfoSourceCopy.sort((a, b) => b.type.toString().compareTo(a.type.toString())); + } + await _walletInfoSource.addAll(walletInfoSourceCopy); + updateList(); + } + + Future sortAlphabetically() async { + // sort the wallets alphabetically: + List walletInfoSourceCopy = _walletInfoSource.values.toList(); + await _walletInfoSource.clear(); + if (ascending) { + walletInfoSourceCopy.sort((a, b) => a.name.compareTo(b.name)); + } else { + walletInfoSourceCopy.sort((a, b) => b.name.compareTo(a.name)); + } + await _walletInfoSource.addAll(walletInfoSourceCopy); + updateList(); + } + + Future sortByCreationDate() async { + // sort the wallets by creation date: + List walletInfoSourceCopy = _walletInfoSource.values.toList(); + await _walletInfoSource.clear(); + if (ascending) { + walletInfoSourceCopy.sort((a, b) => a.date.compareTo(b.date)); + } else { + walletInfoSourceCopy.sort((a, b) => b.date.compareTo(a.date)); + } + await _walletInfoSource.addAll(walletInfoSourceCopy); + updateList(); + } + + void setAscending(bool ascending) { + _appStore.settingsStore.walletListAscending = ascending; + } + + Future setOrderType(WalletListOrderType? type) async { + if (type == null) return; + + _appStore.settingsStore.walletListOrder = type; + + switch (type) { + case WalletListOrderType.CreationDate: + await sortByCreationDate(); + break; + case WalletListOrderType.Alphabetical: + await sortAlphabetically(); + break; + case WalletListOrderType.GroupByType: + await sortGroupByType(); + break; + case WalletListOrderType.Custom: + default: + await reorderAccordingToWalletList(); + break; + } + } + bool checkIfAuthRequired() { return _authService.requireAuth(); } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 12401a360..84601fbc8 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -727,6 +727,9 @@ "require_for_exchanges_to_external_wallets": "ﺔﻴﺟﺭﺎﺧ ﻆﻓﺎﺤﻣ ﻰﻟﺇ ﺕﻻﺩﺎﺒﺘﻟﺍ ﺐﻠﻄﺘﺗ", "camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ", "switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ", + "order_by": "ترتيب حسب", + "creation_date": "تاريخ الإنشاء", + "group_by_type": "مجموعة حسب النوع", "importNFTs": "NFTs ﺩﺍﺮﻴﺘﺳﺍ", "noNFTYet": "ﻥﻵﺍ ﻰﺘﺣ NFTs ﺪﺟﻮﻳ ﻻ", "address": " ﻥﺍﻮﻨﻋ", @@ -749,6 +752,8 @@ "seed_language_czech": "التشيكية", "seed_language_korean": "الكورية", "seed_language_chinese_traditional": "تقاليد صينية)", + "ascending": "تصاعدي", + "descending": "النزول", "mainnet": "mainnet", "trocador_anonpay_invoice": "فاتورة Trocador Anonpay", "trocador_anonpay_donation_link": "رابط التبرع Trocador Anonpay", @@ -758,5 +763,6 @@ "dfx_option_description": "ﺎﺑﻭﺭﻭﺃ ﻲﻓ ﺕﺎﻛﺮﺸﻟﺍﻭ ﺔﺋﺰﺠﺘﻟﺍ ءﻼﻤﻌﻟ .ﻲﻓﺎﺿﺇ KYC ﻥﻭﺪﺑ ﻭﺭﻮﻳ 990 ﻰﻟﺇ ﻞﺼﻳ ﺎﻣ .ﻱﺮﺴﻳﻮﺴﻟﺍ", "polygonscan_history": "ﻥﺎﻜﺴﻧﻮﺠﻴﻟﻮﺑ ﺦﻳﺭﺎﺗ", "wallet_seed_legacy": "بذرة محفظة قديمة", + "custom_drag": "مخصص (عقد وسحب)", "switchToEVMCompatibleWallet": " (Ethereum، Polygon) ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ EVM ﻊﻣ ﺔﻘﻓﺍﻮﺘﻣ ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ" } diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index a05b6a4ae..db6b805ed 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -723,6 +723,9 @@ "require_for_exchanges_to_external_wallets": "Изискване за обмен към външни портфейли", "camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.", "switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново", + "order_by": "Подредени по", + "creation_date": "Дата на създаване", + "group_by_type": "Група по вид", "importNFTs": "Импортирайте NFT", "noNFTYet": "Все още няма NFT", "address": "Адрес", @@ -745,6 +748,8 @@ "seed_language_czech": "Чех", "seed_language_korean": "Корейски", "seed_language_chinese_traditional": "Традиционен китайски)", + "ascending": "Възходящ", + "descending": "Низходящ", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Трокадор Anonpay Фактура", "trocador_anonpay_donation_link": "Трокадорна връзка за дарение на Anonpay", @@ -754,5 +759,6 @@ "dfx_option_description": "Купете крипто с EUR и CHF. До 990 € без допълнителен KYC. За клиенти на дребно и корпоративни клиенти в Европа", "polygonscan_history": "История на PolygonScan", "wallet_seed_legacy": "Наследено портфейл семе", + "custom_drag": "Персонализиране (задръжте и плъзнете)", "switchToEVMCompatibleWallet": "Моля, превключете към портфейл, съвместим с EVM, и опитайте отново (Ethereum, Polygon)" } diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 69abbe267..e43271b28 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -723,6 +723,9 @@ "require_for_exchanges_to_external_wallets": "Vyžadovat pro výměny do externích peněženek", "camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.", "switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu", + "order_by": "Seřadit podle", + "creation_date": "Datum vzniku", + "group_by_type": "Skupina podle typu", "importNFTs": "Importujte NFT", "noNFTYet": "Zatím žádné NFT", "address": "Adresa", @@ -745,6 +748,8 @@ "seed_language_czech": "čeština", "seed_language_korean": "korejština", "seed_language_chinese_traditional": "Číňan (tradiční)", + "ascending": "Vzestupné", + "descending": "Klesající", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Trocador anonpay faktura", "trocador_anonpay_donation_link": "Trocador AnonPay Darovací odkaz", @@ -754,5 +759,6 @@ "dfx_option_description": "Nakupujte kryptoměny za EUR a CHF. Až 990 € bez dalších KYC. Pro maloobchodní a firemní zákazníky v Evropě", "polygonscan_history": "Historie PolygonScan", "wallet_seed_legacy": "Starší semeno peněženky", + "custom_drag": "Custom (Hold and Drag)", "switchToEVMCompatibleWallet": "Přepněte na peněženku kompatibilní s EVM a zkuste to znovu (Ethereum, Polygon)" } diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 44b05bea8..0e1566f72 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "Erforderlich für den Umtausch in externe Wallets", "camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.", "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut", + "order_by": "Sortieren nach", + "creation_date": "Erstellungsdatum", + "group_by_type": "Gruppe nach Typ", "importNFTs": "NFTs importieren", "noNFTYet": "Noch keine NFTs", "address": "Adresse", @@ -753,6 +756,8 @@ "seed_language_czech": "Tschechisch", "seed_language_korean": "Koreanisch", "seed_language_chinese_traditional": "Chinesisch (Traditionell)", + "ascending": "Aufsteigend", + "descending": "Absteigend", "mainnet": "Hauptnetz", "trocador_anonpay_invoice": "Trocador Anonpay In Rechnung", "trocador_anonpay_donation_link": "Trocador Anonpay Spendenlink", @@ -762,5 +767,6 @@ "dfx_option_description": "Krypto mit EUR und CHF kaufen. Bis zu 990€ ohne zusätzliches KYC. Für Privat- und Firmenkunden in Europa", "polygonscan_history": "PolygonScan-Verlauf", "wallet_seed_legacy": "Legacy Wallet Seed", + "custom_drag": "Custom (Hold and Drag)", "switchToEVMCompatibleWallet": "Bitte wechseln Sie zu einem EVM-kompatiblen Wallet und versuchen Sie es erneut (Ethereum, Polygon)" } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 68dfdad8c..32e0d981a 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -498,7 +498,7 @@ "bill_amount": "Bill Amount", "you_pay": "You Pay", "tip": "Tip:", - "custom": "custom", + "custom": "Custom", "by_cake_pay": "by Cake Pay", "expires": "Expires", "mm": "MM", @@ -732,6 +732,9 @@ "require_for_exchanges_to_external_wallets": "Require for exchanges to external wallets", "camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.", "switchToETHWallet": "Please switch to an Ethereum wallet and try again", + "order_by": "Order by", + "creation_date": "Creation Date", + "group_by_type": "Group by type", "importNFTs": "Import NFTs", "noNFTYet": "No NFTs yet", "address": "Address", @@ -754,6 +757,8 @@ "seed_language_czech": "Czech", "seed_language_korean": "Korean", "seed_language_chinese_traditional": "Chinese (Traditional)", + "ascending": "Ascending", + "descending": "Descending", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Trocador AnonPay Invoice", "trocador_anonpay_donation_link": "Trocador AnonPay Donation Link", @@ -763,5 +768,6 @@ "dfx_option_description": "Buy crypto with EUR & CHF. Up to 990€ without additional KYC. For retail and corporate customers in Europe", "polygonscan_history": "PolygonScan history", "wallet_seed_legacy": "Legacy wallet seed", + "custom_drag": "Custom (Hold and Drag)", "switchToEVMCompatibleWallet": "Please switch to an EVM compatible wallet and try again (Ethereum, Polygon)" } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index c7bd682d6..f565da907 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "Requerido para intercambios a billeteras externas", "camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítelo desde la configuración de la aplicación.", "switchToETHWallet": "Cambie a una billetera Ethereum e inténtelo nuevamente.", + "order_by": "Ordenar", + "creation_date": "Fecha de creación", + "group_by_type": "Grupo por tipo", "importNFTs": "Importar NFT", "noNFTYet": "Aún no hay NFT", "address": "DIRECCIÓN", @@ -752,6 +755,8 @@ "seedtype_polyseed": "Polieta (16 palabras)", "seed_language_czech": "checo", "seed_language_korean": "coreano", + "ascending": "Ascendente", + "descending": "Descendente", "seed_language_chinese_traditional": "Chino (tradicional)", "dfx_option_description": "Compre criptomonedas con EUR y CHF. Hasta 990€ sin KYC adicional. Para clientes minoristas y corporativos en Europa", "seed_language_chinese_traditional": "Chino (tradicional)", @@ -763,5 +768,6 @@ "primary_silent_address": "Dirección silenciosa primaria", "polygonscan_history": "Historial de PolygonScan", "wallet_seed_legacy": "Semilla de billetera heredada", + "custom_drag": "Custom (mantenía y arrastre)", "switchToEVMCompatibleWallet": "Cambie a una billetera compatible con EVM e inténtelo nuevamente (Ethereum, Polygon)" } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index dd041e745..3df646871 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -729,8 +729,7 @@ "exchange_provider_unsupported": "${providerName} n'est plus pris en charge !", "domain_looks_up": "Résolution de nom", "require_for_exchanges_to_external_wallets": "Exiger pour les échanges vers des portefeuilles externes", - "camera_permission_is_required": "L'autorisation d'accès à la caméra est requise.\nVeuillez l'activer depuis les paramètres de l'application.", - "switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer", + "camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.", "importNFTs": "Importer des NFT", "noNFTYet": "Pas encore de NFT", "address": "Adresse", @@ -741,7 +740,11 @@ "seed_phrase_length": "Longueur de la phrase de départ", "unavailable_balance": "Solde indisponible", "unavailable_balance_description": "Solde indisponible : ce total comprend les fonds bloqués dans les transactions en attente et ceux que vous avez activement gelés dans vos paramètres de contrôle des pièces. Les soldes bloqués deviendront disponibles une fois leurs transactions respectives terminées, tandis que les soldes gelés resteront inaccessibles aux transactions jusqu'à ce que vous décidiez de les débloquer.", + "switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer", "unspent_change": "Changement", + "order_by": "Commandé par", + "creation_date": "Date de création", + "group_by_type": "Groupe par type", "Block_remaining": "${status} bloc restant", "labeled_silent_addresses": "Adresses silencieuses étiquetées", "use_testnet": "Utiliser TestNet", @@ -753,6 +756,8 @@ "seed_language_czech": "tchèque", "seed_language_korean": "coréen", "seed_language_chinese_traditional": "Chinois (Traditionnel)", + "ascending": "Ascendant", + "descending": "Descendant", "mainnet": "MainNet", "trocador_anonpay_invoice": "Facture anonpay du Trocador", "trocador_anonpay_donation_link": "Lien de don du Trocador anonpay", @@ -762,5 +767,6 @@ "dfx_option_description": "Achetez des crypto-monnaies avec EUR et CHF. Jusqu'à 990€ sans KYC supplémentaire. Pour les clients particuliers et entreprises en Europe", "polygonscan_history": "Historique de PolygonScan", "wallet_seed_legacy": "Graine de portefeuille hérité", + "custom_drag": "Custom (maintenir et traîner)", "switchToEVMCompatibleWallet": "Veuillez passer à un portefeuille compatible EVM et réessayer (Ethereum, Polygon)" } diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 76821d482..2d0c8994b 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -709,6 +709,9 @@ "require_for_exchanges_to_external_wallets": "Bukatar musanya zuwa wallet na waje", "camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.", "switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa", + "order_by": "Oda ta", + "creation_date": "Ranar halitta", + "group_by_type": "Rukuni ta nau'in", "importNFTs": "Shigo da NFTs", "noNFTYet": "Babu NFTs tukuna", "address": "Adireshi", @@ -731,6 +734,8 @@ "seed_language_czech": "Czech", "seed_language_korean": "Yaren Koriya", "seed_language_chinese_traditional": "Sinanci (na gargajiya)", + "ascending": "Hau", + "descending": "Saukowa", "mainnet": "Otnet", "trocador_anonpay_invoice": "Atroador Antonpay", "trocador_anonpay_donation_link": "Hanyar bayar da gudummawa na Trorojador", @@ -740,5 +745,6 @@ "dfx_option_description": "Sayi crypto tare da EUR & CHF. Har zuwa € 990 ba tare da ƙarin KYC ba. Don 'yan kasuwa da abokan ciniki na kamfanoni a Turai", "polygonscan_history": "PolygonScan tarihin kowane zamani", "wallet_seed_legacy": "Tallarin walat walat", + "custom_drag": "Al'ada (riƙe da ja)", "switchToEVMCompatibleWallet": "Da fatan za a canza zuwa walat ɗin EVM mai jituwa kuma a sake gwadawa (Ethereum, Polygon)" } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 07483f688..7820095a8 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "बाहरी वॉलेट में एक्सचेंज की आवश्यकता है", "camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।", "switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें", + "order_by": "द्वारा आदेश", + "creation_date": "निर्माण तिथि", + "group_by_type": "प्रकार द्वारा समूह", "importNFTs": "एनएफटी आयात करें", "noNFTYet": "अभी तक कोई एनएफटी नहीं", "address": "पता", @@ -753,6 +756,8 @@ "seed_language_czech": "चेक", "seed_language_korean": "कोरियाई", "seed_language_chinese_traditional": "चीनी पारंपरिक)", + "ascending": "आरोही", + "descending": "अवरोही", "mainnet": "मेननेट", "trocador_anonpay_invoice": "Trocador anonpay चालान", "trocador_anonpay_donation_link": "Trocador anonpay दान लिंक", @@ -762,5 +767,6 @@ "dfx_option_description": "EUR और CHF के साथ क्रिप्टो खरीदें। अतिरिक्त केवाईसी के बिना 990€ तक। यूरोप में खुदरा और कॉर्पोरेट ग्राहकों के लिए", "polygonscan_history": "पॉलीगॉनस्कैन इतिहास", "wallet_seed_legacy": "विरासत बटुए बीज", + "custom_drag": "कस्टम (पकड़ और खींचें)", "switchToEVMCompatibleWallet": "कृपया ईवीएम संगत वॉलेट पर स्विच करें और पुनः प्रयास करें (एथेरियम, पॉलीगॉन)" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index dda8d933c..c42146d00 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -729,6 +729,9 @@ "require_for_exchanges_to_external_wallets": "Zahtijeva razmjene na vanjske novčanike", "camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.", "switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno", + "order_by": "Narediti", + "creation_date": "Datum stvaranja", + "group_by_type": "Grupirati", "importNFTs": "Uvoz NFT-ova", "noNFTYet": "Još nema NFT-ova", "address": "Adresa", @@ -750,6 +753,8 @@ "seedtype_polyseed": "Poliseed (16 riječi)", "seed_language_czech": "češki", "seed_language_korean": "korejski", + "ascending": "Uzlazni", + "descending": "Silazni", "seed_language_chinese_traditional": "Kinesko (tradicionalno)", "dfx_option_description": "Kupujte kripto s EUR i CHF. Do 990 € bez dodatnog KYC-a. Za maloprodajne i poslovne korisnike u Europi", "seed_language_chinese_traditional": "Kinesko (tradicionalno)", @@ -761,5 +766,6 @@ "primary_silent_address": "Primarna tiha adresa", "polygonscan_history": "Povijest PolygonScan", "wallet_seed_legacy": "Sjeme naslijeđenog novčanika", + "custom_drag": "Prilagođeni (držite i povucite)", "switchToEVMCompatibleWallet": "Prijeđite na novčanik kompatibilan s EVM-om i pokušajte ponovno (Ethereum, Polygon)" } diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 4081669dd..71c52cc17 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -719,6 +719,9 @@ "require_for_exchanges_to_external_wallets": "Memerlukan pertukaran ke dompet eksternal", "camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.", "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi", + "order_by": "Dipesan oleh", + "creation_date": "Tanggal Pembuatan", + "group_by_type": "Grup demi jenis", "importNFTs": "Impor NFT", "noNFTYet": "Belum ada NFT", "address": "Alamat", @@ -740,6 +743,8 @@ "seedtype_polyseed": "Polyseed (16 kata)", "seed_language_czech": "Ceko", "seed_language_korean": "Korea", + "ascending": "Naik", + "descending": "Menurun", "seed_language_chinese_traditional": "Cina (tradisional)", "dfx_option_description": "Beli kripto dengan EUR & CHF. Hingga 990€ tanpa KYC tambahan. Untuk pelanggan ritel dan korporat di Eropa", "seed_language_chinese_traditional": "Cina (tradisional)", @@ -751,5 +756,6 @@ "primary_silent_address": "Alamat diam primer", "polygonscan_history": "Sejarah PolygonScan", "wallet_seed_legacy": "Biji dompet warisan", + "custom_drag": "Khusus (tahan dan seret)", "switchToEVMCompatibleWallet": "Silakan beralih ke dompet yang kompatibel dengan EVM dan coba lagi (Ethereum, Polygon)" } diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 544d1317c..b604e20fd 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "Richiede scambi con portafogli esterni", "camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.", "switchToETHWallet": "Passa a un portafoglio Ethereum e riprova", + "order_by": "Ordinato da", + "creation_date": "Data di creazione", + "group_by_type": "Gruppo per tipo", "importNFTs": "Importa NFT", "noNFTYet": "Nessun NFT ancora", "address": "Indirizzo", @@ -753,6 +756,8 @@ "seed_language_czech": "ceco", "seed_language_korean": "coreano", "seed_language_chinese_traditional": "Cinese tradizionale)", + "ascending": "Ascendente", + "descending": "Discendente", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Trocador Anonpay fattura", "trocador_anonpay_donation_link": "Link di donazione di Trocador Anonpay", @@ -762,5 +767,6 @@ "dfx_option_description": "Acquista criptovalute con EUR e CHF. Fino a 990€ senza KYC aggiuntivi. Per clienti al dettaglio e aziendali in Europa", "polygonscan_history": "Cronologia PolygonScan", "wallet_seed_legacy": "Seme di portafoglio legacy", + "custom_drag": "Custom (Hold and Drag)", "switchToEVMCompatibleWallet": "Passa a un portafoglio compatibile con EVM e riprova (Ethereum, Polygon)" } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 22f982a51..c233a2434 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "外部ウォレットへの交換に必要", "camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。", "switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください", + "order_by": "注文", + "creation_date": "作成日", + "group_by_type": "タイプごとにグループ", "importNFTs": "NFTのインポート", "noNFTYet": "NFTはまだありません", "address": "住所", @@ -753,6 +756,8 @@ "seed_language_czech": "チェコ", "seed_language_korean": "韓国語", "seed_language_chinese_traditional": "中国の伝統的な)", + "ascending": "上昇", + "descending": "下降", "mainnet": "メインネット", "trocador_anonpay_invoice": "Trocador Anonpay請求書", "trocador_anonpay_donation_link": "Trocador Anonpay寄付リンク", @@ -762,5 +767,6 @@ "dfx_option_description": "EUR と CHF で暗号通貨を購入します。追加のKYCなしで最大990ユーロ。ヨーロッパの小売および法人顧客向け", "polygonscan_history": "ポリゴンスキャン履歴", "wallet_seed_legacy": "レガシーウォレットシード", + "custom_drag": "カスタム(ホールドとドラッグ)", "switchToEVMCompatibleWallet": "EVM 互換のウォレットに切り替えて再試行してください (イーサリアム、ポリゴン)" } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 97f0f04d1..698d3f1d1 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -729,6 +729,9 @@ "require_for_exchanges_to_external_wallets": "외부 지갑으로의 교환을 위해 필요", "camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.", "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요.", + "order_by": "주문", + "creation_date": "생산 일", + "group_by_type": "유형별 그룹", "importNFTs": "NFT 가져오기", "noNFTYet": "아직 NFT가 없습니다", "address": "주소", @@ -751,6 +754,8 @@ "seed_language_czech": "체코 사람", "seed_language_korean": "한국인", "seed_language_chinese_traditional": "중국 전통)", + "ascending": "오름차순", + "descending": "내림차순", "mainnet": "메인 넷", "trocador_anonpay_invoice": "Trocador Anonpay 송장", "trocador_anonpay_donation_link": "Trocador Anonpay 기부 링크", @@ -760,5 +765,6 @@ "dfx_option_description": "EUR 및 CHF로 암호화폐를 구매하세요. 추가 KYC 없이 최대 990€. 유럽의 소매 및 기업 고객용", "polygonscan_history": "다각형 스캔 기록", "wallet_seed_legacy": "레거시 지갑 시드", + "custom_drag": "사용자 정의 (홀드 앤 드래그)", "switchToEVMCompatibleWallet": "EVM 호환 지갑으로 전환 후 다시 시도해 주세요. (이더리움, 폴리곤)" } diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index f09930e3e..28bec27e6 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -729,6 +729,9 @@ "require_for_exchanges_to_external_wallets": "ပြင်ပပိုက်ဆံအိတ်များသို့ လဲလှယ်ရန် လိုအပ်သည်။", "camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။", "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။", + "order_by": "အမှာစာ", + "creation_date": "ဖန်တီးမှုနေ့စွဲ", + "group_by_type": "အမျိုးအစားအလိုက်အုပ်စုဖွဲ့", "importNFTs": "NFTs များကို တင်သွင်းပါ။", "noNFTYet": "NFTs မရှိသေးပါ။", "address": "လိပ်စာ", @@ -751,6 +754,8 @@ "seed_language_czech": "ချက်", "seed_language_korean": "ကိုးရီးယား", "seed_language_chinese_traditional": "တရုတ်ရိုးရာ)", + "ascending": "တက်", + "descending": "ဆင်း", "mainnet": "မမက်မ", "trocador_anonpay_invoice": "Trocador Anonpay ငွေတောင်းခံလွှာ", "trocador_anonpay_donation_link": "Trocador Anonpay အလှူငွေလင့်ခ်", @@ -760,5 +765,6 @@ "dfx_option_description": "EUR & CHF ဖြင့် crypto ကိုဝယ်ပါ။ အပို KYC မပါဘဲ 990€ အထိ။ ဥရောပရှိ လက်လီရောင်းချသူများနှင့် ကော်ပိုရိတ်ဖောက်သည်များအတွက်", "polygonscan_history": "PolygonScan မှတ်တမ်း", "wallet_seed_legacy": "အမွေအနှစ်ပိုက်ဆံအိတ်မျိုးစေ့", + "custom_drag": "စိတ်ကြိုက် (Drag)", "switchToEVMCompatibleWallet": "ကျေးဇူးပြု၍ EVM တွဲဖက်သုံးနိုင်သော ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ (Ethereum၊ Polygon)" } diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 56e647867..164f64a02 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "Vereist voor uitwisselingen naar externe portemonnees", "camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.", "switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw", + "order_by": "Bestellen door", + "creation_date": "Aanmaakdatum", + "group_by_type": "Groep voor type", "importNFTs": "NFT's importeren", "noNFTYet": "Nog geen NFT's", "address": "Adres", @@ -752,6 +755,8 @@ "seedtype_polyseed": "Polyseed (16 woorden)", "seed_language_czech": "Tsjechisch", "seed_language_korean": "Koreaans", + "ascending": "Stijgend", + "descending": "Aflopend", "seed_language_chinese_traditional": "Chinese (traditionele)", "dfx_option_description": "Koop crypto met EUR & CHF. Tot 990€ zonder extra KYC. Voor particuliere en zakelijke klanten in Europa", "seed_language_chinese_traditional": "Chinese (traditionele)", @@ -763,5 +768,6 @@ "primary_silent_address": "Primair stil adres", "polygonscan_history": "PolygonScan-geschiedenis", "wallet_seed_legacy": "Legacy portemonnee zaad", + "custom_drag": "Custom (vasthouden en slepen)", "switchToEVMCompatibleWallet": "Schakel over naar een EVM-compatibele portemonnee en probeer het opnieuw (Ethereum, Polygon)" } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index fb5930bfd..761593755 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "Wymagaj wymiany na portfele zewnętrzne", "camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.", "switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie", + "order_by": "Zamów przez", + "creation_date": "Data utworzenia", + "group_by_type": "Grupa według typu", "importNFTs": "Importuj NFT", "noNFTYet": "Nie ma jeszcze NFT", "address": "Adres", @@ -753,6 +756,8 @@ "seed_language_czech": "Czech", "seed_language_korean": "koreański", "seed_language_chinese_traditional": "Chiński tradycyjny)", + "ascending": "Wznoszący się", + "descending": "Schodzenie", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Trocador anonpay faktura", "trocador_anonpay_donation_link": "Link darowizny Trocador Anonpay", @@ -762,5 +767,6 @@ "dfx_option_description": "Kupuj kryptowaluty za EUR i CHF. Do 990 € bez dodatkowego KYC. Dla klientów detalicznych i korporacyjnych w Europie", "polygonscan_history": "Historia PolygonScan", "wallet_seed_legacy": "Dziedziczne ziarno portfela", + "custom_drag": "Niestandardowe (trzymaj i przeciągnij)", "switchToEVMCompatibleWallet": "Przejdź na portfel zgodny z EVM i spróbuj ponownie (Ethereum, Polygon)" } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 4d516da9c..7f85e8481 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -730,6 +730,9 @@ "require_for_exchanges_to_external_wallets": "Exigir trocas para carteiras externas", "camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.", "switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente", + "order_by": "Ordenar por", + "creation_date": "Data de criação", + "group_by_type": "Grupo por tipo", "importNFTs": "Importar NFTs", "noNFTYet": "Ainda não há NFT", "address": "Endereço", @@ -752,6 +755,8 @@ "seed_language_czech": "Tcheco", "seed_language_korean": "coreano", "seed_language_chinese_traditional": "Chinês tradicional)", + "ascending": "Ascendente", + "descending": "descendente", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Fatura Trocador Anonpay", "trocador_anonpay_donation_link": "Link de doação de Trocador Anonpay", @@ -761,5 +766,6 @@ "dfx_option_description": "Compre criptografia com EUR e CHF. Até 990€ sem KYC adicional. Para clientes de varejo e corporativos na Europa", "polygonscan_history": "História do PolygonScan", "wallet_seed_legacy": "Semente de carteira herdada", + "custom_drag": "Personalizado (segure e arraste)", "switchToEVMCompatibleWallet": "Mude para uma carteira compatível com EVM e tente novamente (Ethereum, Polygon)" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index e517e8d29..b799da6a4 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "Требовать обмена на внешние кошельки", "camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.", "switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку.", + "order_by": "Сортировать по", + "creation_date": "Дата создания", + "group_by_type": "Группа по типу", "importNFTs": "Импортировать NFT", "noNFTYet": "NFT пока нет", "address": "Адрес", @@ -753,6 +756,8 @@ "seed_language_czech": "Чешский", "seed_language_korean": "Корейский", "seed_language_chinese_traditional": "Китайский традиционный)", + "ascending": "Восходящий", + "descending": "Нисходящий", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Трокадор Anonpay", "trocador_anonpay_donation_link": "Ссылка пожертвования Trocador Anonpay", @@ -762,5 +767,6 @@ "dfx_option_description": "Покупайте криптовалюту за EUR и CHF. До 990€ без дополнительного KYC. Для розничных и корпоративных клиентов в Европе", "polygonscan_history": "История PolygonScan", "wallet_seed_legacy": "Наследие семя кошелька", + "custom_drag": "Пользователь (удерживайте и перетаскивайте)", "switchToEVMCompatibleWallet": "Пожалуйста, переключитесь на кошелек, совместимый с EVM, и повторите попытку (Ethereum, Polygon)." } diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 7b4fa6d27..25622510a 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -729,6 +729,9 @@ "require_for_exchanges_to_external_wallets": "จำเป็นต้องแลกเปลี่ยนกับกระเป๋าเงินภายนอก", "camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป", "switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง", + "order_by": "สั่งโดย", + "creation_date": "วันที่สร้าง", + "group_by_type": "กลุ่มตามประเภท", "importNFTs": "นำเข้า NFT", "noNFTYet": "ยังไม่มี NFT", "address": "ที่อยู่", @@ -751,6 +754,8 @@ "seed_language_czech": "ภาษาเช็ก", "seed_language_korean": "เกาหลี", "seed_language_chinese_traditional": "จีน (ดั้งเดิม)", + "ascending": "จากน้อยไปมาก", + "descending": "ลงมา", "mainnet": "หลัก", "trocador_anonpay_invoice": "ใบแจ้งหนี้ Trocador Anonpay", "trocador_anonpay_donation_link": "ลิงค์บริจาค Trocador Anonpay", @@ -760,5 +765,6 @@ "dfx_option_description": "ซื้อ crypto ด้วย EUR และ CHF สูงถึง 990€ โดยไม่มี KYC เพิ่มเติม สำหรับลูกค้ารายย่อยและลูกค้าองค์กรในยุโรป", "polygonscan_history": "ประวัติ PolygonScan", "wallet_seed_legacy": "เมล็ดกระเป๋าเงินมรดก", + "custom_drag": "กำหนดเอง (ค้างและลาก)", "switchToEVMCompatibleWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงินที่รองรับ EVM แล้วลองอีกครั้ง (Ethereum, Polygon)" } diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index ea4009092..b762f0dd5 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -726,6 +726,9 @@ "require_for_exchanges_to_external_wallets": "Kinakailangan para sa mga palitan sa mga panlabas na wallet", "camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.", "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli", + "order_by": "Iniutos ni", + "creation_date": "Petsa ng paglikha", + "group_by_type": "Pangkat ayon sa uri", "importNFTs": "Mag-import ng mga NFT", "noNFTYet": "Wala pang NFT", "address": "Address", @@ -747,6 +750,8 @@ "seed_language_czech": "Czech", "seed_language_korean": "Korean", "seed_language_chinese_traditional": "Intsik (tradisyonal)", + "ascending": "Umakyat", + "descending": "Pababang", "mainnet": "Mainnet", "trocador_anonpay_invoice": "Trocador Anonpay Invoice", "trocador_anonpay_donation_link": "Trocador Anonpay Donation Link", @@ -756,5 +761,6 @@ "dfx_option_description": "Bumili ng crypto gamit ang EUR at CHF. Hanggang 990€ nang walang karagdagang KYC. Para sa retail at corporate na mga customer sa Europe", "polygonscan_history": "Kasaysayan ng PolygonScan", "wallet_seed_legacy": "Legacy wallet seed", + "custom_drag": "Pasadyang (hawakan at i -drag)", "switchToEVMCompatibleWallet": "Mangyaring lumipat sa isang EVM compatible na wallet at subukang muli (Ethereum, Polygon)" } diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index c49f637de..52fe53df8 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -729,6 +729,9 @@ "require_for_exchanges_to_external_wallets": "Harici cüzdanlara geçiş yapılmasını zorunlu kılın", "camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.", "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin", + "order_by": "Tarafından sipariş", + "creation_date": "Oluşturulma tarihi", + "group_by_type": "Türüne göre grup", "importNFTs": "NFT'leri içe aktar", "noNFTYet": "Henüz NFT yok", "address": "Adres", @@ -751,6 +754,8 @@ "seed_language_czech": "Çek", "seed_language_korean": "Koreli", "seed_language_chinese_traditional": "Çin geleneği)", + "ascending": "Yükselen", + "descending": "Azalan", "mainnet": "Ana ağ", "trocador_anonpay_invoice": "Trocador anonpay faturası", "trocador_anonpay_donation_link": "Trocador anonpay bağış bağlantısı", @@ -760,5 +765,6 @@ "dfx_option_description": "EUR ve CHF ile kripto satın alın. Ek KYC olmadan 990 €'ya kadar. Avrupa'daki perakende ve kurumsal müşteriler için", "polygonscan_history": "PolygonScan geçmişi", "wallet_seed_legacy": "Eski cüzdan tohumu", + "custom_drag": "Özel (Bekle ve Sürükle)", "switchToEVMCompatibleWallet": "Lütfen EVM uyumlu bir cüzdana geçin ve tekrar deneyin (Ethereum, Polygon)" } diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 21bad93e5..63124cbb6 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -731,6 +731,9 @@ "require_for_exchanges_to_external_wallets": "Потрібен для обміну на зовнішні гаманці", "camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.", "switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу", + "order_by": "Сортувати за", + "creation_date": "Дата створення", + "group_by_type": "Група за типом", "importNFTs": "Імпорт NFT", "noNFTYet": "NFT ще немає", "address": "Адреса", @@ -752,6 +755,8 @@ "seedtype_polyseed": "Полісей (16 слів)", "seed_language_czech": "Чеський", "seed_language_korean": "Корейський", + "ascending": "Висхід", + "descending": "Низхідний", "dfx_option_description": "Купуйте криптовалюту за EUR і CHF. До 990 євро без додаткового KYC. Для роздрібних і корпоративних клієнтів у Європі", "seed_language_chinese_traditional": "Китайський (традиційний)", "mainnet": "Мейннет", @@ -762,5 +767,6 @@ "primary_silent_address": "Первинна мовчазна адреса", "polygonscan_history": "Історія PolygonScan", "wallet_seed_legacy": "Спадець насіння гаманця", + "custom_drag": "На замовлення (утримуйте та перетягується)", "switchToEVMCompatibleWallet": "Перейдіть на гаманець, сумісний з EVM, і повторіть спробу (Ethereum, Polygon)" } diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 18700df5b..fb313accd 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -723,6 +723,9 @@ "require_for_exchanges_to_external_wallets": "۔ﮯﮨ ﺕﺭﻭﺮﺿ ﯽﮐ ﮯﻟﺩﺎﺒﺗ ﮟﯿﻣ ﮮﻮﭩﺑ ﯽﻧﻭﺮﯿﺑ", "camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ", "switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ", + "order_by": "آرڈر بذریعہ", + "creation_date": "بنانے کی تاریخ", + "group_by_type": "قسم کے لحاظ سے گروپ", "importNFTs": "NFTs ۔ﮟﯾﺮﮐ ﺪﻣﺁﺭﺩ", "noNFTYet": "۔ﮟﯿﮨ ﮟﯿﮩﻧ NFTs ﯽﺋﻮﮐ ﮏﺗ ﯽﮭﺑﺍ", "address": "ﮧﺘﭘ", @@ -745,6 +748,8 @@ "seed_language_czech": "چیک", "seed_language_korean": "کورین", "seed_language_chinese_traditional": "چینی (روایتی)", + "ascending": "چڑھنے", + "descending": "اترتے ہوئے", "mainnet": "مینیٹ", "trocador_anonpay_invoice": "ٹروکاڈور انون پے انوائس", "trocador_anonpay_donation_link": "ٹروکاڈور انونپے چندہ کا لنک", @@ -754,5 +759,6 @@ "dfx_option_description": "EUR ﺭﻭﺍ CHF ﯽﻓﺎﺿﺍ ۔ﮟﯾﺪﯾﺮﺧ ﻮﭩﭘﺮﮐ ﮫﺗﺎﺳ ﮯﮐ KYC ﮯﯿﻟ ﮯﮐ ﻦﯿﻓﺭﺎﺻ ﭧﯾﺭﻮﭘﺭﺎﮐ ﺭﻭﺍ ﮦﺩﺭﻮﺧ ﮟ", "polygonscan_history": "ﺦﯾﺭﺎﺗ ﯽﮐ ﻦﯿﮑﺳﺍ ﻥﻮﮔ ﯽﻟﻮﭘ", "wallet_seed_legacy": "میراثی پرس کا بیج", + "custom_drag": "کسٹم (ہولڈ اینڈ ڈریگ)", "switchToEVMCompatibleWallet": "(Ethereum, Polygon) ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ ﮯﻟﺍﻭ ﮯﻨﮭﮐﺭ ﺖﻘﺑﺎﻄﻣ " } diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index d59adbacd..c6e38c5b6 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -725,6 +725,9 @@ "require_for_exchanges_to_external_wallets": "Beere fun awọn paṣipaarọ si awọn apamọwọ ita", "camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.", "switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi", + "order_by": "Bere fun nipasẹ", + "creation_date": "Ọjọ ẹda", + "group_by_type": "Ẹgbẹ nipasẹ Iru", "importNFTs": "Gbe awọn NFT wọle", "noNFTYet": "Ko si awọn NFT sibẹsibẹ", "address": "Adirẹsi", @@ -747,6 +750,8 @@ "seed_language_czech": "Czech", "seed_language_korean": "Ara ẹni", "seed_language_chinese_traditional": "Kannada (ibile)", + "ascending": "Goke", + "descending": "Sọkalẹ", "mainnet": "Akọkọ", "trocador_anonpay_invoice": "Tragbar anonpaya risiti", "trocador_anonpay_donation_link": "Ọna asopọ Ẹbun Anontay Anontay", @@ -756,5 +761,6 @@ "dfx_option_description": "Ra crypto pẹlu EUR & CHF. Titi di 990 € laisi afikun KYC. Fun soobu ati awọn onibara ile-iṣẹ ni Yuroopu", "polygonscan_history": "PolygonScan itan", "wallet_seed_legacy": "Irugbin akole", + "custom_drag": "Aṣa (mu ati fa)", "switchToEVMCompatibleWallet": "Jọwọ yipada si apamọwọ ibaramu EVM ki o tun gbiyanju lẹẹkansi (Ethereum, Polygon)" } diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 8fa458247..2a184944a 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -730,6 +730,9 @@ "require_for_exchanges_to_external_wallets": "需要兑换到外部钱包", "camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。", "switchToETHWallet": "请切换到以太坊钱包并重试", + "order_by": "订购", + "creation_date": "创建日期", + "group_by_type": "按类型组", "importNFTs": "导入 NFT", "noNFTYet": "还没有 NFT", "address": "地址", @@ -752,6 +755,8 @@ "seed_language_czech": "捷克", "seed_language_korean": "韩国人", "seed_language_chinese_traditional": "中国传统的)", + "ascending": "上升", + "descending": "下降", "mainnet": "主网", "trocador_anonpay_invoice": "Trocador Anonpay发票", "trocador_anonpay_donation_link": "trocador anonpay捐赠链接", @@ -761,5 +766,6 @@ "dfx_option_description": "用欧元和瑞士法郎购买加密货币。高达 990 欧元,无需额外 KYC。对于欧洲的零售和企业客户", "polygonscan_history": "多边形扫描历史", "wallet_seed_legacy": "旧的钱包种子", + "custom_drag": "定制(保持和拖动)", "switchToEVMCompatibleWallet": "请切换到 EVM 兼容钱包并重试(以太坊、Polygon)" }