mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-22 11:39:22 +00:00
ui updates
This commit is contained in:
parent
7338e49888
commit
7c651d7fb1
38 changed files with 280 additions and 56 deletions
|
@ -41,6 +41,7 @@ import 'package:cake_wallet/src/screens/buy/payment_method_options_page.dart';
|
|||
import 'package:cake_wallet/src/screens/receive/address_list_page.dart';
|
||||
import 'package:cake_wallet/src/screens/seed/seed_verification/seed_verification_page.dart';
|
||||
import 'package:cake_wallet/src/screens/send/transaction_success_info_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/background_sync_page.dart';
|
||||
import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/mweb_logs_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/mweb_node_page.dart';
|
||||
|
@ -946,6 +947,8 @@ Future<void> setup({
|
|||
|
||||
getIt.registerFactory(() => ConnectionSyncPage(getIt.get<DashboardViewModel>()));
|
||||
|
||||
getIt.registerFactory(() => BackgroundSyncPage(getIt.get<DashboardViewModel>()));
|
||||
|
||||
getIt.registerFactory(() => SecurityBackupPage(getIt.get<SecuritySettingsViewModel>(),
|
||||
getIt.get<AuthService>(), getIt.get<AppStore>().wallet!.isHardwareWallet));
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ const DELAY_SECONDS_BEFORE_SYNC_START = 15;
|
|||
const spNodeNotificationMessage =
|
||||
"Currently configured Bitcoin node does not support Silent Payments. skipping wallet";
|
||||
const SYNC_THRESHOLD = 0.98;
|
||||
int REFRESH_QUEUE_HOURS = 1;
|
||||
Duration REFRESH_QUEUE_DURATION = Duration(hours: 1);
|
||||
|
||||
void setMainNotification(
|
||||
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, {
|
||||
|
@ -239,22 +239,29 @@ Future<void> onStart(ServiceInstance service) async {
|
|||
printV("STARTING SYNC TIMER");
|
||||
_syncTimer?.cancel();
|
||||
_syncTimer = Timer.periodic(const Duration(milliseconds: 2000), (timer) async {
|
||||
int syncedTicks = 0;
|
||||
for (int i = 0; i < syncingWallets.length; i++) {
|
||||
final wallet = syncingWallets[i];
|
||||
final syncStatus = wallet.syncStatus;
|
||||
final progress = wallet.syncStatus.progress();
|
||||
final progressPercent = (progress * 100).toStringAsPrecision(5) + "%";
|
||||
bool shouldSync = i == 0;
|
||||
|
||||
if (progress > 0.999) {
|
||||
printV("WALLET $i SYNCED");
|
||||
wallet.stopSync();
|
||||
// pop the first wallet from the list
|
||||
standbyWallets.add(syncingWallets.removeAt(i));
|
||||
flutterLocalNotificationsPlugin.cancelAll();
|
||||
continue;
|
||||
|
||||
|
||||
if (progress > 0.999 && shouldSync) {
|
||||
syncedTicks++;
|
||||
if (syncedTicks > 10) {
|
||||
syncedTicks = 0;
|
||||
printV("WALLET $i SYNCED");
|
||||
wallet.stopSync();
|
||||
// pop the first wallet from the list
|
||||
standbyWallets.add(syncingWallets.removeAt(i));
|
||||
flutterLocalNotificationsPlugin.cancelAll();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
bool shouldSync = i == 0;
|
||||
String title = "${walletTypeToCryptoCurrency(wallet.type).title} - ${wallet.name}";
|
||||
late String content;
|
||||
|
||||
|
@ -330,7 +337,7 @@ Future<void> onStart(ServiceInstance service) async {
|
|||
|
||||
_queueTimer?.cancel();
|
||||
// add a timer that checks all wallets and adds them to the queue if they are less than SYNC_THRESHOLD synced:
|
||||
_queueTimer = Timer.periodic(Duration(hours: REFRESH_QUEUE_HOURS), (timer) async {
|
||||
_queueTimer = Timer.periodic(REFRESH_QUEUE_DURATION, (timer) async {
|
||||
for (int i = 0; i < standbyWallets.length; i++) {
|
||||
final wallet = standbyWallets[i];
|
||||
final syncStatus = wallet.syncStatus;
|
||||
|
@ -339,17 +346,17 @@ Future<void> onStart(ServiceInstance service) async {
|
|||
final node = settingsStore.getCurrentNode(wallet.type);
|
||||
await wallet.connectToNode(node: node);
|
||||
await wallet.startSync();
|
||||
await Future.delayed(
|
||||
const Duration(seconds: 10)); // wait a few seconds before checking progress
|
||||
}
|
||||
|
||||
// wait a few seconds before checking progress:
|
||||
await Future.delayed(const Duration(seconds: 20));
|
||||
|
||||
if (syncStatus.progress() < SYNC_THRESHOLD) {
|
||||
syncingWallets.add(standbyWallets.removeAt(i));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
// setup a watch dog to restart the sync process if it gets stuck:
|
||||
List<double> lastFewProgresses = [];
|
||||
_stuckSyncTimer?.cancel();
|
||||
|
@ -492,6 +499,9 @@ class BackgroundTasks {
|
|||
|
||||
final SyncMode syncMode = settingsStore.currentSyncMode;
|
||||
final bool useNotifications = settingsStore.showSyncNotification;
|
||||
final bool syncEnabled = settingsStore.backgroundSyncEnabled;
|
||||
final bool syncOnBattery = settingsStore.backgroundSyncOnBattery;
|
||||
final bool syncOnData = settingsStore.backgroundSyncOnData;
|
||||
|
||||
if (useNotifications) {
|
||||
flutterLocalNotificationsPlugin
|
||||
|
@ -501,15 +511,11 @@ class BackgroundTasks {
|
|||
|
||||
bgService.invoke("stopService");
|
||||
|
||||
if (syncMode.type == SyncType.disabled || !FeatureFlag.isBackgroundSyncEnabled) {
|
||||
if (!syncEnabled || !FeatureFlag.isBackgroundSyncEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (syncMode.type == SyncType.aggressive) {
|
||||
REFRESH_QUEUE_HOURS = 3;
|
||||
} else {
|
||||
REFRESH_QUEUE_HOURS = 24;
|
||||
}
|
||||
REFRESH_QUEUE_DURATION = syncMode.frequency;
|
||||
|
||||
await initializeService(bgService, useNotifications);
|
||||
} catch (error, stackTrace) {
|
||||
|
|
|
@ -61,6 +61,9 @@ class PreferencesKey {
|
|||
static const syncModeKey = 'sync_mode';
|
||||
static const syncAllKey = 'sync_all';
|
||||
static const showSyncNotificationKey = 'show_sync_notification';
|
||||
static const backgroundSyncEnabled = 'background_sync_enabled';
|
||||
static const backgroundSyncOnBattery = 'background_sync_on_battery';
|
||||
static const backgroundSyncOnData = 'background_sync_on_data';
|
||||
static const lastPopupDate = 'last_popup_date';
|
||||
static const lastAppReviewDate = 'last_app_review_date';
|
||||
static const sortBalanceBy = 'sort_balance_by';
|
||||
|
|
|
@ -71,6 +71,7 @@ import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart';
|
|||
import 'package:cake_wallet/src/screens/send/send_page.dart';
|
||||
import 'package:cake_wallet/src/screens/send/send_template_page.dart';
|
||||
import 'package:cake_wallet/src/screens/send/transaction_success_info_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/background_sync_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/connection_sync_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/desktop_settings/desktop_settings_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/display_settings_page.dart';
|
||||
|
@ -806,6 +807,10 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
builder: (_) => getIt.get<SeedVerificationPage>(),
|
||||
);
|
||||
|
||||
case Routes.backgroundSync:
|
||||
return CupertinoPageRoute<void>(
|
||||
fullscreenDialog: true, builder: (_) => getIt.get<BackgroundSyncPage>());
|
||||
|
||||
default:
|
||||
return MaterialPageRoute<void>(
|
||||
builder: (_) => Scaffold(
|
||||
|
|
|
@ -110,6 +110,7 @@ class Routes {
|
|||
static const nftDetailsPage = '/nft_details_page';
|
||||
static const importNFTPage = '/import_nft_page';
|
||||
static const torPage = '/tor_page';
|
||||
static const backgroundSync = '/background_sync';
|
||||
|
||||
static const signPage = '/sign_page';
|
||||
static const connectDevices = '/device/connect';
|
||||
|
|
91
lib/src/screens/settings/background_sync_page.dart
Normal file
91
lib/src/screens/settings/background_sync_page.dart
Normal file
|
@ -0,0 +1,91 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/reactions/wallet_connect.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
|
||||
import 'package:cake_wallet/src/screens/settings/widgets/wallet_connect_button.dart';
|
||||
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
|
||||
import 'package:cake_wallet/utils/device_info.dart';
|
||||
import 'package:cake_wallet/utils/feature_flag.dart';
|
||||
import 'package:cake_wallet/utils/show_pop_up.dart';
|
||||
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
|
||||
import 'package:cake_wallet/view_model/settings/sync_mode.dart';
|
||||
import 'package:cw_core/battery_optimization_native.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
|
||||
class BackgroundSyncPage extends BasePage {
|
||||
BackgroundSyncPage(this.dashboardViewModel);
|
||||
|
||||
@override
|
||||
String get title => S.current.background_sync;
|
||||
|
||||
final DashboardViewModel dashboardViewModel;
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) {
|
||||
return Container(
|
||||
padding: EdgeInsets.only(top: 10),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Observer(builder: (context) {
|
||||
return SettingsSwitcherCell(
|
||||
title: S.current.background_sync,
|
||||
value: dashboardViewModel.backgroundSyncEnabled,
|
||||
onValueChange: (_, bool value) =>
|
||||
dashboardViewModel.setBackgroundSyncEnabled(value),
|
||||
);
|
||||
}),
|
||||
Observer(builder: (context) {
|
||||
return SettingsPickerCell<SyncMode>(
|
||||
title: S.current.background_sync_mode,
|
||||
items: SyncMode.all,
|
||||
displayItem: (SyncMode syncMode) => syncMode.name,
|
||||
selectedItem: dashboardViewModel.syncMode,
|
||||
onItemSelected: (syncMode) async {
|
||||
dashboardViewModel.setSyncMode(syncMode);
|
||||
|
||||
if (Platform.isIOS) return;
|
||||
});
|
||||
}),
|
||||
Observer(builder: (context) {
|
||||
return SettingsSwitcherCell(
|
||||
title: S.current.show_sync_notifications,
|
||||
value: dashboardViewModel.showSyncNotification,
|
||||
onValueChange: (BuildContext _, bool isEnabled) async {
|
||||
dashboardViewModel.setShowSyncNotification(isEnabled);
|
||||
},
|
||||
);
|
||||
}),
|
||||
// Observer(builder: (context) {
|
||||
// return SettingsSwitcherCell(
|
||||
// title: S.current.sync_all_wallets,
|
||||
// value: dashboardViewModel.syncAll,
|
||||
// onValueChange: (_, bool value) => dashboardViewModel.setSyncAll(value),
|
||||
// );
|
||||
// }),
|
||||
Observer(builder: (context) {
|
||||
return SettingsSwitcherCell(
|
||||
title: S.current.background_sync_on_battery,
|
||||
value: dashboardViewModel.backgroundSyncOnBattery,
|
||||
onValueChange: (_, bool value) =>
|
||||
dashboardViewModel.setBackgroundSyncOnBattery(value),
|
||||
);
|
||||
}),
|
||||
Observer(builder: (context) {
|
||||
return SettingsSwitcherCell(
|
||||
title: S.current.background_sync_on_data,
|
||||
value: dashboardViewModel.backgroundSyncOnData,
|
||||
onValueChange: (_, bool value) => dashboardViewModel.setBackgroundSyncOnData(value),
|
||||
);
|
||||
}),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -44,36 +44,6 @@ class ConnectionSyncPage extends BasePage {
|
|||
: S.current.rescan,
|
||||
handler: (context) => Navigator.of(context).pushNamed(Routes.rescan),
|
||||
),
|
||||
if (Platform.isAndroid && FeatureFlag.isBackgroundSyncEnabled) ...[
|
||||
Observer(builder: (context) {
|
||||
return SettingsPickerCell<SyncMode>(
|
||||
title: S.current.background_sync_mode,
|
||||
items: SyncMode.all,
|
||||
displayItem: (SyncMode syncMode) => syncMode.name,
|
||||
selectedItem: dashboardViewModel.syncMode,
|
||||
onItemSelected: (syncMode) async {
|
||||
dashboardViewModel.setSyncMode(syncMode);
|
||||
|
||||
if (Platform.isIOS) return;
|
||||
});
|
||||
}),
|
||||
Observer(builder: (context) {
|
||||
return SettingsSwitcherCell(
|
||||
title: S.current.show_sync_notifications,
|
||||
value: dashboardViewModel.showSyncNotification,
|
||||
onValueChange: (BuildContext _, bool isEnabled) async {
|
||||
dashboardViewModel.setShowSyncNotification(isEnabled);
|
||||
},
|
||||
);
|
||||
}),
|
||||
Observer(builder: (context) {
|
||||
return SettingsSwitcherCell(
|
||||
title: S.current.sync_all_wallets,
|
||||
value: dashboardViewModel.syncAll,
|
||||
onValueChange: (_, bool value) => dashboardViewModel.setSyncAll(value),
|
||||
);
|
||||
}),
|
||||
],
|
||||
],
|
||||
SettingsCellWithArrow(
|
||||
title: S.current.manage_nodes,
|
||||
|
@ -100,6 +70,12 @@ class ConnectionSyncPage extends BasePage {
|
|||
onTap: () => Navigator.of(context).pushNamed(Routes.walletConnectConnectionsListing),
|
||||
),
|
||||
],
|
||||
if (dashboardViewModel.hasRescan && Platform.isAndroid && FeatureFlag.isBackgroundSyncEnabled) ...[
|
||||
SettingsCellWithArrow(
|
||||
title: S.current.background_sync,
|
||||
handler: (context) => Navigator.of(context).pushNamed(Routes.backgroundSync),
|
||||
),
|
||||
],
|
||||
if (FeatureFlag.isInAppTorEnabled)
|
||||
SettingsCellWithArrow(
|
||||
title: S.current.tor_connection,
|
||||
|
|
|
@ -81,6 +81,9 @@ abstract class SettingsStoreBase with Store {
|
|||
required SyncMode initialSyncMode,
|
||||
required bool initialSyncAll,
|
||||
required bool initialShowSyncNotification,
|
||||
required bool initialBackgroundSyncEnabled,
|
||||
required bool initialBackgroundSyncOnBattery,
|
||||
required bool initialBackgroundSyncOnData,
|
||||
// required String initialCurrentLocale,
|
||||
required this.appVersion,
|
||||
required this.deviceName,
|
||||
|
@ -181,6 +184,9 @@ abstract class SettingsStoreBase with Store {
|
|||
currentSyncMode = initialSyncMode,
|
||||
currentSyncAll = initialSyncAll,
|
||||
showSyncNotification = initialShowSyncNotification,
|
||||
backgroundSyncEnabled = initialBackgroundSyncEnabled,
|
||||
backgroundSyncOnBattery = initialBackgroundSyncOnBattery,
|
||||
backgroundSyncOnData = initialBackgroundSyncOnData,
|
||||
priority = ObservableMap<WalletType, TransactionPriority>() {
|
||||
//this.nodes = ObservableMap<WalletType, Node>.of(nodes);
|
||||
|
||||
|
@ -383,7 +389,6 @@ abstract class SettingsStoreBase with Store {
|
|||
|
||||
reaction((_) => currentSyncMode, (SyncMode syncMode) {
|
||||
sharedPreferences.setInt(PreferencesKey.syncModeKey, syncMode.type.index);
|
||||
|
||||
_backgroundTasks.registerBackgroundService();
|
||||
});
|
||||
|
||||
|
@ -397,6 +402,21 @@ abstract class SettingsStoreBase with Store {
|
|||
_backgroundTasks.registerBackgroundService();
|
||||
});
|
||||
|
||||
reaction((_) => backgroundSyncEnabled, (bool value) {
|
||||
sharedPreferences.setBool(PreferencesKey.backgroundSyncEnabled, value);
|
||||
_backgroundTasks.registerBackgroundService();
|
||||
});
|
||||
|
||||
reaction((_) => backgroundSyncOnBattery, (bool value) {
|
||||
sharedPreferences.setBool(PreferencesKey.backgroundSyncOnBattery, value);
|
||||
_backgroundTasks.registerBackgroundService();
|
||||
});
|
||||
|
||||
reaction((_) => backgroundSyncOnData, (bool value) {
|
||||
sharedPreferences.setBool(PreferencesKey.backgroundSyncOnData, value);
|
||||
_backgroundTasks.registerBackgroundService();
|
||||
});
|
||||
|
||||
reaction(
|
||||
(_) => exchangeStatus,
|
||||
(ExchangeApiMode mode) =>
|
||||
|
@ -787,6 +807,15 @@ abstract class SettingsStoreBase with Store {
|
|||
@observable
|
||||
bool showSyncNotification;
|
||||
|
||||
@observable
|
||||
bool backgroundSyncEnabled;
|
||||
|
||||
@observable
|
||||
bool backgroundSyncOnBattery;
|
||||
|
||||
@observable
|
||||
bool backgroundSyncOnData;
|
||||
|
||||
String appVersion;
|
||||
|
||||
String deviceName;
|
||||
|
@ -1109,6 +1138,9 @@ abstract class SettingsStoreBase with Store {
|
|||
});
|
||||
final savedSyncAll = sharedPreferences.getBool(PreferencesKey.syncAllKey) ?? true;
|
||||
final savedShowSyncNotification = sharedPreferences.getBool(PreferencesKey.showSyncNotificationKey) ?? false;
|
||||
final savedBackgroundSyncEnabled = sharedPreferences.getBool(PreferencesKey.backgroundSyncEnabled) ?? false;
|
||||
final savedBackgroundSyncOnBattery = sharedPreferences.getBool(PreferencesKey.backgroundSyncOnBattery) ?? true;
|
||||
final savedBackgroundSyncOnData = sharedPreferences.getBool(PreferencesKey.backgroundSyncOnData) ?? false;
|
||||
|
||||
// migrated to secure:
|
||||
final timeOutDuration = await SecureKey.getInt(
|
||||
|
@ -1288,6 +1320,9 @@ abstract class SettingsStoreBase with Store {
|
|||
initialSyncMode: savedSyncMode,
|
||||
initialSyncAll: savedSyncAll,
|
||||
initialShowSyncNotification: savedShowSyncNotification,
|
||||
initialBackgroundSyncEnabled: savedBackgroundSyncEnabled,
|
||||
initialBackgroundSyncOnBattery: savedBackgroundSyncOnBattery,
|
||||
initialBackgroundSyncOnData: savedBackgroundSyncOnData,
|
||||
shouldShowYatPopup: shouldShowYatPopup,
|
||||
shouldShowRepWarning: shouldShowRepWarning,
|
||||
);
|
||||
|
|
|
@ -752,12 +752,30 @@ abstract class DashboardViewModelBase with Store {
|
|||
@computed
|
||||
bool get syncAll => settingsStore.currentSyncAll;
|
||||
|
||||
@action
|
||||
void setBackgroundSyncEnabled(bool value) => settingsStore.backgroundSyncEnabled = value;
|
||||
|
||||
@computed
|
||||
bool get backgroundSyncEnabled => settingsStore.backgroundSyncEnabled;
|
||||
|
||||
@action
|
||||
void setShowSyncNotification(bool value) => settingsStore.showSyncNotification = value;
|
||||
|
||||
@computed
|
||||
bool get showSyncNotification => settingsStore.showSyncNotification;
|
||||
|
||||
@action
|
||||
void setBackgroundSyncOnBattery(bool value) => settingsStore.backgroundSyncOnBattery = value;
|
||||
|
||||
@computed
|
||||
bool get backgroundSyncOnBattery => settingsStore.backgroundSyncOnBattery;
|
||||
|
||||
@action
|
||||
void setBackgroundSyncOnData(bool value) => settingsStore.backgroundSyncOnData = value;
|
||||
|
||||
@computed
|
||||
bool get backgroundSyncOnData => settingsStore.backgroundSyncOnData;
|
||||
|
||||
@action
|
||||
void setSyncAll(bool value) => settingsStore.currentSyncAll = value;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
enum SyncType { disabled, unobtrusive, aggressive }
|
||||
enum SyncType { minutes, oneHour, threeHours, sixHours, twelveHours }
|
||||
|
||||
class SyncMode {
|
||||
SyncMode(this.name, this.type, this.frequency);
|
||||
|
@ -8,8 +8,10 @@ class SyncMode {
|
|||
final Duration frequency;
|
||||
|
||||
static final all = [
|
||||
SyncMode("Disabled", SyncType.disabled, Duration.zero),
|
||||
SyncMode("Unobtrusive", SyncType.unobtrusive, Duration(hours: 12)),
|
||||
SyncMode("Aggressive", SyncType.aggressive, Duration(minutes: 15)),
|
||||
SyncMode("15 Minutes", SyncType.minutes, Duration(minutes: 15)),
|
||||
SyncMode("1 Hour", SyncType.oneHour, Duration(hours: 1)),
|
||||
SyncMode("3 Hours", SyncType.threeHours, Duration(hours: 3)),
|
||||
SyncMode("6 Hours", SyncType.sixHours, Duration(hours: 6)),
|
||||
SyncMode("12 Hours", SyncType.twelveHours, Duration(hours: 12)),
|
||||
];
|
||||
}
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "متوسط مدخرات",
|
||||
"awaitDAppProcessing": ".ﺔﺠﻟﺎﻌﻤﻟﺍ ﻦﻣ dApp ﻲﻬﺘﻨﻳ ﻰﺘﺣ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ",
|
||||
"awaiting_payment_confirmation": "في انتظار تأكيد الدفع",
|
||||
"background_sync": "مزامنة الخلفية",
|
||||
"background_sync_mode": "وضع مزامنة الخلفية",
|
||||
"background_sync_on_battery": "مزامنة أثناء البطارية",
|
||||
"background_sync_on_data": "مزامنة باستخدام البيانات",
|
||||
"backup": "نسخ الاحتياطي",
|
||||
"backup_file": "ملف النسخ الاحتياطي",
|
||||
"backup_password": "كلمة مرور النسخ الاحتياطي",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Средни спестявания",
|
||||
"awaitDAppProcessing": "Моля, изчакайте dApp да завърши обработката.",
|
||||
"awaiting_payment_confirmation": "Чака се потвърждение на плащането",
|
||||
"background_sync": "Фон Синхх",
|
||||
"background_sync_mode": "Режим на синхронизиране на фона",
|
||||
"background_sync_on_battery": "Синхронизиране, докато сте на батерия",
|
||||
"background_sync_on_data": "Синхронизиране с помощта на данни",
|
||||
"backup": "Резервно копие",
|
||||
"backup_file": "Резервно копие",
|
||||
"backup_password": "Парола за възстановяване",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Prům. ušetřeno",
|
||||
"awaitDAppProcessing": "Počkejte, až dApp dokončí zpracování.",
|
||||
"awaiting_payment_confirmation": "Čeká se na potvrzení platby",
|
||||
"background_sync": "Synchronizace pozadí",
|
||||
"background_sync_mode": "Režim synchronizace pozadí",
|
||||
"background_sync_on_battery": "Synchronizace na baterii",
|
||||
"background_sync_on_data": "Synchronizace pomocí dat",
|
||||
"backup": "Záloha",
|
||||
"backup_file": "Soubor se zálohou",
|
||||
"backup_password": "Heslo pro zálohy",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Durchschn. Einsparungen",
|
||||
"awaitDAppProcessing": "Bitte warten Sie, bis die dApp die Verarbeitung abgeschlossen hat.",
|
||||
"awaiting_payment_confirmation": "Warten auf Zahlungsbestätigung",
|
||||
"background_sync": "Hintergrundsynchronisation",
|
||||
"background_sync_mode": "Hintergrundsynchronisierungsmodus",
|
||||
"background_sync_on_battery": "Synchronisation während der Batterie",
|
||||
"background_sync_on_data": "Synchronisieren Sie mit Daten",
|
||||
"backup": "Sicherung",
|
||||
"backup_file": "Sicherungsdatei",
|
||||
"backup_password": "Passwort sichern",
|
||||
|
@ -989,4 +992,4 @@
|
|||
"you_will_get": "Konvertieren zu",
|
||||
"you_will_send": "Konvertieren von",
|
||||
"yy": "YY"
|
||||
}
|
||||
}
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Avg. Savings",
|
||||
"awaitDAppProcessing": "Kindly wait for the dApp to finish processing.",
|
||||
"awaiting_payment_confirmation": "Awaiting Payment Confirmation",
|
||||
"background_sync": "Background sync",
|
||||
"background_sync_mode": "Background sync mode",
|
||||
"background_sync_on_battery": "Sync while on battery",
|
||||
"background_sync_on_data": "Sync using data",
|
||||
"backup": "Backup",
|
||||
"backup_file": "Backup file",
|
||||
"backup_password": "Backup password",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Ahorro promedio",
|
||||
"awaitDAppProcessing": "Espere a que la dApp termine de procesarse.",
|
||||
"awaiting_payment_confirmation": "Esperando confirmación de pago",
|
||||
"background_sync": "Sincronización de fondo",
|
||||
"background_sync_mode": "Modo de sincronización en segundo plano",
|
||||
"background_sync_on_battery": "Sincronizar mientras está en la batería",
|
||||
"background_sync_on_data": "Sincronizar usando datos",
|
||||
"backup": "Apoyo",
|
||||
"backup_file": "Archivo de respaldo",
|
||||
"backup_password": "Contraseña de respaldo",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Économies moy.",
|
||||
"awaitDAppProcessing": "Veuillez attendre que l'application décentralisée (dApp) termine le traitement.",
|
||||
"awaiting_payment_confirmation": "En attente de confirmation de paiement",
|
||||
"background_sync": "Synchronisation de fond",
|
||||
"background_sync_mode": "Mode de synchronisation en arrière-plan",
|
||||
"background_sync_on_battery": "Synchroniser pendant la batterie",
|
||||
"background_sync_on_data": "Synchroniser à l'aide de données",
|
||||
"backup": "Sauvegarde",
|
||||
"backup_file": "Fichier de sauvegarde",
|
||||
"backup_password": "Mot de passe de sauvegarde",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Matsakaici Adana",
|
||||
"awaitDAppProcessing": "Da fatan za a jira dApp ya gama aiki.",
|
||||
"awaiting_payment_confirmation": "Ana jiran Tabbacin Biyan Kuɗi",
|
||||
"background_sync": "Tunawa da Setc",
|
||||
"background_sync_mode": "Yanayin Sync",
|
||||
"background_sync_on_battery": "Sync yayin da akan baturi",
|
||||
"background_sync_on_data": "Sync ta amfani da bayanai",
|
||||
"backup": "Ajiyayyen",
|
||||
"backup_file": "Ajiyayyen fayil",
|
||||
"backup_password": "Ajiyayyen kalmar sirri",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "औसत बचत",
|
||||
"awaitDAppProcessing": "कृपया डीएपी की प्रोसेसिंग पूरी होने तक प्रतीक्षा करें।",
|
||||
"awaiting_payment_confirmation": "भुगतान की पुष्टि की प्रतीक्षा में",
|
||||
"background_sync": "पृष्ठभूमि सिंक",
|
||||
"background_sync_mode": "बैकग्राउंड सिंक मोड",
|
||||
"background_sync_on_battery": "बैटरी पर सिंक करें",
|
||||
"background_sync_on_data": "डेटा का उपयोग करके सिंक करें",
|
||||
"backup": "बैकअप",
|
||||
"backup_file": "बैकअपफ़ाइल",
|
||||
"backup_password": "बैकअप पासवर्ड",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Prosj. ušteda",
|
||||
"awaitDAppProcessing": "Molimo pričekajte da dApp završi obradu.",
|
||||
"awaiting_payment_confirmation": "Čeka se potvrda plaćanja",
|
||||
"background_sync": "Sinkronizacija pozadine",
|
||||
"background_sync_mode": "Sinkronizacija u pozadini",
|
||||
"background_sync_on_battery": "Sinkronizirano dok ste na bateriji",
|
||||
"background_sync_on_data": "Sinkronizacija pomoću podataka",
|
||||
"backup": "Sigurnosna kopija",
|
||||
"backup_file": "Sigurnosna kopija datoteke",
|
||||
"backup_password": "Lozinka za sigurnosnu kopiju",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Միջին խնայողություն",
|
||||
"awaitDAppProcessing": "Խնդրեմ սպասեք, մինչև դիմումը կավարտի մշակումը։",
|
||||
"awaiting_payment_confirmation": "Վճարման հաստատման սպասում",
|
||||
"background_sync": "Ֆոնային համաժամեցում",
|
||||
"background_sync_mode": "Հետին պլանի համաժամացման ռեժիմ",
|
||||
"background_sync_on_battery": "Համաժամեցումը մարտկոցի ժամանակ",
|
||||
"background_sync_on_data": "Համաժամեցրեք տվյալների օգտագործումը",
|
||||
"backup": "Կրկնօրինակ",
|
||||
"backup_file": "Կրկնօրինակի ֆայլ",
|
||||
"backup_password": "Կրկնօրինակի գաղտնաբառ",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Rata-rata Pembayaran",
|
||||
"awaitDAppProcessing": "Mohon tunggu hingga dApp menyelesaikan pemrosesan.",
|
||||
"awaiting_payment_confirmation": "Menunggu Konfirmasi Pembayaran",
|
||||
"background_sync": "Sinkronisasi Latar Belakang",
|
||||
"background_sync_mode": "Mode Sinkronisasi Latar Belakang",
|
||||
"background_sync_on_battery": "Sinkronisasi saat menggunakan baterai",
|
||||
"background_sync_on_data": "Sinkronisasi Menggunakan Data",
|
||||
"backup": "Cadangan",
|
||||
"backup_file": "File cadangan",
|
||||
"backup_password": "Kata sandi cadangan",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Risparmio medio",
|
||||
"awaitDAppProcessing": "Attendi gentilmente che la dApp termini l'elaborazione.",
|
||||
"awaiting_payment_confirmation": "In attesa di conferma del pagamento",
|
||||
"background_sync": "Sincronizzazione in background",
|
||||
"background_sync_mode": "Modalità di sincronizzazione in background",
|
||||
"background_sync_on_battery": "Sincronizzazione durante la batteria",
|
||||
"background_sync_on_data": "Sincronizzazione utilizzando i dati",
|
||||
"backup": "Backup",
|
||||
"backup_file": "Backup file",
|
||||
"backup_password": "Backup password",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "平均節約額",
|
||||
"awaitDAppProcessing": "dAppの処理が完了するまでお待ちください。",
|
||||
"awaiting_payment_confirmation": "支払い確認を待っています",
|
||||
"background_sync": "背景同期",
|
||||
"background_sync_mode": "バックグラウンド同期モード",
|
||||
"background_sync_on_battery": "バッテリー中に同期します",
|
||||
"background_sync_on_data": "データを使用して同期します",
|
||||
"backup": "バックアップ",
|
||||
"backup_file": "バックアップファイル",
|
||||
"backup_password": "バックアップパスワード",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "평균 절감액",
|
||||
"awaitDAppProcessing": "dApp이 처리를 마칠 때까지 기다려주세요.",
|
||||
"awaiting_payment_confirmation": "결제 확인 대기 중",
|
||||
"background_sync": "배경 동기화",
|
||||
"background_sync_mode": "백그라운드 동기화 모드",
|
||||
"background_sync_on_battery": "배터리에서 동기화하십시오",
|
||||
"background_sync_on_data": "데이터 사용 동기화",
|
||||
"backup": "지원",
|
||||
"backup_file": "백업 파일",
|
||||
"backup_password": "백업 비밀번호",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "ပျမ်းမျှ စုဆောင်းငွေ",
|
||||
"awaitDAppProcessing": "ကျေးဇူးပြု၍ dApp ကို စီမံလုပ်ဆောင်ခြင်း အပြီးသတ်ရန် စောင့်ပါ။",
|
||||
"awaiting_payment_confirmation": "ငွေပေးချေမှု အတည်ပြုချက်ကို စောင့်မျှော်နေပါသည်။",
|
||||
"background_sync": "နောက်ခံထပ်တူပြုခြင်း",
|
||||
"background_sync_mode": "နောက်ခံထပ်တူပြုခြင်း mode ကို",
|
||||
"background_sync_on_battery": "ဘက်ထရီရှိနေစဉ်စည်းညှိ",
|
||||
"background_sync_on_data": "ဒေတာကိုအသုံးပြုပြီးစည်းညှိပါ",
|
||||
"backup": "မိတ္တူ",
|
||||
"backup_file": "အရန်ဖိုင်",
|
||||
"backup_password": "စကားဝှက်ကို အရန်သိမ်းဆည်းပါ။",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Gem. besparingen",
|
||||
"awaitDAppProcessing": "Wacht tot de dApp klaar is met verwerken.",
|
||||
"awaiting_payment_confirmation": "In afwachting van betalingsbevestiging",
|
||||
"background_sync": "Achtergrond Synchroniseerd",
|
||||
"background_sync_mode": "Achtergrondsynchronisatiemodus",
|
||||
"background_sync_on_battery": "Synchroniseerd terwijl je op de batterij bent",
|
||||
"background_sync_on_data": "Synchroniseren met gegevens",
|
||||
"backup": "Back-up",
|
||||
"backup_file": "Backup bestand",
|
||||
"backup_password": "Reservewachtwoord",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Śr. oszczędności",
|
||||
"awaitDAppProcessing": "Poczekaj, aż dApp zakończy przetwarzanie.",
|
||||
"awaiting_payment_confirmation": "Oczekiwanie na potwierdzenie płatności",
|
||||
"background_sync": "Synchronizacja tła",
|
||||
"background_sync_mode": "Tryb synchronizacji w tle",
|
||||
"background_sync_on_battery": "Synchronizowanie baterii",
|
||||
"background_sync_on_data": "Synchronizacja przy użyciu danych",
|
||||
"backup": "Kopia zapasowa",
|
||||
"backup_file": "Plik kopii zapasowej",
|
||||
"backup_password": "Hasło kpoii zapasowej",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Poupança média",
|
||||
"awaitDAppProcessing": "Aguarde até que o dApp termine o processamento.",
|
||||
"awaiting_payment_confirmation": "Aguardando confirmação de pagamento",
|
||||
"background_sync": "Sincronização de fundo",
|
||||
"background_sync_mode": "Modo de sincronização em segundo plano",
|
||||
"background_sync_on_battery": "Sincronizar enquanto estiver na bateria",
|
||||
"background_sync_on_data": "Sincronização usando dados",
|
||||
"backup": "Cópia de segurança",
|
||||
"backup_file": "Arquivo de backup",
|
||||
"backup_password": "Senha de backup",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Средняя экономия",
|
||||
"awaitDAppProcessing": "Пожалуйста, подождите, пока dApp завершит обработку.",
|
||||
"awaiting_payment_confirmation": "Ожидается подтверждения платежа",
|
||||
"background_sync": "Фоновая синхронизация",
|
||||
"background_sync_mode": "Режим фоновой синхронизации",
|
||||
"background_sync_on_battery": "Синхронизированная батарея",
|
||||
"background_sync_on_data": "Синхронизируя с использованием данных",
|
||||
"backup": "Резервная копия",
|
||||
"backup_file": "Файл резервной копии",
|
||||
"backup_password": "Пароль резервной копии",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "ประหยัดเฉลี่ย",
|
||||
"awaitDAppProcessing": "โปรดรอให้ dApp ประมวลผลเสร็จสิ้น",
|
||||
"awaiting_payment_confirmation": "รอการยืนยันการชำระเงิน",
|
||||
"background_sync": "การซิงค์พื้นหลัง",
|
||||
"background_sync_mode": "โหมดซิงค์พื้นหลัง",
|
||||
"background_sync_on_battery": "ซิงค์ขณะใช้แบตเตอรี่",
|
||||
"background_sync_on_data": "ซิงค์โดยใช้ข้อมูล",
|
||||
"backup": "สำรองข้อมูล",
|
||||
"backup_file": "ไฟล์สำรองข้อมูล",
|
||||
"backup_password": "รหัสผ่านสำรองข้อมูล",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Avg. Matitipid",
|
||||
"awaitDAppProcessing": "Pakihintay na matapos ang pagproseso ng dApp.",
|
||||
"awaiting_payment_confirmation": "Nanghihintay ng Kumpirmasyon sa Pagbabayad",
|
||||
"background_sync": "Pag -sync ng background",
|
||||
"background_sync_mode": "Background sync mode",
|
||||
"background_sync_on_battery": "I -sync habang nasa baterya",
|
||||
"background_sync_on_data": "Pag -sync gamit ang data",
|
||||
"backup": "Backup",
|
||||
"backup_file": "Backup na file",
|
||||
"backup_password": "Backup na password",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Ortalama Tasarruf",
|
||||
"awaitDAppProcessing": "Lütfen dApp'in işlemeyi bitirmesini bekleyin.",
|
||||
"awaiting_payment_confirmation": "Ödemenin onaylanması bekleniyor",
|
||||
"background_sync": "Arka plan senkronizasyonu",
|
||||
"background_sync_mode": "Arka Plan Senkronizasyon Modu",
|
||||
"background_sync_on_battery": "Bataryada iken senkronize",
|
||||
"background_sync_on_data": "Verileri kullanarak senkronize",
|
||||
"backup": "Yedek",
|
||||
"backup_file": "Yedek dosyası",
|
||||
"backup_password": "Yedek parolası",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Середня економія",
|
||||
"awaitDAppProcessing": "Зачекайте, доки dApp завершить обробку.",
|
||||
"awaiting_payment_confirmation": "Очікується підтвердження платежу",
|
||||
"background_sync": "Фонове синхронізація",
|
||||
"background_sync_mode": "Фоновий режим синхронізації",
|
||||
"background_sync_on_battery": "Синхронізувати під час акумулятора",
|
||||
"background_sync_on_data": "Синхронізувати за допомогою даних",
|
||||
"backup": "Резервна копія",
|
||||
"backup_file": "Файл резервної копії",
|
||||
"backup_password": "Пароль резервної копії",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "اوسط بچت",
|
||||
"awaitDAppProcessing": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﮓﻨﺴﯿﺳﻭﺮﭘ ﮯﮐ dApp ﻡﺮﮐ ﮦﺍﺮﺑ",
|
||||
"awaiting_payment_confirmation": "ادائیگی کی تصدیق کے منتظر",
|
||||
"background_sync": "پس منظر کی ہم آہنگی",
|
||||
"background_sync_mode": "پس منظر کی مطابقت پذیری کا موڈ",
|
||||
"background_sync_on_battery": "بیٹری کے دوران ہم آہنگی",
|
||||
"background_sync_on_data": "ڈیٹا کا استعمال کرتے ہوئے مطابقت پذیری",
|
||||
"backup": "بیک اپ",
|
||||
"backup_file": "بیک اپ فائل",
|
||||
"backup_password": "بیک اپ پاس ورڈ",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Tiết kiệm trung bình",
|
||||
"awaitDAppProcessing": "Vui lòng đợi ứng dụng phi tập trung hoàn thành xử lý.",
|
||||
"awaiting_payment_confirmation": "Đang chờ xác nhận thanh toán",
|
||||
"background_sync": "Đồng bộ nền",
|
||||
"background_sync_mode": "Chế độ đồng bộ nền",
|
||||
"background_sync_on_battery": "Đồng bộ hóa khi dùng pin",
|
||||
"background_sync_on_data": "Đồng bộ hóa bằng dữ liệu",
|
||||
"backup": "Sao lưu",
|
||||
"backup_file": "Tập tin sao lưu",
|
||||
"backup_password": "Mật khẩu sao lưu",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "Ìpamọ́ l’óòrèkóòrè",
|
||||
"awaitDAppProcessing": "Fi inurere duro fun dApp lati pari sisẹ.",
|
||||
"awaiting_payment_confirmation": "À ń dúró de ìjẹ́rìísí àránṣẹ́",
|
||||
"background_sync": "Imuṣiṣẹ Labẹ",
|
||||
"background_sync_mode": "Ipo amuṣiṣẹpọ abẹlẹ",
|
||||
"background_sync_on_battery": "Sync lakoko ti o wa lori batiri",
|
||||
"background_sync_on_data": "Muṣiṣẹpọ nipa lilo data",
|
||||
"backup": "Ṣẹ̀dà",
|
||||
"backup_file": "Ṣẹ̀dà akọsílẹ̀",
|
||||
"backup_password": "Ṣẹ̀dà ọ̀rọ̀ aṣínà",
|
||||
|
|
|
@ -69,7 +69,10 @@
|
|||
"avg_savings": "平均储蓄",
|
||||
"awaitDAppProcessing": "请等待 dApp 处理完成。",
|
||||
"awaiting_payment_confirmation": "等待付款确认",
|
||||
"background_sync": "背景同步",
|
||||
"background_sync_mode": "后台同步模式",
|
||||
"background_sync_on_battery": "电池时同步",
|
||||
"background_sync_on_data": "使用数据同步",
|
||||
"backup": "备份",
|
||||
"backup_file": "备份文件",
|
||||
"backup_password": "备份密码",
|
||||
|
|
Loading…
Reference in a new issue