ui updates

This commit is contained in:
Matthew Fosse 2024-12-18 16:20:13 -05:00
parent 7338e49888
commit 7c651d7fb1
38 changed files with 280 additions and 56 deletions

View file

@ -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));

View file

@ -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) {

View file

@ -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';

View file

@ -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(

View file

@ -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';

View 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),
);
}),
],
),
);
}
}

View file

@ -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,

View file

@ -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,
);

View file

@ -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;

View file

@ -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)),
];
}

View file

@ -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": "كلمة مرور النسخ الاحتياطي",

View file

@ -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": "Парола за възстановяване",

View file

@ -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",

View file

@ -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"
}
}

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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": "बैकअप पासवर्ड",

View file

@ -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",

View file

@ -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": "Կրկնօրինակի գաղտնաբառ",

View file

@ -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",

View file

@ -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",

View file

@ -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": "バックアップパスワード",

View file

@ -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": "백업 비밀번호",

View file

@ -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": "စကားဝှက်ကို အရန်သိမ်းဆည်းပါ။",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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": "Пароль резервной копии",

View file

@ -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": "รหัสผ่านสำรองข้อมูล",

View file

@ -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",

View file

@ -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ı",

View file

@ -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": "Пароль резервної копії",

View file

@ -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": "بیک اپ پاس ورڈ",

View file

@ -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",

View file

@ -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à",

View file

@ -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": "备份密码",