Merge branch 'main' into CW-794-monero-c-cleanup

This commit is contained in:
cyan 2024-11-28 20:32:34 +01:00 committed by GitHub
commit 263d545610
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
62 changed files with 703 additions and 221 deletions

View file

@ -106,6 +106,15 @@ class BitcoinWalletService extends WalletService<
final walletInfo = walletInfoSource.values final walletInfo = walletInfoSource.values
.firstWhereOrNull((info) => info.id == WalletBase.idFor(wallet, getType()))!; .firstWhereOrNull((info) => info.id == WalletBase.idFor(wallet, getType()))!;
await walletInfoSource.delete(walletInfo.key); await walletInfoSource.delete(walletInfo.key);
final unspentCoinsToDelete = unspentCoinsInfoSource.values.where(
(unspentCoin) => unspentCoin.walletId == walletInfo.id).toList();
final keysToDelete = unspentCoinsToDelete.map((unspentCoin) => unspentCoin.key).toList();
if (keysToDelete.isNotEmpty) {
await unspentCoinsInfoSource.deleteAll(keysToDelete);
}
} }
@override @override

View file

@ -304,6 +304,7 @@ abstract class ElectrumWalletBase
Future<void> init() async { Future<void> init() async {
await walletAddresses.init(); await walletAddresses.init();
await transactionHistory.init(); await transactionHistory.init();
await cleanUpDuplicateUnspentCoins();
await save(); await save();
_autoSaveTimer = _autoSaveTimer =
@ -1379,10 +1380,11 @@ abstract class ElectrumWalletBase
})); }));
unspentCoins = updatedUnspentCoins; unspentCoins = updatedUnspentCoins;
final currentWalletUnspentCoins = unspentCoinsInfo.values.where((element) => element.walletId == id);
if (unspentCoinsInfo.length != updatedUnspentCoins.length) { if (currentWalletUnspentCoins.length != updatedUnspentCoins.length) {
unspentCoins.forEach((coin) => addCoinInfo(coin)); unspentCoins.forEach((coin) => addCoinInfo(coin));
return;
} }
await updateCoins(unspentCoins); await updateCoins(unspentCoins);
@ -1408,6 +1410,7 @@ abstract class ElectrumWalletBase
coin.isFrozen = coinInfo.isFrozen; coin.isFrozen = coinInfo.isFrozen;
coin.isSending = coinInfo.isSending; coin.isSending = coinInfo.isSending;
coin.note = coinInfo.note; coin.note = coinInfo.note;
if (coin.bitcoinAddressRecord is! BitcoinSilentPaymentAddressRecord) if (coin.bitcoinAddressRecord is! BitcoinSilentPaymentAddressRecord)
coin.bitcoinAddressRecord.balance += coinInfo.value; coin.bitcoinAddressRecord.balance += coinInfo.value;
} else { } else {
@ -1445,20 +1448,27 @@ abstract class ElectrumWalletBase
@action @action
Future<void> addCoinInfo(BitcoinUnspent coin) async { Future<void> addCoinInfo(BitcoinUnspent coin) async {
final newInfo = UnspentCoinsInfo(
walletId: id,
hash: coin.hash,
isFrozen: coin.isFrozen,
isSending: coin.isSending,
noteRaw: coin.note,
address: coin.bitcoinAddressRecord.address,
value: coin.value,
vout: coin.vout,
isChange: coin.isChange,
isSilentPayment: coin is BitcoinSilentPaymentsUnspent,
);
await unspentCoinsInfo.add(newInfo); // Check if the coin is already in the unspentCoinsInfo for the wallet
final existingCoinInfo = unspentCoinsInfo.values.firstWhereOrNull(
(element) => element.walletId == walletInfo.id && element == coin);
if (existingCoinInfo == null) {
final newInfo = UnspentCoinsInfo(
walletId: id,
hash: coin.hash,
isFrozen: coin.isFrozen,
isSending: coin.isSending,
noteRaw: coin.note,
address: coin.bitcoinAddressRecord.address,
value: coin.value,
vout: coin.vout,
isChange: coin.isChange,
isSilentPayment: coin is BitcoinSilentPaymentsUnspent,
);
await unspentCoinsInfo.add(newInfo);
}
} }
Future<void> _refreshUnspentCoinsInfo() async { Future<void> _refreshUnspentCoinsInfo() async {
@ -1486,6 +1496,23 @@ abstract class ElectrumWalletBase
} }
} }
Future<void> cleanUpDuplicateUnspentCoins() async {
final currentWalletUnspentCoins = unspentCoinsInfo.values.where((element) => element.walletId == id);
final Map<String, UnspentCoinsInfo> uniqueUnspentCoins = {};
final List<dynamic> duplicateKeys = [];
for (final unspentCoin in currentWalletUnspentCoins) {
final key = '${unspentCoin.hash}:${unspentCoin.vout}';
if (!uniqueUnspentCoins.containsKey(key)) {
uniqueUnspentCoins[key] = unspentCoin;
} else {
duplicateKeys.add(unspentCoin.key);
}
}
if (duplicateKeys.isNotEmpty) await unspentCoinsInfo.deleteAll(duplicateKeys);
}
int transactionVSize(String transactionHex) => BtcTransaction.fromRaw(transactionHex).getVSize(); int transactionVSize(String transactionHex) => BtcTransaction.fromRaw(transactionHex).getVSize();
Future<String?> canReplaceByFee(ElectrumTransactionInfo tx) async { Future<String?> canReplaceByFee(ElectrumTransactionInfo tx) async {

View file

@ -126,6 +126,15 @@ class LitecoinWalletService extends WalletService<
mwebdLogs.deleteSync(); mwebdLogs.deleteSync();
} }
} }
final unspentCoinsToDelete = unspentCoinsInfoSource.values.where(
(unspentCoin) => unspentCoin.walletId == walletInfo.id).toList();
final keysToDelete = unspentCoinsToDelete.map((unspentCoin) => unspentCoin.key).toList();
if (keysToDelete.isNotEmpty) {
await unspentCoinsInfoSource.deleteAll(keysToDelete);
}
} }
@override @override

View file

@ -85,6 +85,15 @@ class BitcoinCashWalletService extends WalletService<
final walletInfo = walletInfoSource.values final walletInfo = walletInfoSource.values
.firstWhereOrNull((info) => info.id == WalletBase.idFor(wallet, getType()))!; .firstWhereOrNull((info) => info.id == WalletBase.idFor(wallet, getType()))!;
await walletInfoSource.delete(walletInfo.key); await walletInfoSource.delete(walletInfo.key);
final unspentCoinsToDelete = unspentCoinsInfoSource.values.where(
(unspentCoin) => unspentCoin.walletId == walletInfo.id).toList();
final keysToDelete = unspentCoinsToDelete.map((unspentCoin) => unspentCoin.key).toList();
if (keysToDelete.isNotEmpty) {
await unspentCoinsInfoSource.deleteAll(keysToDelete);
}
} }
@override @override

View file

@ -1,10 +1,11 @@
import 'package:cw_core/hive_type_ids.dart'; import 'package:cw_core/hive_type_ids.dart';
import 'package:cw_core/unspent_comparable_mixin.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
part 'unspent_coins_info.g.dart'; part 'unspent_coins_info.g.dart';
@HiveType(typeId: UnspentCoinsInfo.typeId) @HiveType(typeId: UnspentCoinsInfo.typeId)
class UnspentCoinsInfo extends HiveObject { class UnspentCoinsInfo extends HiveObject with UnspentComparable {
UnspentCoinsInfo({ UnspentCoinsInfo({
required this.walletId, required this.walletId,
required this.hash, required this.hash,

View file

@ -0,0 +1,27 @@
mixin UnspentComparable {
String get address;
String get hash;
int get value;
int get vout;
String? get keyImage;
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is UnspentComparable &&
other.hash == hash &&
other.address == address &&
other.value == value &&
other.vout == vout &&
other.keyImage == keyImage;
}
@override
int get hashCode {
return Object.hash(address, hash, value, vout, keyImage);
}
}

View file

@ -1,4 +1,6 @@
class Unspent { import 'package:cw_core/unspent_comparable_mixin.dart';
class Unspent with UnspentComparable {
Unspent(this.address, this.hash, this.value, this.vout, this.keyImage) Unspent(this.address, this.hash, this.value, this.vout, this.keyImage)
: isSending = true, : isSending = true,
isFrozen = false, isFrozen = false,

View file

@ -81,6 +81,7 @@ void createWalletSync(
wptr = newWptr; wptr = newWptr;
monero.Wallet_store(wptr!, path: path); monero.Wallet_store(wptr!, path: path);
openedWalletsByPath[path] = wptr!; openedWalletsByPath[path] = wptr!;
_lastOpenedWallet = path;
// is the line below needed? // is the line below needed?
// setupNodeSync(address: "node.moneroworld.com:18089"); // setupNodeSync(address: "node.moneroworld.com:18089");
@ -116,6 +117,7 @@ void restoreWalletFromSeedSync(
wptr = newWptr; wptr = newWptr;
openedWalletsByPath[path] = wptr!; openedWalletsByPath[path] = wptr!;
_lastOpenedWallet = path;
} }
void restoreWalletFromKeysSync( void restoreWalletFromKeysSync(
@ -183,6 +185,7 @@ void restoreWalletFromKeysSync(
wptr = newWptr; wptr = newWptr;
openedWalletsByPath[path] = wptr!; openedWalletsByPath[path] = wptr!;
_lastOpenedWallet = path;
} }
void restoreWalletFromSpendKeySync( void restoreWalletFromSpendKeySync(
@ -231,6 +234,7 @@ void restoreWalletFromSpendKeySync(
storeSync(); storeSync();
openedWalletsByPath[path] = wptr!; openedWalletsByPath[path] = wptr!;
_lastOpenedWallet = path;
} }
String _lastOpenedWallet = ""; String _lastOpenedWallet = "";
@ -260,7 +264,7 @@ Future<void> restoreWalletFromHardwareWallet(
throw WalletRestoreFromSeedException(message: error); throw WalletRestoreFromSeedException(message: error);
} }
wptr = newWptr; wptr = newWptr;
_lastOpenedWallet = path;
openedWalletsByPath[path] = wptr!; openedWalletsByPath[path] = wptr!;
} }
@ -295,6 +299,11 @@ Future<void> loadWallet(
password: password, password: password,
kdfRounds: 1, kdfRounds: 1,
); );
final status = monero.WalletManager_errorString(wmPtr);
if (status != "") {
print("loadWallet:"+status);
throw WalletOpeningException(message: status);
}
} else { } else {
deviceType = 0; deviceType = 0;
} }
@ -314,15 +323,15 @@ Future<void> loadWallet(
final newWptr = Pointer<Void>.fromAddress(newWptrAddr); final newWptr = Pointer<Void>.fromAddress(newWptrAddr);
_lastOpenedWallet = path;
final status = monero.Wallet_status(newWptr); final status = monero.Wallet_status(newWptr);
if (status != 0) { if (status != 0) {
final err = monero.Wallet_errorString(newWptr); final err = monero.Wallet_errorString(newWptr);
print(err); print("loadWallet:"+err);
throw WalletOpeningException(message: err); throw WalletOpeningException(message: err);
} }
wptr = newWptr; wptr = newWptr;
_lastOpenedWallet = path;
openedWalletsByPath[path] = wptr!; openedWalletsByPath[path] = wptr!;
} }
} }

View file

@ -168,7 +168,7 @@ class MoneroWalletService extends WalletService<
} }
await restoreOrResetWalletFiles(name); await restoreOrResetWalletFiles(name);
return openWallet(name, password, retryOnFailure: false); return await openWallet(name, password, retryOnFailure: false);
} }
} }

View file

@ -56,7 +56,7 @@ class AnyPayApi {
final response = await post(url, headers: headers, body: utf8.encode(json.encode(body))); final response = await post(url, headers: headers, body: utf8.encode(json.encode(body)));
if (response.statusCode != 200) { if (response.statusCode != 200) {
ExceptionHandler.onError(FlutterErrorDetails(exception: response)); await ExceptionHandler.onError(FlutterErrorDetails(exception: response));
throw Exception('Unexpected response http code: ${response.statusCode}'); throw Exception('Unexpected response http code: ${response.statusCode}');
} }

View file

@ -145,7 +145,7 @@ class RobinhoodBuyProvider extends BuyProvider {
if (paymentType != null && paymentType != PaymentType.all) { if (paymentType != null && paymentType != PaymentType.all) {
paymentMethod = normalizePaymentMethod(paymentType); paymentMethod = normalizePaymentMethod(paymentType);
if (paymentMethod == null) paymentMethod = paymentType.name; if (paymentMethod == null) return null;
} }
final action = isBuyAction ? 'buy' : 'sell'; final action = isBuyAction ? 'buy' : 'sell';
@ -185,6 +185,7 @@ class RobinhoodBuyProvider extends BuyProvider {
return null; return null;
} }
// Supported payment methods:
// buying_power // buying_power
// crypto_balance // crypto_balance
// debit_card // debit_card

View file

@ -172,14 +172,12 @@ class CakePayApi {
} }
/// Get Countries /// Get Countries
Future<List<Country>> getCountries( Future<List<Country>> getCountries({required String apiKey}) async {
{required String CSRFToken, required String authorization}) async {
final uri = Uri.https(baseCakePayUri, countriesPath); final uri = Uri.https(baseCakePayUri, countriesPath);
final headers = { final headers = {
'accept': 'application/json', 'accept': 'application/json',
'authorization': authorization, 'Authorization': 'Api-Key $apiKey',
'X-CSRFToken': CSRFToken,
}; };
final response = await http.get(uri, headers: headers); final response = await http.get(uri, headers: headers);
@ -198,8 +196,7 @@ class CakePayApi {
/// Get Vendors /// Get Vendors
Future<List<CakePayVendor>> getVendors({ Future<List<CakePayVendor>> getVendors({
required String CSRFToken, required String apiKey,
required String authorization,
int? page, int? page,
String? country, String? country,
String? countryCode, String? countryCode,
@ -226,8 +223,7 @@ class CakePayApi {
var headers = { var headers = {
'accept': 'application/json; charset=UTF-8', 'accept': 'application/json; charset=UTF-8',
'authorization': authorization, 'Authorization': 'Api-Key $apiKey',
'X-CSRFToken': CSRFToken,
}; };
var response = await http.get(uri, headers: headers); var response = await http.get(uri, headers: headers);

View file

@ -25,7 +25,7 @@ class CakePayService {
/// Get Available Countries /// Get Available Countries
Future<List<Country>> getCountries() async => Future<List<Country>> getCountries() async =>
await cakePayApi.getCountries(CSRFToken: CSRFToken, authorization: authorization); await cakePayApi.getCountries(apiKey: cakePayApiKey);
/// Get Vendors /// Get Vendors
Future<List<CakePayVendor>> getVendors({ Future<List<CakePayVendor>> getVendors({
@ -40,8 +40,7 @@ class CakePayService {
bool? custom, bool? custom,
}) async { }) async {
final result = await cakePayApi.getVendors( final result = await cakePayApi.getVendors(
CSRFToken: CSRFToken, apiKey: cakePayApiKey,
authorization: authorization,
page: page, page: page,
country: country, country: country,
countryCode: countryCode, countryCode: countryCode,

View file

@ -230,17 +230,15 @@ class BackupService {
json.decode(transactionDescriptionFile.readAsStringSync()) as Map<String, dynamic>; json.decode(transactionDescriptionFile.readAsStringSync()) as Map<String, dynamic>;
final descriptionsMap = jsonData.map((key, value) => final descriptionsMap = jsonData.map((key, value) =>
MapEntry(key, TransactionDescription.fromJson(value as Map<String, dynamic>))); MapEntry(key, TransactionDescription.fromJson(value as Map<String, dynamic>)));
var box = _transactionDescriptionBox;
if (!_transactionDescriptionBox.isOpen) { if (!box.isOpen) {
final transactionDescriptionsBoxKey = await getEncryptionKey(secureStorage: secureStorageShared, forKey: TransactionDescription.boxKey); final transactionDescriptionsBoxKey =
final transactionDescriptionBox = await CakeHive.openBox<TransactionDescription>( await getEncryptionKey(secureStorage: _secureStorage, forKey: TransactionDescription.boxKey);
box = await CakeHive.openBox<TransactionDescription>(
TransactionDescription.boxName, TransactionDescription.boxName,
encryptionKey: transactionDescriptionsBoxKey, encryptionKey: transactionDescriptionsBoxKey);
); }
await transactionDescriptionBox.putAll(descriptionsMap); await box.putAll(descriptionsMap);
return;
}
await _transactionDescriptionBox.putAll(descriptionsMap);
} }
Future<void> _importPreferencesDump() async { Future<void> _importPreferencesDump() async {

View file

@ -2,15 +2,22 @@ import 'dart:async';
import 'package:cake_wallet/core/generate_wallet_password.dart'; import 'package:cake_wallet/core/generate_wallet_password.dart';
import 'package:cake_wallet/core/key_service.dart'; import 'package:cake_wallet/core/key_service.dart';
import 'package:cake_wallet/core/secure_storage.dart';
import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/entities/preferences_key.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/main.dart';
import 'package:cake_wallet/reactions/on_authentication_state_change.dart'; import 'package:cake_wallet/reactions/on_authentication_state_change.dart';
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/utils/exception_handler.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cw_core/cake_hive.dart'; import 'package:cw_core/cake_hive.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/wallet_info.dart'; import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_service.dart'; import 'package:cw_core/wallet_service.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
class WalletLoadingService { class WalletLoadingService {
@ -58,24 +65,25 @@ class WalletLoadingService {
return wallet; return wallet;
} catch (error, stack) { } catch (error, stack) {
ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); await ExceptionHandler.resetLastPopupDate();
await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack));
// try fetching the seeds of the corrupted wallet to show it to the user // try fetching the seeds of the corrupted wallet to show it to the user
String corruptedWalletsSeeds = "Corrupted wallets seeds (if retrievable, empty otherwise):"; String corruptedWalletsSeeds = "Corrupted wallets seeds (if retrievable, empty otherwise):";
try { try {
corruptedWalletsSeeds += await _getCorruptedWalletSeeds(name, type); corruptedWalletsSeeds += await _getCorruptedWalletSeeds(name, type);
} catch (e) { } catch (e) {
corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e"; corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e";
} }
// try opening another wallet that is not corrupted to give user access to the app // try opening another wallet that is not corrupted to give user access to the app
final walletInfoSource = await CakeHive.openBox<WalletInfo>(WalletInfo.boxName); final walletInfoSource = await CakeHive.openBox<WalletInfo>(WalletInfo.boxName);
WalletBase? wallet;
for (var walletInfo in walletInfoSource.values) { for (var walletInfo in walletInfoSource.values) {
try { try {
final walletService = walletServiceFactory.call(walletInfo.type); final walletService = walletServiceFactory.call(walletInfo.type);
final walletPassword = password ?? (await keyService.getWalletPassword(walletName: name)); final walletPassword = await keyService.getWalletPassword(walletName: walletInfo.name);
final wallet = await walletService.openWallet(walletInfo.name, walletPassword); wallet = await walletService.openWallet(walletInfo.name, walletPassword);
if (walletInfo.type == WalletType.monero) { if (walletInfo.type == WalletType.monero) {
await updateMoneroWalletPassword(wallet); await updateMoneroWalletPassword(wallet);
@ -88,8 +96,6 @@ class WalletLoadingService {
// if found a wallet that is not corrupted, then still display the seeds of the corrupted ones // if found a wallet that is not corrupted, then still display the seeds of the corrupted ones
authenticatedErrorStreamController.add(corruptedWalletsSeeds); authenticatedErrorStreamController.add(corruptedWalletsSeeds);
return wallet;
} catch (e) { } catch (e) {
print(e); print(e);
// save seeds and show corrupted wallets' seeds to the user // save seeds and show corrupted wallets' seeds to the user
@ -99,16 +105,56 @@ class WalletLoadingService {
corruptedWalletsSeeds += seeds; corruptedWalletsSeeds += seeds;
} }
} catch (e) { } catch (e) {
corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e"; corruptedWalletsSeeds += "\nFailed to fetch $name seeds: $e";
} }
} }
} }
// if all user's wallets are corrupted throw exception // if all user's wallets are corrupted throw exception
throw error.toString() + "\n\n" + corruptedWalletsSeeds; final msg = error.toString() + "\n" + corruptedWalletsSeeds;
if (navigatorKey.currentContext != null) {
await showPopUp<void>(
context: navigatorKey.currentContext!,
builder: (BuildContext context) {
return AlertWithTwoActions(
alertTitle: "Corrupted seeds",
alertContent: S.of(context).corrupted_seed_notice,
leftButtonText: S.of(context).cancel,
rightButtonText: S.of(context).show_seed,
actionLeftButton: () => Navigator.of(context).pop(),
actionRightButton: () => showSeedsPopup(context, msg),
);
});
} else {
throw msg;
}
if (wallet == null) {
throw Exception("Wallet is null");
}
return wallet;
} }
} }
Future<void> showSeedsPopup(BuildContext context, String message) async {
Navigator.of(context).pop();
await showPopUp<void>(
context: context,
builder: (BuildContext context) {
return AlertWithTwoActions(
alertTitle: "Corrupted seeds",
alertContent: message,
leftButtonText: S.of(context).copy,
rightButtonText: S.of(context).ok,
actionLeftButton: () async {
await Clipboard.setData(ClipboardData(text: message));
},
actionRightButton: () async {
Navigator.of(context).pop();
},
);
});
}
Future<void> updateMoneroWalletPassword(WalletBase wallet) async { Future<void> updateMoneroWalletPassword(WalletBase wallet) async {
final key = PreferencesKey.moneroWalletUpdateV1Key(wallet.name); final key = PreferencesKey.moneroWalletUpdateV1Key(wallet.name);
var isPasswordUpdated = sharedPreferences.getBool(key) ?? false; var isPasswordUpdated = sharedPreferences.getBool(key) ?? false;

View file

@ -575,7 +575,7 @@ Future<void> setup({
totpAuthPageState.changeProcessText('Loading the wallet'); totpAuthPageState.changeProcessText('Loading the wallet');
if (loginError != null) { if (loginError != null) {
totpAuthPageState.changeProcessText('ERROR: ${loginError.toString()}'); totpAuthPageState.changeProcessText('ERROR: ${loginError.toString()}'.trim());
} }
ReactionDisposer? _reaction; ReactionDisposer? _reaction;
@ -604,7 +604,7 @@ Future<void> setup({
authPageState.changeProcessText('Loading the wallet'); authPageState.changeProcessText('Loading the wallet');
if (loginError != null) { if (loginError != null) {
authPageState.changeProcessText('ERROR: ${loginError.toString()}'); authPageState.changeProcessText('ERROR: ${loginError.toString()}'.trim());
loginError = null; loginError = null;
} }
@ -624,7 +624,7 @@ Future<void> setup({
} }
if (loginError != null) { if (loginError != null) {
authPageState.changeProcessText('ERROR: ${loginError.toString()}'); authPageState.changeProcessText('ERROR: ${loginError.toString()}'.trim());
timer.cancel(); timer.cancel();
} }
}); });

View file

@ -89,7 +89,7 @@ Future<void> runAppWithZone({Key? topLevelKey}) async {
); );
} }
ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stackTrace)); await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stackTrace));
}); });
} }

View file

@ -43,8 +43,8 @@ void startAuthenticationStateChange(
if (!requireHardwareWalletConnection()) await loadCurrentWallet(); if (!requireHardwareWalletConnection()) await loadCurrentWallet();
} catch (error, stack) { } catch (error, stack) {
loginError = error; loginError = error;
ExceptionHandler.onError( await ExceptionHandler.resetLastPopupDate();
FlutterErrorDetails(exception: error, stack: stack)); await ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack));
} }
return; return;
} }
@ -81,7 +81,7 @@ void startAuthenticationStateChange(
.pushNamedAndRemoveUntil(Routes.dashboard, (route) => false); .pushNamedAndRemoveUntil(Routes.dashboard, (route) => false);
} }
if (!(await authenticatedErrorStreamController.stream.isEmpty)) { if (!(await authenticatedErrorStreamController.stream.isEmpty)) {
ExceptionHandler.showError( await ExceptionHandler.showError(
(await authenticatedErrorStreamController.stream.first).toString()); (await authenticatedErrorStreamController.stream.first).toString());
authenticatedErrorStreamController.stream.drain(); authenticatedErrorStreamController.stream.drain();
} }

View file

@ -1,5 +1,6 @@
import 'package:another_flushbar/flushbar.dart'; import 'package:another_flushbar/flushbar.dart';
import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_bar.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -9,6 +10,8 @@ import 'package:cake_wallet/view_model/auth_view_model.dart';
import 'package:cake_wallet/src/screens/pin_code/pin_code.dart'; import 'package:cake_wallet/src/screens/pin_code/pin_code.dart';
import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart'; import 'package:cake_wallet/src/screens/pin_code/pin_code_widget.dart';
import 'package:cake_wallet/core/execution_state.dart'; import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:flutter/services.dart';
typedef OnAuthenticationFinished = void Function(bool, AuthPageState); typedef OnAuthenticationFinished = void Function(bool, AuthPageState);
@ -66,7 +69,6 @@ class AuthPagePinCodeStateImpl extends AuthPageState<AuthPage> {
dismissFlushBar(_authBar); dismissFlushBar(_authBar);
showBar<void>( showBar<void>(
context, S.of(context).failed_authentication(state.error)); context, S.of(context).failed_authentication(state.error));
widget.onAuthenticationFinished(false, this); widget.onAuthenticationFinished(false, this);
}); });
} }
@ -77,12 +79,12 @@ class AuthPagePinCodeStateImpl extends AuthPageState<AuthPage> {
dismissFlushBar(_authBar); dismissFlushBar(_authBar);
showBar<void>( showBar<void>(
context, S.of(context).failed_authentication(state.error)); context, S.of(context).failed_authentication(state.error));
widget.onAuthenticationFinished(false, this); widget.onAuthenticationFinished(false, this);
}); });
} }
}); });
if (widget.authViewModel.isBiometricalAuthenticationAllowed) { if (widget.authViewModel.isBiometricalAuthenticationAllowed) {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
await Future<void>.delayed(Duration(milliseconds: 100)); await Future<void>.delayed(Duration(milliseconds: 100));
@ -93,6 +95,23 @@ class AuthPagePinCodeStateImpl extends AuthPageState<AuthPage> {
super.initState(); super.initState();
} }
Future<void> _showSeedsPopup(BuildContext context, String message) async {
await showPopUp<void>(
context: context,
builder: (BuildContext context) {
return AlertWithTwoActions(
alertTitle: "Corrupted seeds",
alertContent: message,
leftButtonText: S.of(context).copy,
rightButtonText: S.of(context).ok,
actionLeftButton: () async {
await Clipboard.setData(ClipboardData(text: message));
},
actionRightButton: () => Navigator.of(context).pop(),
);
});
}
@override @override
void dispose() { void dispose() {
_reaction?.reaction.dispose(); _reaction?.reaction.dispose();

View file

@ -154,7 +154,7 @@ class BackupPage extends BasePage {
File returnedFile = File(outputFile!); File returnedFile = File(outputFile!);
await returnedFile.writeAsBytes(backup.content); await returnedFile.writeAsBytes(backup.content);
} catch (exception, stackTrace) { } catch (exception, stackTrace) {
ExceptionHandler.onError(FlutterErrorDetails( await ExceptionHandler.onError(FlutterErrorDetails(
exception: exception, exception: exception,
stack: stackTrace, stack: stackTrace,
library: "Export Backup", library: "Export Backup",

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:cake_wallet/cake_pay/cake_pay_card.dart'; import 'package:cake_wallet/cake_pay/cake_pay_card.dart';
import 'package:cake_wallet/cake_pay/cake_pay_payment_credantials.dart'; import 'package:cake_wallet/cake_pay/cake_pay_payment_credantials.dart';
@ -7,6 +9,7 @@ import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/cake_pay/widgets/image_placeholder.dart'; import 'package:cake_wallet/src/screens/cake_pay/widgets/image_placeholder.dart';
import 'package:cake_wallet/src/screens/cake_pay/widgets/link_extractor.dart'; import 'package:cake_wallet/src/screens/cake_pay/widgets/link_extractor.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/widgets/base_text_form_field.dart'; import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
import 'package:cake_wallet/src/widgets/number_text_fild_widget.dart'; import 'package:cake_wallet/src/widgets/number_text_fild_widget.dart';
@ -17,6 +20,7 @@ import 'package:cake_wallet/themes/extensions/keyboard_theme.dart';
import 'package:cake_wallet/themes/extensions/send_page_theme.dart'; import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
import 'package:cake_wallet/typography.dart'; import 'package:cake_wallet/typography.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/cake_pay/cake_pay_buy_card_view_model.dart'; import 'package:cake_wallet/view_model/cake_pay/cake_pay_buy_card_view_model.dart';
import 'package:cake_wallet/view_model/dashboard/dropdown_filter_item_widget.dart'; import 'package:cake_wallet/view_model/dashboard/dropdown_filter_item_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -226,7 +230,9 @@ class CakePayBuyCardPage extends BasePage {
return Padding( return Padding(
padding: EdgeInsets.only(bottom: 12), padding: EdgeInsets.only(bottom: 12),
child: PrimaryButton( child: PrimaryButton(
onPressed: () => navigateToCakePayBuyCardDetailPage(context, card), onPressed: () => isIOSUnavailable(card)
? alertIOSAvailability(context, card)
: navigateToCakePayBuyCardDetailPage(context, card),
text: S.of(context).buy_now, text: S.of(context).buy_now,
isDisabled: !cakePayBuyCardViewModel.isEnablePurchase, isDisabled: !cakePayBuyCardViewModel.isEnablePurchase,
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
@ -241,6 +247,65 @@ class CakePayBuyCardPage extends BasePage {
); );
} }
bool isWordInCardsName(CakePayCard card, String word) {
// word must be followed by a space or beginning of the string
final regex = RegExp(r'(^|\s)' + word + r'(\s|$)', caseSensitive: false);
return regex.hasMatch(card.name.toLowerCase());
}
bool isIOSUnavailable(CakePayCard card) {
if (!Platform.isIOS) {
return false;
}
final isDigitalGameStores = isWordInCardsName(card, 'playstation') ||
isWordInCardsName(card, 'xbox') ||
isWordInCardsName(card, 'steam') ||
isWordInCardsName(card, 'meta quest') ||
isWordInCardsName(card, 'kigso') ||
isWordInCardsName(card, 'game world') ||
isWordInCardsName(card, 'google') ||
isWordInCardsName(card, 'nintendo');
final isGCodes = isWordInCardsName(card, 'gcodes');
final isApple = isWordInCardsName(card, 'itunes') || isWordInCardsName(card, 'apple');
final isTidal = isWordInCardsName(card, 'tidal');
final isVPNServices = isWordInCardsName(card, 'nordvpn') ||
isWordInCardsName(card, 'expressvpn') ||
isWordInCardsName(card, 'surfshark') ||
isWordInCardsName(card, 'proton');
final isStreamingServices = isWordInCardsName(card, 'netflix') ||
isWordInCardsName(card, 'spotify') ||
isWordInCardsName(card, 'hulu') ||
isWordInCardsName(card, 'hbo') ||
isWordInCardsName(card, 'soundcloud') ||
isWordInCardsName(card, 'twitch');
final isDatingServices = isWordInCardsName(card, 'tinder');
return isDigitalGameStores ||
isGCodes ||
isApple ||
isTidal ||
isVPNServices ||
isStreamingServices ||
isDatingServices;
}
Future<void> alertIOSAvailability(BuildContext context, CakePayCard card) async {
return await showPopUp<void>(
context: context,
builder: (BuildContext context) {
return AlertWithOneAction(
alertTitle: S.of(context).error,
alertContent: S.of(context).cakepay_ios_not_available,
buttonText: S.of(context).ok,
buttonAction: () {
// _walletHardwareRestoreVM.error = null;
Navigator.of(context).pop();
});
});
}
Future<void> navigateToCakePayBuyCardDetailPage(BuildContext context, CakePayCard card) async { Future<void> navigateToCakePayBuyCardDetailPage(BuildContext context, CakePayCard card) async {
final userName = await cakePayService.getUserEmail(); final userName = await cakePayService.getUserEmail();
final paymentCredential = PaymentCredential( final paymentCredential = PaymentCredential(

View file

@ -11,6 +11,7 @@ import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.da
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/themes/extensions/menu_theme.dart'; import 'package:cake_wallet/themes/extensions/menu_theme.dart';
import 'package:cake_wallet/utils/exception_handler.dart';
import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_bar.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';

View file

@ -1,13 +1,14 @@
import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart'; import 'package:cake_wallet/src/screens/unspent_coins/widgets/unspent_coins_list_item.dart';
import 'package:cake_wallet/src/widgets/alert_with_no_action.dart.dart';
import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart'; import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_list_view_model.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx/mobx.dart';
class UnspentCoinsListPage extends BasePage { class UnspentCoinsListPage extends BasePage {
UnspentCoinsListPage({required this.unspentCoinsListViewModel}); UnspentCoinsListPage({required this.unspentCoinsListViewModel});
@ -15,16 +16,53 @@ class UnspentCoinsListPage extends BasePage {
@override @override
String get title => S.current.unspent_coins_title; String get title => S.current.unspent_coins_title;
@override
Widget leading(BuildContext context) {
return MergeSemantics(
child: SizedBox(
height: 37,
width: 37,
child: ButtonTheme(
minWidth: double.minPositive,
child: Semantics(
label: S.of(context).seed_alert_back,
child: TextButton(
style: ButtonStyle(
overlayColor: WidgetStateColor.resolveWith((states) => Colors.transparent),
),
onPressed: () async => await handleOnPopInvoked(context),
child: backButton(context),
),
),
),
),
);
}
final UnspentCoinsListViewModel unspentCoinsListViewModel; final UnspentCoinsListViewModel unspentCoinsListViewModel;
Future<void> handleOnPopInvoked(BuildContext context) async {
final hasChanged = unspentCoinsListViewModel.hasAdjustableFieldChanged;
if (unspentCoinsListViewModel.items.isEmpty || !hasChanged) {
Navigator.of(context).pop();
} else {
unspentCoinsListViewModel.setIsDisposing(true);
await unspentCoinsListViewModel.dispose();
Navigator.of(context).pop();
Navigator.of(context).pop();
}
}
@override @override
Widget body(BuildContext context) => UnspentCoinsListForm(unspentCoinsListViewModel); Widget body(BuildContext context) =>
UnspentCoinsListForm(unspentCoinsListViewModel, handleOnPopInvoked);
} }
class UnspentCoinsListForm extends StatefulWidget { class UnspentCoinsListForm extends StatefulWidget {
UnspentCoinsListForm(this.unspentCoinsListViewModel); UnspentCoinsListForm(this.unspentCoinsListViewModel, this.handleOnPopInvoked);
final UnspentCoinsListViewModel unspentCoinsListViewModel; final UnspentCoinsListViewModel unspentCoinsListViewModel;
final Future<void> Function(BuildContext context) handleOnPopInvoked;
@override @override
UnspentCoinsListFormState createState() => UnspentCoinsListFormState(unspentCoinsListViewModel); UnspentCoinsListFormState createState() => UnspentCoinsListFormState(unspentCoinsListViewModel);
@ -35,36 +73,126 @@ class UnspentCoinsListFormState extends State<UnspentCoinsListForm> {
final UnspentCoinsListViewModel unspentCoinsListViewModel; final UnspentCoinsListViewModel unspentCoinsListViewModel;
late Future<void> _initialization;
ReactionDisposer? _disposer;
@override
void initState() {
super.initState();
_initialization = unspentCoinsListViewModel.initialSetup();
_setupReactions();
}
void _setupReactions() {
_disposer = reaction<bool>(
(_) => unspentCoinsListViewModel.isDisposing,
(isDisposing) {
if (isDisposing) {
_showSavingDataAlert();
}
},
);
}
void _showSavingDataAlert() {
showDialog<void>(
context: context,
builder: (BuildContext context) {
return AlertWithNoAction(
alertContent: 'Updating, please wait…',
alertBarrierDismissible: false,
);
},
);
}
@override
void dispose() {
_disposer?.call();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return PopScope(
padding: EdgeInsets.fromLTRB(24, 12, 24, 24), canPop: false,
child: Observer( onPopInvokedWithResult: (bool didPop, Object? result) async {
builder: (_) => ListView.separated( if (didPop) return;
itemCount: unspentCoinsListViewModel.items.length, if(mounted)
separatorBuilder: (_, __) => SizedBox(height: 15), await widget.handleOnPopInvoked(context);
itemBuilder: (_, int index) { },
return Observer(builder: (_) { child: FutureBuilder<void>(
final item = unspentCoinsListViewModel.items[index]; future: _initialization,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
return GestureDetector( if (snapshot.hasError) return Center(child: Text('Failed to load unspent coins'));
onTap: () => Navigator.of(context).pushNamed(Routes.unspentCoinsDetails,
arguments: [item, unspentCoinsListViewModel]), return Container(
child: UnspentCoinsListItem( padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
note: item.note, child: Observer(
amount: item.amount, builder: (_) => Column(
address: item.address, children: [
isSending: item.isSending, if (unspentCoinsListViewModel.items.isNotEmpty)
isFrozen: item.isFrozen, Row(
isChange: item.isChange, children: [
isSilentPayment: item.isSilentPayment, SizedBox(width: 12),
onCheckBoxTap: item.isFrozen StandardCheckbox(
? null iconColor: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor,
: () async { value: unspentCoinsListViewModel.isAllSelected,
item.isSending = !item.isSending; onChanged: (value) => unspentCoinsListViewModel.toggleSelectAll(value),
await unspentCoinsListViewModel.saveUnspentCoinInfo(item); ),
})); SizedBox(width: 12),
}); Text(
}))); S.current.all_coins,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
],
),
SizedBox(height: 15),
Expanded(
child: unspentCoinsListViewModel.items.isEmpty
? Center(child: Text('No unspent coins available\ntry to reconnect',textAlign: TextAlign.center))
: ListView.separated(
itemCount: unspentCoinsListViewModel.items.length,
separatorBuilder: (_, __) => SizedBox(height: 15),
itemBuilder: (_, int index) {
final item = unspentCoinsListViewModel.items[index];
return Observer(
builder: (_) => GestureDetector(
onTap: () => Navigator.of(context).pushNamed(
Routes.unspentCoinsDetails,
arguments: [item, unspentCoinsListViewModel],
),
child: UnspentCoinsListItem(
note: item.note,
amount: item.amount,
address: item.address,
isSending: item.isSending,
isFrozen: item.isFrozen,
isChange: item.isChange,
isSilentPayment: item.isSilentPayment,
onCheckBoxTap: item.isFrozen
? null
: () async {
item.isSending = !item.isSending;
await unspentCoinsListViewModel
.saveUnspentCoinInfo(item);
},
),
),
);
},
),
),
],
),
),
);
},
),
);
} }
} }

View file

@ -1,6 +1,7 @@
import 'package:another_flushbar/flushbar.dart'; import 'package:another_flushbar/flushbar.dart';
import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/core/new_wallet_arguments.dart'; import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/core/secure_storage.dart';
import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart'; import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart';
import 'package:cake_wallet/entities/wallet_list_order_types.dart'; import 'package:cake_wallet/entities/wallet_list_order_types.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
@ -20,6 +21,7 @@ import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/themes/extensions/filter_theme.dart'; import 'package:cake_wallet/themes/extensions/filter_theme.dart';
import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart'; import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
import 'package:cake_wallet/utils/exception_handler.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_bar.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
@ -459,6 +461,9 @@ class WalletListBodyState extends State<WalletListBody> {
}); });
} }
} catch (e) { } catch (e) {
await ExceptionHandler.resetLastPopupDate();
final err = e.toString();
await ExceptionHandler.onError(FlutterErrorDetails(exception: err));
if (this.mounted) { if (this.mounted) {
changeProcessText(S changeProcessText(S
.of(context) .of(context)

View file

@ -3,18 +3,18 @@ import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
class AlertWithNoAction extends BaseAlertDialog { class AlertWithNoAction extends BaseAlertDialog {
AlertWithNoAction({ AlertWithNoAction({
required this.alertTitle, this.alertTitle,
required this.alertContent, required this.alertContent,
this.alertBarrierDismissible = true, this.alertBarrierDismissible = true,
Key? key, Key? key,
}); });
final String alertTitle; final String? alertTitle;
final String alertContent; final String alertContent;
final bool alertBarrierDismissible; final bool alertBarrierDismissible;
@override @override
String get titleText => alertTitle; String? get titleText => alertTitle;
@override @override
String get contentText => alertContent; String get contentText => alertContent;
@ -26,5 +26,5 @@ class AlertWithNoAction extends BaseAlertDialog {
bool get isBottomDividerExists => false; bool get isBottomDividerExists => false;
@override @override
Widget actionButtons(BuildContext context) => Container(height: 60); Widget actionButtons(BuildContext context) => Container();
} }

View file

@ -7,7 +7,7 @@ import 'package:flutter/material.dart';
class BaseAlertDialog extends StatelessWidget { class BaseAlertDialog extends StatelessWidget {
String? get headerText => ''; String? get headerText => '';
String get titleText => ''; String? get titleText => '';
String get contentText => ''; String get contentText => '';
@ -43,7 +43,7 @@ class BaseAlertDialog extends StatelessWidget {
Widget title(BuildContext context) { Widget title(BuildContext context) {
return Text( return Text(
titleText, titleText!,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 20, fontSize: 20,
@ -73,15 +73,22 @@ class BaseAlertDialog extends StatelessWidget {
} }
Widget content(BuildContext context) { Widget content(BuildContext context) {
return Text( return SingleChildScrollView(
contentText, child: Column(
textAlign: TextAlign.center, mainAxisSize: MainAxisSize.min,
style: TextStyle( children: [
fontSize: 16, Text(
fontWeight: FontWeight.normal, contentText,
fontFamily: 'Lato', textAlign: TextAlign.center,
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor, style: TextStyle(
decoration: TextDecoration.none, fontSize: 16,
fontWeight: FontWeight.normal,
fontFamily: 'Lato',
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
decoration: TextDecoration.none,
),
),
],
), ),
); );
} }
@ -191,10 +198,11 @@ class BaseAlertDialog extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
if (headerText?.isNotEmpty ?? false) headerTitle(context), if (headerText?.isNotEmpty ?? false) headerTitle(context),
titleText != null ?
Padding( Padding(
padding: EdgeInsets.fromLTRB(24, 20, 24, 0), padding: EdgeInsets.fromLTRB(24, 20, 24, 0),
child: title(context), child: title(context),
), ) : SizedBox(height: 16),
isDividerExists isDividerExists
? Padding( ? Padding(
padding: EdgeInsets.only(top: 16, bottom: 8), padding: EdgeInsets.only(top: 16, bottom: 8),

View file

@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:cake_wallet/core/secure_storage.dart';
import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/entities/preferences_key.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/main.dart';
@ -20,7 +21,7 @@ class ExceptionHandler {
static const _coolDownDurationInDays = 7; static const _coolDownDurationInDays = 7;
static File? _file; static File? _file;
static void _saveException(String? error, StackTrace? stackTrace, {String? library}) async { static Future<void> _saveException(String? error, StackTrace? stackTrace, {String? library}) async {
final appDocDir = await getAppDir(); final appDocDir = await getAppDir();
if (_file == null) { if (_file == null) {
@ -90,7 +91,12 @@ class ExceptionHandler {
} }
} }
static void onError(FlutterErrorDetails errorDetails) async { static Future<void> resetLastPopupDate() async {
final sharedPrefs = await SharedPreferences.getInstance();
await sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime(1971).toString());
}
static Future<void> onError(FlutterErrorDetails errorDetails) async {
if (kDebugMode || kProfileMode) { if (kDebugMode || kProfileMode) {
FlutterError.presentError(errorDetails); FlutterError.presentError(errorDetails);
debugPrint(errorDetails.toString()); debugPrint(errorDetails.toString());
@ -124,35 +130,40 @@ class ExceptionHandler {
} }
_hasError = true; _hasError = true;
sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime.now().toString()); await sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime.now().toString());
WidgetsBinding.instance.addPostFrameCallback( // Instead of using WidgetsBinding.instance.addPostFrameCallback we
(timeStamp) async { // await Future.delayed(Duration.zero), which does essentially the same (
if (navigatorKey.currentContext != null) { // but doesn't wait for actual frame to be rendered), but it allows us to
await showPopUp<void>( // properly await the execution - which is what we want, without awaiting
context: navigatorKey.currentContext!, // other code may call functions like Navigator.pop(), and close the alert
builder: (context) { // instead of the intended UI.
return AlertWithTwoActions( // WidgetsBinding.instance.addPostFrameCallback(
isDividerExist: true, // (timeStamp) async {
alertTitle: S.of(context).error, await Future.delayed(Duration.zero);
alertContent: S.of(context).error_dialog_content, if (navigatorKey.currentContext != null) {
rightButtonText: S.of(context).send, await showPopUp<void>(
leftButtonText: S.of(context).do_not_send, context: navigatorKey.currentContext!,
actionRightButton: () { builder: (context) {
Navigator.of(context).pop(); return AlertWithTwoActions(
_sendExceptionFile(); isDividerExist: true,
}, alertTitle: S.of(context).error,
actionLeftButton: () { alertContent: S.of(context).error_dialog_content,
Navigator.of(context).pop(); rightButtonText: S.of(context).send,
}, leftButtonText: S.of(context).do_not_send,
); actionRightButton: () {
Navigator.of(context).pop();
_sendExceptionFile();
},
actionLeftButton: () {
Navigator.of(context).pop();
}, },
); );
} },
);
}
_hasError = false; _hasError = false;
},
);
} }
/// Ignore User related errors or system errors /// Ignore User related errors or system errors
@ -272,20 +283,18 @@ class ExceptionHandler {
}; };
} }
static void showError(String error, {int? delayInSeconds}) async { static Future<void> showError(String error, {int? delayInSeconds}) async {
if (_hasError) { if (_hasError) {
return; return;
} }
_hasError = true; _hasError = true;
if (delayInSeconds != null) { if (delayInSeconds != null) {
Future.delayed(Duration(seconds: delayInSeconds), () => _showCopyPopup(error)); Future.delayed(Duration(seconds: delayInSeconds), () => _showCopyPopup(error));
return; return;
} }
WidgetsBinding.instance.addPostFrameCallback( await Future.delayed(Duration.zero);
(_) async => _showCopyPopup(error), await _showCopyPopup(error);
);
} }
static Future<void> _showCopyPopup(String content) async { static Future<void> _showCopyPopup(String content) async {

View file

@ -155,13 +155,11 @@ abstract class BuySellViewModelBase extends WalletChangeListenerViewModel with S
final hasSelectedPaymentMethod = selectedPaymentMethod != null; final hasSelectedPaymentMethod = selectedPaymentMethod != null;
final isPaymentMethodLoaded = paymentMethodState is PaymentMethodLoaded; final isPaymentMethodLoaded = paymentMethodState is PaymentMethodLoaded;
final isBuySellQuotLoaded = buySellQuotState is BuySellQuotLoaded; final isBuySellQuotLoaded = buySellQuotState is BuySellQuotLoaded;
final isBuySellQuotFailed = buySellQuotState is BuySellQuotFailed;
return hasSelectedQuote && return hasSelectedQuote &&
hasSelectedPaymentMethod && hasSelectedPaymentMethod &&
isPaymentMethodLoaded && isPaymentMethodLoaded &&
isBuySellQuotLoaded && isBuySellQuotLoaded;
!isBuySellQuotFailed;
} }
@computed @computed

View file

@ -68,7 +68,7 @@ abstract class RestoreFromBackupViewModelBase with Store {
if (msg.toLowerCase().contains("message authentication code (mac)")) { if (msg.toLowerCase().contains("message authentication code (mac)")) {
msg = 'Incorrect backup password'; msg = 'Incorrect backup password';
} else { } else {
ExceptionHandler.onError(FlutterErrorDetails( await ExceptionHandler.onError(FlutterErrorDetails(
exception: e, exception: e,
stack: s, stack: s,
library: this.toString(), library: this.toString(),

View file

@ -1,10 +1,11 @@
import 'package:cw_core/unspent_comparable_mixin.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
part 'unspent_coins_item.g.dart'; part 'unspent_coins_item.g.dart';
class UnspentCoinsItem = UnspentCoinsItemBase with _$UnspentCoinsItem; class UnspentCoinsItem = UnspentCoinsItemBase with _$UnspentCoinsItem;
abstract class UnspentCoinsItemBase with Store { abstract class UnspentCoinsItemBase with Store, UnspentComparable {
UnspentCoinsItemBase({ UnspentCoinsItemBase({
required this.address, required this.address,
required this.amount, required this.amount,
@ -13,7 +14,7 @@ abstract class UnspentCoinsItemBase with Store {
required this.note, required this.note,
required this.isSending, required this.isSending,
required this.isChange, required this.isChange,
required this.amountRaw, required this.value,
required this.vout, required this.vout,
required this.keyImage, required this.keyImage,
required this.isSilentPayment, required this.isSilentPayment,
@ -41,7 +42,7 @@ abstract class UnspentCoinsItemBase with Store {
bool isChange; bool isChange;
@observable @observable
int amountRaw; int value;
@observable @observable
int vout; int vout;

View file

@ -10,6 +10,7 @@ import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:collection/collection.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
part 'unspent_coins_list_view_model.g.dart'; part 'unspent_coins_list_view_model.g.dart';
@ -22,55 +23,66 @@ abstract class UnspentCoinsListViewModelBase with Store {
required Box<UnspentCoinsInfo> unspentCoinsInfo, required Box<UnspentCoinsInfo> unspentCoinsInfo,
this.coinTypeToSpendFrom = UnspentCoinType.any, this.coinTypeToSpendFrom = UnspentCoinType.any,
}) : _unspentCoinsInfo = unspentCoinsInfo, }) : _unspentCoinsInfo = unspentCoinsInfo,
_items = ObservableList<UnspentCoinsItem>() { items = ObservableList<UnspentCoinsItem>(),
_updateUnspentCoinsInfo(); _originalState = {};
_updateUnspents();
}
WalletBase wallet; final WalletBase wallet;
final Box<UnspentCoinsInfo> _unspentCoinsInfo; final Box<UnspentCoinsInfo> _unspentCoinsInfo;
final UnspentCoinType coinTypeToSpendFrom; final UnspentCoinType coinTypeToSpendFrom;
@observable @observable
ObservableList<UnspentCoinsItem> _items; ObservableList<UnspentCoinsItem> items;
final Map<String, Map<String, dynamic>> _originalState;
@observable
bool isDisposing = false;
@computed @computed
ObservableList<UnspentCoinsItem> get items => _items; bool get isAllSelected => items.every((element) => element.isFrozen || element.isSending);
Future<void> saveUnspentCoinInfo(UnspentCoinsItem item) async { Future<void> initialSetup() async {
try { await _updateUnspents();
final info = _storeOriginalState();
getUnspentCoinInfo(item.hash, item.address, item.amountRaw, item.vout, item.keyImage); }
if (info == null) { void _storeOriginalState() {
return; _originalState.clear();
} for (final item in items) {
_originalState[item.hash] = {
info.isFrozen = item.isFrozen; 'isFrozen': item.isFrozen,
info.isSending = item.isSending; 'note': item.note,
info.note = item.note; 'isSending': item.isSending,
};
await info.save();
await _updateUnspents();
await wallet.updateBalance();
} catch (e) {
print(e.toString());
} }
} }
UnspentCoinsInfo? getUnspentCoinInfo( bool _hasAdjustableFieldChanged(UnspentCoinsItem item) {
String hash, String address, int value, int vout, String? keyImage) { final original = _originalState[item.hash];
if (original == null) return false;
return original['isFrozen'] != item.isFrozen ||
original['note'] != item.note ||
original['isSending'] != item.isSending;
}
bool get hasAdjustableFieldChanged => items.any(_hasAdjustableFieldChanged);
Future<void> saveUnspentCoinInfo(UnspentCoinsItem item) async {
try { try {
return _unspentCoinsInfo.values.firstWhere((element) => final existingInfo = _unspentCoinsInfo.values
element.walletId == wallet.id && .firstWhereOrNull((element) => element.walletId == wallet.id && element == item);
element.hash == hash && if (existingInfo == null) return;
element.address == address &&
element.value == value && existingInfo.isFrozen = item.isFrozen;
element.vout == vout && existingInfo.isSending = item.isSending;
element.keyImage == keyImage); existingInfo.note = item.note;
await existingInfo.save();
_updateUnspentCoinsInfo();
} catch (e) { } catch (e) {
print("UnspentCoinsInfo not found for coin: $e"); print('Error saving coin info: $e');
return null;
} }
} }
@ -115,37 +127,60 @@ abstract class UnspentCoinsListViewModelBase with Store {
@action @action
void _updateUnspentCoinsInfo() { void _updateUnspentCoinsInfo() {
_items.clear(); items.clear();
List<UnspentCoinsItem> unspents = []; final unspents = _getUnspents()
_getUnspents().forEach((Unspent elem) { .map((elem) {
try { try {
final info = final existingItem = _unspentCoinsInfo.values
getUnspentCoinInfo(elem.hash, elem.address, elem.value, elem.vout, elem.keyImage); .firstWhereOrNull((item) => item.walletId == wallet.id && item == elem);
if (info == null) {
return;
}
unspents.add(UnspentCoinsItem( if (existingItem == null) return null;
address: elem.address,
amount: '${formatAmountToString(elem.value)} ${wallet.currency.title}',
hash: elem.hash,
isFrozen: info.isFrozen,
note: info.note,
isSending: info.isSending,
amountRaw: elem.value,
vout: elem.vout,
keyImage: elem.keyImage,
isChange: elem.isChange,
isSilentPayment: info.isSilentPayment ?? false,
));
} catch (e, s) {
print(s);
print(e.toString());
ExceptionHandler.onError(FlutterErrorDetails(exception: e, stack: s));
}
});
_items.addAll(unspents); return UnspentCoinsItem(
address: elem.address,
amount: '${formatAmountToString(elem.value)} ${wallet.currency.title}',
hash: elem.hash,
isFrozen: existingItem.isFrozen,
note: existingItem.note,
isSending: existingItem.isSending,
value: elem.value,
vout: elem.vout,
keyImage: elem.keyImage,
isChange: elem.isChange,
isSilentPayment: existingItem.isSilentPayment ?? false,
);
} catch (e, s) {
print('Error: $e\nStack: $s');
ExceptionHandler.onError(
FlutterErrorDetails(exception: e, stack: s),
);
return null;
}
})
.whereType<UnspentCoinsItem>()
.toList();
unspents.sort((a, b) => b.value.compareTo(a.value));
items.addAll(unspents);
}
@action
void toggleSelectAll(bool value) {
for (final item in items) {
if (item.isFrozen || item.isSending == value) continue;
item.isSending = value;
saveUnspentCoinInfo(item);
}
}
@action
void setIsDisposing(bool value) => isDisposing = value;
@action
Future<void> dispose() async {
await _updateUnspents();
await wallet.updateBalance();
} }
} }

View file

@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST
sp_scanner
) )
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)

View file

@ -6,7 +6,6 @@ import FlutterMacOS
import Foundation import Foundation
import connectivity_plus import connectivity_plus
import cw_mweb
import device_info_plus import device_info_plus
import devicelocale import devicelocale
import fast_scanner import fast_scanner
@ -24,7 +23,6 @@ import wakelock_plus
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
CwMwebPlugin.register(with: registry.registrar(forPlugin: "CwMwebPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin")) DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin"))
MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))

View file

@ -38,6 +38,7 @@
"agree_to": "من خلال إنشاء حساب فإنك توافق على", "agree_to": "من خلال إنشاء حساب فإنك توافق على",
"alert_notice": "يلاحظ", "alert_notice": "يلاحظ",
"all": "الكل", "all": "الكل",
"all_coins": "كل العملات المعدنية",
"all_trades": "جميع عمليات التداول", "all_trades": "جميع عمليات التداول",
"all_transactions": "كل التحركات المالية", "all_transactions": "كل التحركات المالية",
"alphabetical": "مرتب حسب الحروف الأبجدية", "alphabetical": "مرتب حسب الحروف الأبجدية",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "اشتري بطاقات مدفوعة مسبقا وبطاقات هدايا في جميع أنحاء العالم", "cake_pay_web_cards_subtitle": "اشتري بطاقات مدفوعة مسبقا وبطاقات هدايا في جميع أنحاء العالم",
"cake_pay_web_cards_title": "بطاقات Cake Pay Web", "cake_pay_web_cards_title": "بطاقات Cake Pay Web",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "آسف ، بطاقة الهدايا هذه غير متوفرة على iOS. يمكنك شرائه على Android أو من خلال موقعنا بدلاً من ذلك.",
"cakepay_prepaid_card": "بطاقة ائتمان CakePay مسبقة الدفع", "cakepay_prepaid_card": "بطاقة ائتمان CakePay مسبقة الدفع",
"camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ", "camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ",
"camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ", "camera_permission_is_required": ".ﺍﺮﻴﻣﺎﻜﻟﺍ ﻥﺫﺇ ﺏﻮﻠﻄﻣ",
@ -175,6 +177,7 @@
"copy_address": "نسخ العنوان", "copy_address": "نسخ العنوان",
"copy_id": "نسخ معرف العملية", "copy_id": "نسخ معرف العملية",
"copyWalletConnectLink": "ﺎﻨﻫ ﻪﻘﺼﻟﺍﻭ dApp ﻦﻣ WalletConnect ﻂﺑﺍﺭ ﺦﺴﻧﺍ", "copyWalletConnectLink": "ﺎﻨﻫ ﻪﻘﺼﻟﺍﻭ dApp ﻦﻣ WalletConnect ﻂﺑﺍﺭ ﺦﺴﻧﺍ",
"corrupted_seed_notice": "تالف ملفات هذه المحفظة ولا يمكن فتحها. يرجى الاطلاع على عبارة البذور وحفظها واستعادة المحفظة.\n\nإذا كانت القيمة فارغة ، لم تتمكن البذور من استردادها بشكل صحيح.",
"countries": "بلدان", "countries": "بلدان",
"create_account": "إنشاء حساب", "create_account": "إنشاء حساب",
"create_backup": "انشئ نسخة احتياطية", "create_backup": "انشئ نسخة احتياطية",

View file

@ -38,6 +38,7 @@
"agree_to": "Чрез създаването на акаунт вие се съгласявате с ", "agree_to": "Чрез създаването на акаунт вие се съгласявате с ",
"alert_notice": "Забележете", "alert_notice": "Забележете",
"all": "ALL", "all": "ALL",
"all_coins": "Всички монети",
"all_trades": "Всички сделкки", "all_trades": "Всички сделкки",
"all_transactions": "Всички транзакции", "all_transactions": "Всички транзакции",
"alphabetical": "Азбучен ред", "alphabetical": "Азбучен ред",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Купете световно признати предплатени и гифт карти", "cake_pay_web_cards_subtitle": "Купете световно признати предплатени и гифт карти",
"cake_pay_web_cards_title": "Cake Pay Онлайн Карти", "cake_pay_web_cards_title": "Cake Pay Онлайн Карти",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "За съжаление тази карта за подарък не се предлага в iOS. Можете да го закупите на Android или чрез нашия уебсайт вместо това.",
"cakepay_prepaid_card": "CakePay предплатена дебитна карта", "cakepay_prepaid_card": "CakePay предплатена дебитна карта",
"camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности.", "camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности.",
"camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.", "camera_permission_is_required": "Изисква се разрешение за камерата.\nМоля, активирайте го от настройките на приложението.",
@ -175,6 +177,7 @@
"copy_address": "Copy Address", "copy_address": "Copy Address",
"copy_id": "Копиране на ID", "copy_id": "Копиране на ID",
"copyWalletConnectLink": "Копирайте връзката WalletConnect от dApp и я поставете тук", "copyWalletConnectLink": "Копирайте връзката WalletConnect от dApp и я поставете тук",
"corrupted_seed_notice": "Файловете за този портфейл са повредени и не могат да бъдат отворени. Моля, прегледайте фразата за семена, запазете я и възстановете портфейла.\n\nАко стойността е празна, тогава семето не успя да бъде правилно възстановено.",
"countries": "Държави", "countries": "Държави",
"create_account": "Създаване на профил", "create_account": "Създаване на профил",
"create_backup": "Създаване на резервно копие", "create_backup": "Създаване на резервно копие",

View file

@ -38,6 +38,7 @@
"agree_to": "Vytvořením účtu souhlasíte s ", "agree_to": "Vytvořením účtu souhlasíte s ",
"alert_notice": "Oznámení", "alert_notice": "Oznámení",
"all": "VŠE", "all": "VŠE",
"all_coins": "Všechny mince",
"all_trades": "Všechny obchody", "all_trades": "Všechny obchody",
"all_transactions": "Všechny transakce", "all_transactions": "Všechny transakce",
"alphabetical": "Abecední", "alphabetical": "Abecední",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Kupte si celosvětové předplacené a dárkové karty", "cake_pay_web_cards_subtitle": "Kupte si celosvětové předplacené a dárkové karty",
"cake_pay_web_cards_title": "Cake Pay webové karty", "cake_pay_web_cards_title": "Cake Pay webové karty",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Je nám líto, tato dárková karta není k dispozici na iOS. Místo toho si jej můžete zakoupit na Androidu nebo prostřednictvím našeho webu.",
"cakepay_prepaid_card": "CakePay předplacená debetní karta", "cakepay_prepaid_card": "CakePay předplacená debetní karta",
"camera_consent": "Váš fotoaparát použije k pořízení snímku pro účely identifikace ${provider}. Podrobnosti najdete v jejich Zásadách ochrany osobních údajů.", "camera_consent": "Váš fotoaparát použije k pořízení snímku pro účely identifikace ${provider}. Podrobnosti najdete v jejich Zásadách ochrany osobních údajů.",
"camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.", "camera_permission_is_required": "Vyžaduje se povolení fotoaparátu.\nPovolte jej v nastavení aplikace.",
@ -175,6 +177,7 @@
"copy_address": "Zkopírovat adresu", "copy_address": "Zkopírovat adresu",
"copy_id": "Kopírovat ID", "copy_id": "Kopírovat ID",
"copyWalletConnectLink": "Zkopírujte odkaz WalletConnect z dApp a vložte jej sem", "copyWalletConnectLink": "Zkopírujte odkaz WalletConnect z dApp a vložte jej sem",
"corrupted_seed_notice": "Soubory pro tuto peněženku jsou poškozeny a nemohou být otevřeny. Podívejte se prosím na osivo, uložte ji a obnovte peněženku.\n\nPokud je hodnota prázdná, pak semeno nebylo možné správně obnovit.",
"countries": "Země", "countries": "Země",
"create_account": "Vytvořit účet", "create_account": "Vytvořit účet",
"create_backup": "Vytvořit zálohu", "create_backup": "Vytvořit zálohu",

View file

@ -38,6 +38,7 @@
"agree_to": "Indem Sie ein Konto erstellen, stimmen Sie den ", "agree_to": "Indem Sie ein Konto erstellen, stimmen Sie den ",
"alert_notice": "Beachten", "alert_notice": "Beachten",
"all": "ALLES", "all": "ALLES",
"all_coins": "Alle Münzen",
"all_trades": "Alle Trades", "all_trades": "Alle Trades",
"all_transactions": "Alle Transaktionen", "all_transactions": "Alle Transaktionen",
"alphabetical": "Alphabetisch", "alphabetical": "Alphabetisch",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Kaufen Sie weltweit Prepaid-Karten und Geschenkkarten", "cake_pay_web_cards_subtitle": "Kaufen Sie weltweit Prepaid-Karten und Geschenkkarten",
"cake_pay_web_cards_title": "Cake Pay-Webkarten", "cake_pay_web_cards_title": "Cake Pay-Webkarten",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Entschuldigung, diese Geschenkkarte ist auf iOS nicht erhältlich. Sie können es stattdessen auf Android oder über unsere Website kaufen.",
"cakepay_prepaid_card": "CakePay-Prepaid-Debitkarte", "cakepay_prepaid_card": "CakePay-Prepaid-Debitkarte",
"camera_consent": "Mit Ihrer Kamera wird bis zum ${provider} ein Bild zur Identifizierung aufgenommen. Weitere Informationen finden Sie in deren Datenschutzbestimmungen.", "camera_consent": "Mit Ihrer Kamera wird bis zum ${provider} ein Bild zur Identifizierung aufgenommen. Weitere Informationen finden Sie in deren Datenschutzbestimmungen.",
"camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.", "camera_permission_is_required": "Eine Kameraerlaubnis ist erforderlich.\nBitte aktivieren Sie es in den App-Einstellungen.",
@ -175,6 +177,7 @@
"copy_address": "Adresse kopieren", "copy_address": "Adresse kopieren",
"copy_id": "ID kopieren", "copy_id": "ID kopieren",
"copyWalletConnectLink": "Kopieren Sie den WalletConnect-Link von dApp und fügen Sie ihn hier ein", "copyWalletConnectLink": "Kopieren Sie den WalletConnect-Link von dApp und fügen Sie ihn hier ein",
"corrupted_seed_notice": "Die Dateien für diese Brieftasche sind beschädigt und können nicht geöffnet werden. Bitte sehen Sie sich die Saatgutphrase an, speichern Sie sie und stellen Sie die Brieftasche wieder her.\n\nWenn der Wert leer ist, konnte der Samen nicht korrekt wiederhergestellt werden.",
"countries": "Länder", "countries": "Länder",
"create_account": "Konto erstellen", "create_account": "Konto erstellen",
"create_backup": "Backup erstellen", "create_backup": "Backup erstellen",

View file

@ -38,6 +38,7 @@
"agree_to": "By creating account you agree to the ", "agree_to": "By creating account you agree to the ",
"alert_notice": "Notice", "alert_notice": "Notice",
"all": "ALL", "all": "ALL",
"all_coins": "All Coins",
"all_trades": "All trades", "all_trades": "All trades",
"all_transactions": "All transactions", "all_transactions": "All transactions",
"alphabetical": "Alphabetical", "alphabetical": "Alphabetical",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Buy worldwide prepaid cards and gift cards", "cake_pay_web_cards_subtitle": "Buy worldwide prepaid cards and gift cards",
"cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_pay_web_cards_title": "Cake Pay Web Cards",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Sorry, this gift card is not available on iOS. You can purchase it on Android or through our website instead.",
"cakepay_prepaid_card": "CakePay Prepaid Debit Card", "cakepay_prepaid_card": "CakePay Prepaid Debit Card",
"camera_consent": "Your camera will be used to capture an image for identification purposes by ${provider}. Please check their Privacy Policy for details.", "camera_consent": "Your camera will be used to capture an image for identification purposes by ${provider}. Please check their Privacy Policy for details.",
"camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.", "camera_permission_is_required": "Camera permission is required. \nPlease enable it from app settings.",
@ -175,6 +177,7 @@
"copy_address": "Copy Address", "copy_address": "Copy Address",
"copy_id": "Copy ID", "copy_id": "Copy ID",
"copyWalletConnectLink": "Copy the WalletConnect link from dApp and paste here", "copyWalletConnectLink": "Copy the WalletConnect link from dApp and paste here",
"corrupted_seed_notice": "The files for this wallet are corrupted and are unable to be opened. Please view the seed phrase, save it, and restore the wallet.\n\nIf the value is empty, then the seed was unable to be correctly recovered.",
"countries": "Countries", "countries": "Countries",
"create_account": "Create Account", "create_account": "Create Account",
"create_backup": "Create backup", "create_backup": "Create backup",

View file

@ -38,6 +38,7 @@
"agree_to": "Al crear una cuenta, aceptas ", "agree_to": "Al crear una cuenta, aceptas ",
"alert_notice": "Aviso", "alert_notice": "Aviso",
"all": "Todos", "all": "Todos",
"all_coins": "Todas las monedas",
"all_trades": "Todos los oficios", "all_trades": "Todos los oficios",
"all_transactions": "Todas las transacciones", "all_transactions": "Todas las transacciones",
"alphabetical": "Alfabético", "alphabetical": "Alfabético",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Compra tarjetas de prepago y tarjetas de regalo en todo el mundo", "cake_pay_web_cards_subtitle": "Compra tarjetas de prepago y tarjetas de regalo en todo el mundo",
"cake_pay_web_cards_title": "Tarjetas Web Cake Pay", "cake_pay_web_cards_title": "Tarjetas Web Cake Pay",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Lo siento, esta tarjeta de regalo no está disponible en iOS. Puede comprarlo en Android o a través de nuestro sitio web.",
"cakepay_prepaid_card": "Tarjeta de Débito Prepago CakePay", "cakepay_prepaid_card": "Tarjeta de Débito Prepago CakePay",
"camera_consent": "Su cámara será utilizada para capturar una imagen con fines de identificación por ${provider}. Consulta tu Política de privacidad para obtener más detalles.", "camera_consent": "Su cámara será utilizada para capturar una imagen con fines de identificación por ${provider}. Consulta tu Política de privacidad para obtener más detalles.",
"camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítalo desde la configuración de la aplicación.", "camera_permission_is_required": "Se requiere permiso de la cámara.\nHabilítalo desde la configuración de la aplicación.",
@ -175,6 +177,7 @@
"copy_address": "Copiar dirección ", "copy_address": "Copiar dirección ",
"copy_id": "Copiar ID", "copy_id": "Copiar ID",
"copyWalletConnectLink": "Copie el enlace de WalletConnect de dApp y péguelo aquí", "copyWalletConnectLink": "Copie el enlace de WalletConnect de dApp y péguelo aquí",
"corrupted_seed_notice": "Los archivos para esta billetera están dañados y no pueden abrirse. Vea la frase de semillas, guárdela y restaura la billetera.\n\nSi el valor está vacío, entonces la semilla no pudo recuperarse correctamente.",
"countries": "Países", "countries": "Países",
"create_account": "Crear Cuenta", "create_account": "Crear Cuenta",
"create_backup": "Crear copia de seguridad", "create_backup": "Crear copia de seguridad",

View file

@ -38,6 +38,7 @@
"agree_to": "En créant un compte, vous acceptez les ", "agree_to": "En créant un compte, vous acceptez les ",
"alert_notice": "Avis", "alert_notice": "Avis",
"all": "TOUT", "all": "TOUT",
"all_coins": "Toutes les pièces",
"all_trades": "Tous échanges", "all_trades": "Tous échanges",
"all_transactions": "Toutes transactions", "all_transactions": "Toutes transactions",
"alphabetical": "Alphabétique", "alphabetical": "Alphabétique",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Achetez des cartes prépayées et des cartes-cadeaux dans le monde entier", "cake_pay_web_cards_subtitle": "Achetez des cartes prépayées et des cartes-cadeaux dans le monde entier",
"cake_pay_web_cards_title": "Cartes Web Cake Pay", "cake_pay_web_cards_title": "Cartes Web Cake Pay",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Désolé, cette carte-cadeau n'est pas disponible sur iOS. Vous pouvez l'acheter sur Android ou via notre site Web à la place.",
"cakepay_prepaid_card": "Carte de débit prépayée Cake Pay", "cakepay_prepaid_card": "Carte de débit prépayée Cake Pay",
"camera_consent": "Votre appareil photo sera utilisé pour capturer une image à des fins d'identification par ${provider}. Veuillez consulter leur politique de confidentialité pour plus de détails.", "camera_consent": "Votre appareil photo sera utilisé pour capturer une image à des fins d'identification par ${provider}. Veuillez consulter leur politique de confidentialité pour plus de détails.",
"camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.", "camera_permission_is_required": "L'autorisation de la caméra est requise.\nVeuillez l'activer à partir des paramètres de l'application.",
@ -175,6 +177,7 @@
"copy_address": "Copier l'Adresse", "copy_address": "Copier l'Adresse",
"copy_id": "Copier l'ID", "copy_id": "Copier l'ID",
"copyWalletConnectLink": "Copiez le lien WalletConnect depuis l'application décentralisée (dApp) et collez-le ici", "copyWalletConnectLink": "Copiez le lien WalletConnect depuis l'application décentralisée (dApp) et collez-le ici",
"corrupted_seed_notice": "Les fichiers de ce portefeuille sont corrompus et ne peuvent pas être ouverts. Veuillez consulter la phrase de graines, sauver et restaurer le portefeuille.\n\nSi la valeur est vide, la graine n'a pas pu être correctement récupérée.",
"countries": "Des pays", "countries": "Des pays",
"create_account": "Créer un compte", "create_account": "Créer un compte",
"create_backup": "Créer une sauvegarde", "create_backup": "Créer une sauvegarde",

View file

@ -38,6 +38,7 @@
"agree_to": "Ta hanyar ƙirƙirar asusu kun yarda da", "agree_to": "Ta hanyar ƙirƙirar asusu kun yarda da",
"alert_notice": "Sanarwa", "alert_notice": "Sanarwa",
"all": "DUK", "all": "DUK",
"all_coins": "Duk tsabar kudi",
"all_trades": "Duk ciniki", "all_trades": "Duk ciniki",
"all_transactions": "Dukan Ma'amaloli", "all_transactions": "Dukan Ma'amaloli",
"alphabetical": "Harafi", "alphabetical": "Harafi",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Sayi katunan da aka riga aka biya na duniya da katunan kyauta", "cake_pay_web_cards_subtitle": "Sayi katunan da aka riga aka biya na duniya da katunan kyauta",
"cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_pay_web_cards_title": "Cake Pay Web Cards",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Yi haƙuri, wannan katin kyautar ba a samuwa akan iOS. Kuna iya sayan shi a kan Android ko ta yanar gizo a maimakon.",
"cakepay_prepaid_card": "Katin zare kudi na CakePay", "cakepay_prepaid_card": "Katin zare kudi na CakePay",
"camera_consent": "Za a yi amfani da kyamarar ku don ɗaukar hoto don dalilai na tantancewa ta ${provider}. Da fatan za a duba Manufar Sirri don cikakkun bayanai.", "camera_consent": "Za a yi amfani da kyamarar ku don ɗaukar hoto don dalilai na tantancewa ta ${provider}. Da fatan za a duba Manufar Sirri don cikakkun bayanai.",
"camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.", "camera_permission_is_required": "Ana buƙatar izinin kyamara.\nDa fatan za a kunna shi daga saitunan app.",
@ -175,6 +177,7 @@
"copy_address": "Kwafi Adireshin", "copy_address": "Kwafi Adireshin",
"copy_id": "Kwafi ID", "copy_id": "Kwafi ID",
"copyWalletConnectLink": "Kwafi hanyar haɗin WalletConnect daga dApp kuma liƙa a nan", "copyWalletConnectLink": "Kwafi hanyar haɗin WalletConnect daga dApp kuma liƙa a nan",
"corrupted_seed_notice": "Fayilolin don wannan walat ɗin sun lalata kuma ba za a iya buɗe su ba. Da fatan za a duba kalmar iri, adana shi, da dawo da walat.\n\nIdan darajar ta kasance fanko, to sai zuriyar da ba ta iya murmurewa daidai ba.",
"countries": "Kasashe", "countries": "Kasashe",
"create_account": "Kirkira ajiya", "create_account": "Kirkira ajiya",
"create_backup": "Ƙirƙiri madadin", "create_backup": "Ƙirƙiri madadin",

View file

@ -38,6 +38,7 @@
"agree_to": "खाता बनाकर आप इससे सहमत होते हैं ", "agree_to": "खाता बनाकर आप इससे सहमत होते हैं ",
"alert_notice": "सूचना", "alert_notice": "सूचना",
"all": "सब", "all": "सब",
"all_coins": "सभी सिक्के",
"all_trades": "सभी व्यापार", "all_trades": "सभी व्यापार",
"all_transactions": "सभी लेन - देन", "all_transactions": "सभी लेन - देन",
"alphabetical": "वर्णमाला", "alphabetical": "वर्णमाला",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "दुनिया भर में प्रीपेड कार्ड और गिफ्ट कार्ड खरीदें", "cake_pay_web_cards_subtitle": "दुनिया भर में प्रीपेड कार्ड और गिफ्ट कार्ड खरीदें",
"cake_pay_web_cards_title": "केक भुगतान वेब कार्ड", "cake_pay_web_cards_title": "केक भुगतान वेब कार्ड",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "क्षमा करें, यह उपहार कार्ड iOS पर उपलब्ध नहीं है। आप इसे Android पर या हमारी वेबसाइट के बजाय खरीद सकते हैं।",
"cakepay_prepaid_card": "केकपे प्रीपेड डेबिट कार्ड", "cakepay_prepaid_card": "केकपे प्रीपेड डेबिट कार्ड",
"camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।", "camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।",
"camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।", "camera_permission_is_required": "कैमरे की अनुमति आवश्यक है.\nकृपया इसे ऐप सेटिंग से सक्षम करें।",
@ -175,6 +177,7 @@
"copy_address": "पता कॉपी करें", "copy_address": "पता कॉपी करें",
"copy_id": "प्रतिलिपि ID", "copy_id": "प्रतिलिपि ID",
"copyWalletConnectLink": "dApp से वॉलेटकनेक्ट लिंक को कॉपी करें और यहां पेस्ट करें", "copyWalletConnectLink": "dApp से वॉलेटकनेक्ट लिंक को कॉपी करें और यहां पेस्ट करें",
"corrupted_seed_notice": "इस वॉलेट की फाइलें दूषित हैं और उन्हें खोलने में असमर्थ हैं। कृपया बीज वाक्यांश देखें, इसे बचाएं, और बटुए को पुनर्स्थापित करें।\n\nयदि मूल्य खाली है, तो बीज सही ढंग से पुनर्प्राप्त करने में असमर्थ था।",
"countries": "देशों", "countries": "देशों",
"create_account": "खाता बनाएं", "create_account": "खाता बनाएं",
"create_backup": "बैकअप बनाएँ", "create_backup": "बैकअप बनाएँ",

View file

@ -38,6 +38,7 @@
"agree_to": "Stvaranjem računa pristajete na ", "agree_to": "Stvaranjem računa pristajete na ",
"alert_notice": "Obavijest", "alert_notice": "Obavijest",
"all": "SVE", "all": "SVE",
"all_coins": "Sve kovanice",
"all_trades": "Svi obrti", "all_trades": "Svi obrti",
"all_transactions": "Sve transakcije", "all_transactions": "Sve transakcije",
"alphabetical": "Abecedno", "alphabetical": "Abecedno",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Kupujte prepaid kartice i poklon kartice diljem svijeta", "cake_pay_web_cards_subtitle": "Kupujte prepaid kartice i poklon kartice diljem svijeta",
"cake_pay_web_cards_title": "Cake Pay Web kartice", "cake_pay_web_cards_title": "Cake Pay Web kartice",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Oprostite, ova poklon kartica nije dostupna na iOS -u. Umjesto toga, možete ga kupiti na Androidu ili putem naše web stranice.",
"cakepay_prepaid_card": "CakePay unaprijed plaćena debitna kartica", "cakepay_prepaid_card": "CakePay unaprijed plaćena debitna kartica",
"camera_consent": "Vaš će fotoaparat koristiti za snimanje slike u svrhu identifikacije od strane ${provider}. Pojedinosti potražite u njihovoj politici privatnosti.", "camera_consent": "Vaš će fotoaparat koristiti za snimanje slike u svrhu identifikacije od strane ${provider}. Pojedinosti potražite u njihovoj politici privatnosti.",
"camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.", "camera_permission_is_required": "Potrebno je dopuštenje kamere.\nOmogućite ga u postavkama aplikacije.",
@ -175,6 +177,7 @@
"copy_address": "Kopiraj adresu", "copy_address": "Kopiraj adresu",
"copy_id": "Kopirati ID", "copy_id": "Kopirati ID",
"copyWalletConnectLink": "Kopirajte vezu WalletConnect iz dApp-a i zalijepite je ovdje", "copyWalletConnectLink": "Kopirajte vezu WalletConnect iz dApp-a i zalijepite je ovdje",
"corrupted_seed_notice": "Datoteke za ovaj novčanik su oštećene i nisu u mogućnosti otvoriti. Molimo pogledajte sjemensku frazu, spremite je i vratite novčanik.\n\nAko je vrijednost prazna, tada sjeme nije bilo u stanju ispravno oporaviti.",
"countries": "Zemalja", "countries": "Zemalja",
"create_account": "Stvori račun", "create_account": "Stvori račun",
"create_backup": "Stvori sigurnosnu kopiju", "create_backup": "Stvori sigurnosnu kopiju",

View file

@ -38,6 +38,7 @@
"agree_to": "Ստեղծելով հաշիվ դուք համաձայնում եք ", "agree_to": "Ստեղծելով հաշիվ դուք համաձայնում եք ",
"alert_notice": "Ծանուցում", "alert_notice": "Ծանուցում",
"all": "Բոլորը", "all": "Բոլորը",
"all_coins": "Բոլոր մետաղադրամները",
"all_trades": "Բոլոր գործարքները", "all_trades": "Բոլոր գործարքները",
"all_transactions": "Բոլոր գործառնությունները", "all_transactions": "Բոլոր գործառնությունները",
"alphabetical": "Այբբենական", "alphabetical": "Այբբենական",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Գնեք համաշխարհային նախավճարային քարտեր և նվեր քարտեր", "cake_pay_web_cards_subtitle": "Գնեք համաշխարհային նախավճարային քարտեր և նվեր քարտեր",
"cake_pay_web_cards_title": "Cake Pay Վեբ Քարտեր", "cake_pay_web_cards_title": "Cake Pay Վեբ Քարտեր",
"cake_wallet": "Cake Գաղտնապահոց", "cake_wallet": "Cake Գաղտնապահոց",
"cakepay_ios_not_available": "Ներեցեք, այս նվեր քարտը հասանելի չէ iOS- ում: Փոխարենը կարող եք այն գնել Android- ում կամ մեր կայքում:",
"cakepay_prepaid_card": "CakePay Նախավճարային Դեբետային Քարտ", "cakepay_prepaid_card": "CakePay Նախավճարային Դեբետային Քարտ",
"camera_consent": "Ձեր տեսախցիկը կօգտագործվի ${provider}-ի կողմից ինքնությունը հաստատելու նպատակով: Խնդրում ենք ծանոթանալ նրանց Գաղտնիության Քաղաքականության հետ:", "camera_consent": "Ձեր տեսախցիկը կօգտագործվի ${provider}-ի կողմից ինքնությունը հաստատելու նպատակով: Խնդրում ենք ծանոթանալ նրանց Գաղտնիության Քաղաքականության հետ:",
"camera_permission_is_required": "Տեսախցիկի թույլտվություն է պահանջվում: \nԽնդրում ենք այն ակտիվացնել հավելվածի կարգավորումներից:", "camera_permission_is_required": "Տեսախցիկի թույլտվություն է պահանջվում: \nԽնդրում ենք այն ակտիվացնել հավելվածի կարգավորումներից:",
@ -175,6 +177,7 @@
"copy_address": "Պատճենել հասցեն", "copy_address": "Պատճենել հասցեն",
"copy_id": "Պատճենել ID", "copy_id": "Պատճենել ID",
"copyWalletConnectLink": "Պատճենել WalletConnect հղումը dApp-ից և տեղադրել այստեղ", "copyWalletConnectLink": "Պատճենել WalletConnect հղումը dApp-ից և տեղադրել այստեղ",
"corrupted_seed_notice": "Այս դրամապանակի համար ֆայլերը կոռումպացված են եւ չեն կարողանում բացվել: Խնդրում ենք դիտել սերմերի արտահայտությունը, պահպանել այն եւ վերականգնել դրամապանակը:\n\nԵթե ​​արժեքը դատարկ է, ապա սերմը չկարողացավ ճիշտ վերականգնվել:",
"countries": "Երկրներ", "countries": "Երկրներ",
"create_account": "Ստեղծել հաշիվ", "create_account": "Ստեղծել հաշիվ",
"create_backup": "Ստեղծել կրկնօրինակ", "create_backup": "Ստեղծել կրկնօրինակ",

View file

@ -38,6 +38,7 @@
"agree_to": "Dengan membuat akun Anda setuju dengan ", "agree_to": "Dengan membuat akun Anda setuju dengan ",
"alert_notice": "Melihat", "alert_notice": "Melihat",
"all": "SEMUA", "all": "SEMUA",
"all_coins": "Semua koin",
"all_trades": "Semua perdagangan", "all_trades": "Semua perdagangan",
"all_transactions": "Semua transaksi", "all_transactions": "Semua transaksi",
"alphabetical": "Alfabetis", "alphabetical": "Alfabetis",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Beli kartu prabayar dan kartu hadiah secara global", "cake_pay_web_cards_subtitle": "Beli kartu prabayar dan kartu hadiah secara global",
"cake_pay_web_cards_title": "Kartu Web Cake Pay", "cake_pay_web_cards_title": "Kartu Web Cake Pay",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Maaf, kartu hadiah ini tidak tersedia di iOS. Anda dapat membelinya di Android atau melalui situs web kami sebagai gantinya.",
"cakepay_prepaid_card": "Kartu Debit Prabayar CakePay", "cakepay_prepaid_card": "Kartu Debit Prabayar CakePay",
"camera_consent": "Kamera Anda akan digunakan untuk mengambil gambar untuk tujuan identifikasi oleh ${provider}. Silakan periksa Kebijakan Privasi mereka untuk detailnya.", "camera_consent": "Kamera Anda akan digunakan untuk mengambil gambar untuk tujuan identifikasi oleh ${provider}. Silakan periksa Kebijakan Privasi mereka untuk detailnya.",
"camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.", "camera_permission_is_required": "Izin kamera diperlukan.\nSilakan aktifkan dari pengaturan aplikasi.",
@ -175,6 +177,7 @@
"copy_address": "Salin Alamat", "copy_address": "Salin Alamat",
"copy_id": "Salin ID", "copy_id": "Salin ID",
"copyWalletConnectLink": "Salin tautan WalletConnect dari dApp dan tempel di sini", "copyWalletConnectLink": "Salin tautan WalletConnect dari dApp dan tempel di sini",
"corrupted_seed_notice": "File untuk dompet ini rusak dan tidak dapat dibuka. Silakan lihat frasa benih, simpan, dan kembalikan dompet.\n\nJika nilainya kosong, maka benih tidak dapat dipulihkan dengan benar.",
"countries": "Negara", "countries": "Negara",
"create_account": "Buat Akun", "create_account": "Buat Akun",
"create_backup": "Buat cadangan", "create_backup": "Buat cadangan",

View file

@ -38,6 +38,7 @@
"agree_to": "Creando un account accetti il ", "agree_to": "Creando un account accetti il ",
"alert_notice": "Avviso", "alert_notice": "Avviso",
"all": "TUTTO", "all": "TUTTO",
"all_coins": "Tutte le monete",
"all_trades": "Svi obrti", "all_trades": "Svi obrti",
"all_transactions": "Sve transakcije", "all_transactions": "Sve transakcije",
"alphabetical": "Alfabetico", "alphabetical": "Alfabetico",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Acquista carte prepagate e carte regalo in tutto il mondo", "cake_pay_web_cards_subtitle": "Acquista carte prepagate e carte regalo in tutto il mondo",
"cake_pay_web_cards_title": "Carte Web Cake Pay", "cake_pay_web_cards_title": "Carte Web Cake Pay",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Mi dispiace, questa carta regalo non è disponibile su iOS. Puoi acquistarlo su Android o tramite il nostro sito Web.",
"cakepay_prepaid_card": "Carta di debito prepagata CakePay", "cakepay_prepaid_card": "Carta di debito prepagata CakePay",
"camera_consent": "La tua fotocamera verrà utilizzata per acquisire un'immagine a scopo identificativo da ${provider}. Si prega di controllare la loro Informativa sulla privacy per i dettagli.", "camera_consent": "La tua fotocamera verrà utilizzata per acquisire un'immagine a scopo identificativo da ${provider}. Si prega di controllare la loro Informativa sulla privacy per i dettagli.",
"camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.", "camera_permission_is_required": "È richiesta l'autorizzazione della fotocamera.\nAbilitalo dalle impostazioni dell'app.",
@ -176,6 +178,7 @@
"copy_address": "Copia Indirizzo", "copy_address": "Copia Indirizzo",
"copy_id": "Copia ID", "copy_id": "Copia ID",
"copyWalletConnectLink": "Copia il collegamento WalletConnect dalla dApp e incollalo qui", "copyWalletConnectLink": "Copia il collegamento WalletConnect dalla dApp e incollalo qui",
"corrupted_seed_notice": "I file per questo portafoglio sono corrotti e non sono in grado di essere aperti. Visualizza la frase del seme, salvala e ripristina il portafoglio.\n\nSe il valore è vuoto, il seme non è stato in grado di essere recuperato correttamente.",
"countries": "Paesi", "countries": "Paesi",
"create_account": "Crea account", "create_account": "Crea account",
"create_backup": "Crea backup", "create_backup": "Crea backup",

View file

@ -38,6 +38,7 @@
"agree_to": "アカウントを作成することにより、", "agree_to": "アカウントを作成することにより、",
"alert_notice": "知らせ", "alert_notice": "知らせ",
"all": "すべて", "all": "すべて",
"all_coins": "すべてのコイン",
"all_trades": "すべての取引", "all_trades": "すべての取引",
"all_transactions": "全取引", "all_transactions": "全取引",
"alphabetical": "アルファベット順", "alphabetical": "アルファベット順",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "世界中のプリペイド カードとギフト カードを購入する", "cake_pay_web_cards_subtitle": "世界中のプリペイド カードとギフト カードを購入する",
"cake_pay_web_cards_title": "Cake Pay ウェブカード", "cake_pay_web_cards_title": "Cake Pay ウェブカード",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "申し訳ありませんが、このギフトカードはiOSでは利用できません。代わりにAndroidまたは当社のWebサイトから購入できます。",
"cakepay_prepaid_card": "CakePayプリペイドデビットカード", "cakepay_prepaid_card": "CakePayプリペイドデビットカード",
"camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。", "camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。",
"camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。", "camera_permission_is_required": "カメラの許可が必要です。\nアプリの設定から有効にしてください。",
@ -175,6 +177,7 @@
"copy_address": "住所をコピー", "copy_address": "住所をコピー",
"copy_id": "IDをコピー", "copy_id": "IDをコピー",
"copyWalletConnectLink": "dApp から WalletConnect リンクをコピーし、ここに貼り付けます", "copyWalletConnectLink": "dApp から WalletConnect リンクをコピーし、ここに貼り付けます",
"corrupted_seed_notice": "このウォレットのファイルは破損しており、開くことができません。シードフレーズを表示し、保存し、財布を復元してください。\n\n値が空の場合、種子を正しく回復することができませんでした。",
"countries": "国", "countries": "国",
"create_account": "アカウントの作成", "create_account": "アカウントの作成",
"create_backup": "バックアップを作成", "create_backup": "バックアップを作成",

View file

@ -38,6 +38,7 @@
"agree_to": "계정을 생성하면 ", "agree_to": "계정을 생성하면 ",
"alert_notice": "알아채다", "alert_notice": "알아채다",
"all": "모든", "all": "모든",
"all_coins": "모든 동전",
"all_trades": "A모든 거래", "all_trades": "A모든 거래",
"all_transactions": "모든 거래 창구", "all_transactions": "모든 거래 창구",
"alphabetical": "알파벳순", "alphabetical": "알파벳순",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "전 세계 선불 카드 및 기프트 카드 구매", "cake_pay_web_cards_subtitle": "전 세계 선불 카드 및 기프트 카드 구매",
"cake_pay_web_cards_title": "케이크페이 웹카드", "cake_pay_web_cards_title": "케이크페이 웹카드",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "죄송합니다.이 기프트 카드는 iOS에서 사용할 수 없습니다. Android 또는 웹 사이트를 통해 구매할 수 있습니다.",
"cakepay_prepaid_card": "CakePay 선불 직불 카드", "cakepay_prepaid_card": "CakePay 선불 직불 카드",
"camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요.", "camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요.",
"camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.", "camera_permission_is_required": "카메라 권한이 필요합니다.\n앱 설정에서 활성화해 주세요.",
@ -175,6 +177,7 @@
"copy_address": "주소 복사", "copy_address": "주소 복사",
"copy_id": "부 ID", "copy_id": "부 ID",
"copyWalletConnectLink": "dApp에서 WalletConnect 링크를 복사하여 여기에 붙여넣으세요.", "copyWalletConnectLink": "dApp에서 WalletConnect 링크를 복사하여 여기에 붙여넣으세요.",
"corrupted_seed_notice": "이 지갑의 파일은 손상되어 열 수 없습니다. 씨앗 문구를보고 저장하고 지갑을 복원하십시오.\n\n값이 비어 있으면 씨앗을 올바르게 회수 할 수 없었습니다.",
"countries": "국가", "countries": "국가",
"create_account": "계정 만들기", "create_account": "계정 만들기",
"create_backup": "백업 생성", "create_backup": "백업 생성",
@ -495,8 +498,8 @@
"placeholder_transactions": "거래가 여기에 표시됩니다", "placeholder_transactions": "거래가 여기에 표시됩니다",
"please_fill_totp": "다른 기기에 있는 8자리 코드를 입력하세요.", "please_fill_totp": "다른 기기에 있는 8자리 코드를 입력하세요.",
"please_make_selection": "아래에서 선택하십시오 지갑 만들기 또는 복구.", "please_make_selection": "아래에서 선택하십시오 지갑 만들기 또는 복구.",
"Please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.",
"please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.", "please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.",
"Please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.",
"please_select": "선택 해주세요:", "please_select": "선택 해주세요:",
"please_select_backup_file": "백업 파일을 선택하고 백업 암호를 입력하십시오.", "please_select_backup_file": "백업 파일을 선택하고 백업 암호를 입력하십시오.",
"please_try_to_connect_to_another_node": "다른 노드에 연결을 시도하십시오", "please_try_to_connect_to_another_node": "다른 노드에 연결을 시도하십시오",

View file

@ -38,6 +38,7 @@
"agree_to": "အကောင့်ဖန်တီးခြင်းဖြင့် သင်သည် ဤအရာကို သဘောတူပါသည်။", "agree_to": "အကောင့်ဖန်တီးခြင်းဖြင့် သင်သည် ဤအရာကို သဘောတူပါသည်။",
"alert_notice": "မှတ်သား", "alert_notice": "မှတ်သား",
"all": "အားလုံး", "all": "အားလုံး",
"all_coins": "အားလုံးဒင်္ဂါးများ",
"all_trades": "ကုန်သွယ်မှုအားလုံး", "all_trades": "ကုန်သွယ်မှုအားလုံး",
"all_transactions": "အရောင်းအဝယ်အားလုံး", "all_transactions": "အရောင်းအဝယ်အားလုံး",
"alphabetical": "အက္ခရာစဉ်", "alphabetical": "အက္ခရာစဉ်",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "ကမ္ဘာတစ်ဝှမ်း ကြိုတင်ငွေပေးကတ်များနှင့် လက်ဆောင်ကတ်များကို ဝယ်ယူပါ။", "cake_pay_web_cards_subtitle": "ကမ္ဘာတစ်ဝှမ်း ကြိုတင်ငွေပေးကတ်များနှင့် လက်ဆောင်ကတ်များကို ဝယ်ယူပါ။",
"cake_pay_web_cards_title": "Cake Pay ဝဘ်ကတ်များ", "cake_pay_web_cards_title": "Cake Pay ဝဘ်ကတ်များ",
"cake_wallet": "Cake ပိုက်ဆံအိတ်", "cake_wallet": "Cake ပိုက်ဆံအိတ်",
"cakepay_ios_not_available": "တောင်းပန်ပါတယ်, ဒီလက်ဆောင်ကဒ်ကို iOS မှာမရနိုင်ပါ။ ၎င်းကို Android တွင်သို့မဟုတ်ကျွန်ုပ်တို့၏ဝက်ဘ်ဆိုက်တွင် 0 ယ်နိုင်သည်။",
"cakepay_prepaid_card": "CakePay ကြိုတင်ငွေဖြည့်ဒက်ဘစ်ကတ်", "cakepay_prepaid_card": "CakePay ကြိုတင်ငွေဖြည့်ဒက်ဘစ်ကတ်",
"camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။", "camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။",
"camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။", "camera_permission_is_required": "ကင်မရာခွင့်ပြုချက် လိုအပ်ပါသည်။\nအက်ပ်ဆက်တင်များမှ ၎င်းကိုဖွင့်ပါ။",
@ -175,6 +177,7 @@
"copy_address": "လိပ်စာကို ကူးယူပါ။", "copy_address": "လိပ်စာကို ကူးယူပါ။",
"copy_id": "ID ကူးယူပါ။", "copy_id": "ID ကူးယူပါ။",
"copyWalletConnectLink": "dApp မှ WalletConnect လင့်ခ်ကို ကူးယူပြီး ဤနေရာတွင် ကူးထည့်ပါ။", "copyWalletConnectLink": "dApp မှ WalletConnect လင့်ခ်ကို ကူးယူပြီး ဤနေရာတွင် ကူးထည့်ပါ။",
"corrupted_seed_notice": "ဤပိုက်ဆံအိတ်အတွက်ဖိုင်များသည်အကျင့်ပျက်ခြစားမှုများနှင့်မဖွင့်နိုင်ပါ။ ကျေးဇူးပြု. မျိုးစေ့များကိုကြည့်ပါ, ၎င်းကိုသိမ်းဆည်းပါ, ပိုက်ဆံအိတ်ကိုပြန်ယူပါ။\n\nအကယ်. တန်ဖိုးသည်အချည်းနှီးဖြစ်ပါကမျိုးစေ့ကိုမှန်ကန်စွာပြန်လည်ကောင်းမွန်မရရှိနိုင်ပါ။",
"countries": "နိုင်ငံများ", "countries": "နိုင်ငံများ",
"create_account": "အကောင့်ပြုလုပ်ပါ", "create_account": "အကောင့်ပြုလုပ်ပါ",
"create_backup": "အရန်သိမ်းခြင်းကို ဖန်တီးပါ။", "create_backup": "အရန်သိမ်းခြင်းကို ဖန်တီးပါ။",

View file

@ -38,6 +38,7 @@
"agree_to": "Door een account aan te maken gaat u akkoord met de ", "agree_to": "Door een account aan te maken gaat u akkoord met de ",
"alert_notice": "Kennisgeving", "alert_notice": "Kennisgeving",
"all": "ALLE", "all": "ALLE",
"all_coins": "Alle munten",
"all_trades": "Alle transacties", "all_trades": "Alle transacties",
"all_transactions": "Alle transacties", "all_transactions": "Alle transacties",
"alphabetical": "Alfabetisch", "alphabetical": "Alfabetisch",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Koop wereldwijd prepaidkaarten en cadeaubonnen", "cake_pay_web_cards_subtitle": "Koop wereldwijd prepaidkaarten en cadeaubonnen",
"cake_pay_web_cards_title": "Cake Pay-webkaarten", "cake_pay_web_cards_title": "Cake Pay-webkaarten",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Sorry, deze cadeaubon is niet beschikbaar op iOS. U kunt het in plaats daarvan kopen op Android of via onze website.",
"cakepay_prepaid_card": "CakePay Prepaid Debetkaart", "cakepay_prepaid_card": "CakePay Prepaid Debetkaart",
"camera_consent": "Uw camera wordt gebruikt om vóór ${provider} een beeld vast te leggen voor identificatiedoeleinden. Raadpleeg hun privacybeleid voor meer informatie.", "camera_consent": "Uw camera wordt gebruikt om vóór ${provider} een beeld vast te leggen voor identificatiedoeleinden. Raadpleeg hun privacybeleid voor meer informatie.",
"camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.", "camera_permission_is_required": "Cameratoestemming is vereist.\nSchakel dit in via de app-instellingen.",
@ -175,6 +177,7 @@
"copy_address": "Adres kopiëren", "copy_address": "Adres kopiëren",
"copy_id": "ID kopiëren", "copy_id": "ID kopiëren",
"copyWalletConnectLink": "Kopieer de WalletConnect-link van dApp en plak deze hier", "copyWalletConnectLink": "Kopieer de WalletConnect-link van dApp en plak deze hier",
"corrupted_seed_notice": "De bestanden voor deze portemonnee zijn beschadigd en kunnen niet worden geopend. Bekijk de zaadzin, bewaar deze en herstel de portemonnee.\n\nAls de waarde leeg is, kon het zaad niet correct worden hersteld.",
"countries": "Landen", "countries": "Landen",
"create_account": "Account aanmaken", "create_account": "Account aanmaken",
"create_backup": "Maak een back-up", "create_backup": "Maak een back-up",

View file

@ -38,6 +38,7 @@
"agree_to": "Tworząc konto wyrażasz zgodę na ", "agree_to": "Tworząc konto wyrażasz zgodę na ",
"alert_notice": "Ogłoszenie", "alert_notice": "Ogłoszenie",
"all": "WSZYSTKO", "all": "WSZYSTKO",
"all_coins": "Wszystkie monety",
"all_trades": "Wszystkie operacje", "all_trades": "Wszystkie operacje",
"all_transactions": "Wszystkie transakcje", "all_transactions": "Wszystkie transakcje",
"alphabetical": "Alfabetyczny", "alphabetical": "Alfabetyczny",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Kupuj na całym świecie karty przedpłacone i karty podarunkowe", "cake_pay_web_cards_subtitle": "Kupuj na całym świecie karty przedpłacone i karty podarunkowe",
"cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_pay_web_cards_title": "Cake Pay Web Cards",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Przepraszam, ta karta podarunkowa nie jest dostępna na iOS. Zamiast tego możesz go kupić na Android lub za pośrednictwem naszej strony internetowej.",
"cakepay_prepaid_card": "Przedpłacona karta debetowa CakePay", "cakepay_prepaid_card": "Przedpłacona karta debetowa CakePay",
"camera_consent": "Twój aparat zostanie użyty do przechwycenia obrazu w celach identyfikacyjnych przez ${provider}. Aby uzyskać szczegółowe informacje, sprawdź ich Politykę prywatności.", "camera_consent": "Twój aparat zostanie użyty do przechwycenia obrazu w celach identyfikacyjnych przez ${provider}. Aby uzyskać szczegółowe informacje, sprawdź ich Politykę prywatności.",
"camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.", "camera_permission_is_required": "Wymagane jest pozwolenie na korzystanie z aparatu.\nWłącz tę funkcję w ustawieniach aplikacji.",
@ -175,6 +177,7 @@
"copy_address": "Skopiuj adress", "copy_address": "Skopiuj adress",
"copy_id": "skopiuj ID", "copy_id": "skopiuj ID",
"copyWalletConnectLink": "Skopiuj link do WalletConnect z dApp i wklej tutaj", "copyWalletConnectLink": "Skopiuj link do WalletConnect z dApp i wklej tutaj",
"corrupted_seed_notice": "Pliki dla tego portfela są uszkodzone i nie można ich otworzyć. Zobacz wyrażenie nasion, zapisz je i przywróć portfel.\n\nJeśli wartość jest pusta, ziarno nie można było poprawnie odzyskać.",
"countries": "Kraje", "countries": "Kraje",
"create_account": "Utwórz konto", "create_account": "Utwórz konto",
"create_backup": "Utwórz kopię zapasową", "create_backup": "Utwórz kopię zapasową",

View file

@ -38,6 +38,7 @@
"agree_to": "Ao criar conta você concorda com ", "agree_to": "Ao criar conta você concorda com ",
"alert_notice": "Perceber", "alert_notice": "Perceber",
"all": "TUDO", "all": "TUDO",
"all_coins": "Todas as moedas",
"all_trades": "Todas as negociações", "all_trades": "Todas as negociações",
"all_transactions": "Todas as transacções", "all_transactions": "Todas as transacções",
"alphabetical": "alfabética", "alphabetical": "alfabética",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Compre cartões pré-pagos e cartões-presente em todo o mundo", "cake_pay_web_cards_subtitle": "Compre cartões pré-pagos e cartões-presente em todo o mundo",
"cake_pay_web_cards_title": "Cartões Cake Pay Web", "cake_pay_web_cards_title": "Cartões Cake Pay Web",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Desculpe, este cartão -presente não está disponível no iOS. Você pode comprá -lo no Android ou através do nosso site.",
"cakepay_prepaid_card": "Cartão de débito pré-pago CakePay", "cakepay_prepaid_card": "Cartão de débito pré-pago CakePay",
"camera_consent": "Sua câmera será usada para capturar uma imagem para fins de identificação por ${provider}. Por favor, verifique a Política de Privacidade para obter detalhes.", "camera_consent": "Sua câmera será usada para capturar uma imagem para fins de identificação por ${provider}. Por favor, verifique a Política de Privacidade para obter detalhes.",
"camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.", "camera_permission_is_required": "É necessária permissão da câmera.\nAtive-o nas configurações do aplicativo.",
@ -175,6 +177,7 @@
"copy_address": "Copiar endereço", "copy_address": "Copiar endereço",
"copy_id": "Copiar ID", "copy_id": "Copiar ID",
"copyWalletConnectLink": "Copie o link WalletConnect do dApp e cole aqui", "copyWalletConnectLink": "Copie o link WalletConnect do dApp e cole aqui",
"corrupted_seed_notice": "Os arquivos para esta carteira estão corrompidos e não podem ser abertos. Veja a frase das sementes, salve -a e restaure a carteira.\n\nSe o valor estiver vazio, a semente não pôde ser recuperada corretamente.",
"countries": "Países", "countries": "Países",
"create_account": "Criar conta", "create_account": "Criar conta",
"create_backup": "Criar backup", "create_backup": "Criar backup",

View file

@ -38,6 +38,7 @@
"agree_to": "Создавая аккаунт, вы соглашаетесь с ", "agree_to": "Создавая аккаунт, вы соглашаетесь с ",
"alert_notice": "Уведомление", "alert_notice": "Уведомление",
"all": "ВСЕ", "all": "ВСЕ",
"all_coins": "Все монеты",
"all_trades": "Все сделки", "all_trades": "Все сделки",
"all_transactions": "Все транзакции", "all_transactions": "Все транзакции",
"alphabetical": "Алфавитный", "alphabetical": "Алфавитный",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Покупайте карты предоплаты и подарочные карты по всему миру", "cake_pay_web_cards_subtitle": "Покупайте карты предоплаты и подарочные карты по всему миру",
"cake_pay_web_cards_title": "Веб-карты Cake Pay", "cake_pay_web_cards_title": "Веб-карты Cake Pay",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Извините, эта подарочная карта недоступна на iOS. Вместо этого вы можете приобрести его на Android или через наш веб -сайт.",
"cakepay_prepaid_card": "Предоплаченная дебетовая карта CakePay", "cakepay_prepaid_card": "Предоплаченная дебетовая карта CakePay",
"camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации.", "camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации.",
"camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.", "camera_permission_is_required": "Требуется разрешение камеры.\nПожалуйста, включите его в настройках приложения.",
@ -175,6 +177,7 @@
"copy_address": "Cкопировать адрес", "copy_address": "Cкопировать адрес",
"copy_id": "Скопировать ID", "copy_id": "Скопировать ID",
"copyWalletConnectLink": "Скопируйте ссылку WalletConnect из dApp и вставьте сюда.", "copyWalletConnectLink": "Скопируйте ссылку WalletConnect из dApp и вставьте сюда.",
"corrupted_seed_notice": "Файлы для этого кошелька повреждены и не могут быть открыты. Пожалуйста, просмотрите семенную фразу, сохраните ее и восстановите кошелек.\n\nЕсли значение пустое, то семя не смог правильно восстановить.",
"countries": "Страны", "countries": "Страны",
"create_account": "Создать аккаунт", "create_account": "Создать аккаунт",
"create_backup": "Создать резервную копию", "create_backup": "Создать резервную копию",

View file

@ -38,6 +38,7 @@
"agree_to": "การสร้างบัญชีของคุณยอมรับเงื่อนไขของ", "agree_to": "การสร้างบัญชีของคุณยอมรับเงื่อนไขของ",
"alert_notice": "สังเกต", "alert_notice": "สังเกต",
"all": "ทั้งหมด", "all": "ทั้งหมด",
"all_coins": "เหรียญทั้งหมด",
"all_trades": "การซื้อขายทั้งหมด", "all_trades": "การซื้อขายทั้งหมด",
"all_transactions": "การทำธุรกรรมทั้งหมด", "all_transactions": "การทำธุรกรรมทั้งหมด",
"alphabetical": "ตามตัวอักษร", "alphabetical": "ตามตัวอักษร",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "ซื้อบัตรพร้อมเงินระดับโลกและบัตรของขวัญ", "cake_pay_web_cards_subtitle": "ซื้อบัตรพร้อมเงินระดับโลกและบัตรของขวัญ",
"cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_pay_web_cards_title": "Cake Pay Web Cards",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "ขออภัยบัตรของขวัญนี้ไม่มีใน iOS คุณสามารถซื้อได้บน Android หรือผ่านเว็บไซต์ของเราแทน",
"cakepay_prepaid_card": "บัตรเดบิตเติมเงินของ CakePay", "cakepay_prepaid_card": "บัตรเดบิตเติมเงินของ CakePay",
"camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด", "camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด",
"camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป", "camera_permission_is_required": "ต้องได้รับอนุญาตจากกล้อง\nโปรดเปิดใช้งานจากการตั้งค่าแอป",
@ -175,6 +177,7 @@
"copy_address": "คัดลอกที่อยู่", "copy_address": "คัดลอกที่อยู่",
"copy_id": "คัดลอก ID", "copy_id": "คัดลอก ID",
"copyWalletConnectLink": "คัดลอกลิงก์ WalletConnect จาก dApp แล้ววางที่นี่", "copyWalletConnectLink": "คัดลอกลิงก์ WalletConnect จาก dApp แล้ววางที่นี่",
"corrupted_seed_notice": "ไฟล์สำหรับกระเป๋าเงินนี้เสียหายและไม่สามารถเปิดได้ โปรดดูวลีเมล็ดบันทึกและกู้คืนกระเป๋าเงิน\n\nหากค่าว่างเปล่าเมล็ดก็ไม่สามารถกู้คืนได้อย่างถูกต้อง",
"countries": "ประเทศ", "countries": "ประเทศ",
"create_account": "สร้างบัญชี", "create_account": "สร้างบัญชี",
"create_backup": "สร้างการสำรองข้อมูล", "create_backup": "สร้างการสำรองข้อมูล",

View file

@ -38,6 +38,7 @@
"agree_to": "Sa pamamagitan ng paggawa ng account sumasang-ayon ka sa ", "agree_to": "Sa pamamagitan ng paggawa ng account sumasang-ayon ka sa ",
"alert_notice": "PAUNAWA", "alert_notice": "PAUNAWA",
"all": "LAHAT", "all": "LAHAT",
"all_coins": "Lahat ng mga barya",
"all_trades": "Lahat ng mga trade", "all_trades": "Lahat ng mga trade",
"all_transactions": "Lahat ng mga transaksyon", "all_transactions": "Lahat ng mga transaksyon",
"alphabetical": "Alpabeto", "alphabetical": "Alpabeto",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Bumili ng mga pandaigdigang prepaid card at gift card", "cake_pay_web_cards_subtitle": "Bumili ng mga pandaigdigang prepaid card at gift card",
"cake_pay_web_cards_title": "Cake Pay Web Cards", "cake_pay_web_cards_title": "Cake Pay Web Cards",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Paumanhin, ang gift card na ito ay hindi magagamit sa iOS. Maaari mo itong bilhin sa Android o sa pamamagitan ng aming website sa halip.",
"cakepay_prepaid_card": "CakePay Prepaid Debit Card", "cakepay_prepaid_card": "CakePay Prepaid Debit Card",
"camera_consent": "Gagamitin ang iyong camera upang kumuha ng larawan para sa mga layunin ng pagkakakilanlan sa pamamagitan ng ${provider}. Pakisuri ang kanilang Patakaran sa Privacy para sa mga detalye.", "camera_consent": "Gagamitin ang iyong camera upang kumuha ng larawan para sa mga layunin ng pagkakakilanlan sa pamamagitan ng ${provider}. Pakisuri ang kanilang Patakaran sa Privacy para sa mga detalye.",
"camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.", "camera_permission_is_required": "Kinakailangan ang pahintulot sa camera.\nMangyaring paganahin ito mula sa mga setting ng app.",
@ -175,6 +177,7 @@
"copy_address": "Kopyahin ang Address", "copy_address": "Kopyahin ang Address",
"copy_id": "Kopyahin ang ID", "copy_id": "Kopyahin ang ID",
"copyWalletConnectLink": "Kopyahin ang link ng WalletConnect mula sa dApp at i-paste dito", "copyWalletConnectLink": "Kopyahin ang link ng WalletConnect mula sa dApp at i-paste dito",
"corrupted_seed_notice": "Ang mga file para sa pitaka na ito ay nasira at hindi mabubuksan. Mangyaring tingnan ang parirala ng binhi, i -save ito, at ibalik ang pitaka.\n\nKung ang halaga ay walang laman, kung gayon ang binhi ay hindi ma -recover nang tama.",
"countries": "Mga bansa", "countries": "Mga bansa",
"create_account": "Lumikha ng Account", "create_account": "Lumikha ng Account",
"create_backup": "Lumikha ng backup", "create_backup": "Lumikha ng backup",

View file

@ -38,6 +38,7 @@
"agree_to": "Hesap oluşturarak bunları kabul etmiş olursunuz ", "agree_to": "Hesap oluşturarak bunları kabul etmiş olursunuz ",
"alert_notice": "Fark etme", "alert_notice": "Fark etme",
"all": "HEPSİ", "all": "HEPSİ",
"all_coins": "Tüm Paralar",
"all_trades": "Tüm takaslar", "all_trades": "Tüm takaslar",
"all_transactions": "Tüm transferler", "all_transactions": "Tüm transferler",
"alphabetical": "Alfabetik", "alphabetical": "Alfabetik",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Dünya çapında ön ödemeli kartlar ve hediye kartları satın alın", "cake_pay_web_cards_subtitle": "Dünya çapında ön ödemeli kartlar ve hediye kartları satın alın",
"cake_pay_web_cards_title": "Cake Pay Web Kartları", "cake_pay_web_cards_title": "Cake Pay Web Kartları",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Üzgünüm, bu hediye kartı iOS'ta mevcut değil. Bunun yerine Android'de veya web sitemizden satın alabilirsiniz.",
"cakepay_prepaid_card": "CakePay Ön Ödemeli Kart", "cakepay_prepaid_card": "CakePay Ön Ödemeli Kart",
"camera_consent": "Kameranız ${provider} tarihine kadar tanımlama amacıyla bir görüntü yakalamak için kullanılacaktır. Ayrıntılar için lütfen Gizlilik Politikalarını kontrol edin.", "camera_consent": "Kameranız ${provider} tarihine kadar tanımlama amacıyla bir görüntü yakalamak için kullanılacaktır. Ayrıntılar için lütfen Gizlilik Politikalarını kontrol edin.",
"camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.", "camera_permission_is_required": "Kamera izni gereklidir.\nLütfen uygulama ayarlarından etkinleştirin.",
@ -175,6 +177,7 @@
"copy_address": "Adresi kopyala", "copy_address": "Adresi kopyala",
"copy_id": "ID'yi kopyala", "copy_id": "ID'yi kopyala",
"copyWalletConnectLink": "WalletConnect bağlantısını dApp'ten kopyalayıp buraya yapıştırın", "copyWalletConnectLink": "WalletConnect bağlantısını dApp'ten kopyalayıp buraya yapıştırın",
"corrupted_seed_notice": "Bu cüzdanın dosyaları bozuk ve açılamıyor. Lütfen tohum ifadesini görüntüleyin, kaydedin ve cüzdanı geri yükleyin.\n\nDeğer boşsa, tohum doğru bir şekilde geri kazanılamadı.",
"countries": "Ülkeler", "countries": "Ülkeler",
"create_account": "Hesap oluştur", "create_account": "Hesap oluştur",
"create_backup": "Yedek oluştur", "create_backup": "Yedek oluştur",

View file

@ -38,6 +38,7 @@
"agree_to": "Створюючи обліковий запис, ви погоджуєтеся з ", "agree_to": "Створюючи обліковий запис, ви погоджуєтеся з ",
"alert_notice": "Ув'язнення", "alert_notice": "Ув'язнення",
"all": "ВСЕ", "all": "ВСЕ",
"all_coins": "Всі монети",
"all_trades": "Всі операції", "all_trades": "Всі операції",
"all_transactions": "Всі транзакції", "all_transactions": "Всі транзакції",
"alphabetical": "Алфавітний", "alphabetical": "Алфавітний",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Купуйте передоплачені та подарункові картки по всьому світу", "cake_pay_web_cards_subtitle": "Купуйте передоплачені та подарункові картки по всьому світу",
"cake_pay_web_cards_title": "Веб-картки Cake Pay", "cake_pay_web_cards_title": "Веб-картки Cake Pay",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Вибачте, ця подарункова карта недоступна на iOS. Ви можете придбати його на Android або через наш веб -сайт.",
"cakepay_prepaid_card": "Передплачена дебетова картка CakePay", "cakepay_prepaid_card": "Передплачена дебетова картка CakePay",
"camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше.", "camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше.",
"camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.", "camera_permission_is_required": "Потрібен дозвіл камери.\nУвімкніть його в налаштуваннях програми.",
@ -175,6 +177,7 @@
"copy_address": "Cкопіювати адресу", "copy_address": "Cкопіювати адресу",
"copy_id": "Скопіювати ID", "copy_id": "Скопіювати ID",
"copyWalletConnectLink": "Скопіюйте посилання WalletConnect із dApp і вставте сюди", "copyWalletConnectLink": "Скопіюйте посилання WalletConnect із dApp і вставте сюди",
"corrupted_seed_notice": "Файли для цього гаманця пошкоджені і не можуть бути відкриті. Перегляньте насіннєву фразу, збережіть її та відновіть гаманець.\n\nЯкщо значення порожнє, то насіння не могло бути правильно відновленим.",
"countries": "Країни", "countries": "Країни",
"create_account": "Створити обліковий запис", "create_account": "Створити обліковий запис",
"create_backup": "Створити резервну копію", "create_backup": "Створити резервну копію",

View file

@ -38,6 +38,7 @@
"agree_to": "اکاؤنٹ بنا کر آپ اس سے اتفاق کرتے ہیں۔", "agree_to": "اکاؤنٹ بنا کر آپ اس سے اتفاق کرتے ہیں۔",
"alert_notice": "نوٹس", "alert_notice": "نوٹس",
"all": "تمام", "all": "تمام",
"all_coins": "تمام سکے",
"all_trades": "تمام تجارت", "all_trades": "تمام تجارت",
"all_transactions": "تمام لین دین", "all_transactions": "تمام لین دین",
"alphabetical": "حروف تہجی کے مطابق", "alphabetical": "حروف تہجی کے مطابق",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "دنیا بھر میں پری پیڈ کارڈز اور گفٹ کارڈز خریدیں۔", "cake_pay_web_cards_subtitle": "دنیا بھر میں پری پیڈ کارڈز اور گفٹ کارڈز خریدیں۔",
"cake_pay_web_cards_title": "Cake پے ویب کارڈز", "cake_pay_web_cards_title": "Cake پے ویب کارڈز",
"cake_wallet": "Cake والیٹ", "cake_wallet": "Cake والیٹ",
"cakepay_ios_not_available": "معذرت ، یہ گفٹ کارڈ iOS پر دستیاب نہیں ہے۔ اس کے بجائے آپ اسے اینڈروئیڈ پر یا ہماری ویب سائٹ کے ذریعے خرید سکتے ہیں۔",
"cakepay_prepaid_card": "Cake پے پری پیڈ ڈیبٹ کارڈ", "cakepay_prepaid_card": "Cake پے پری پیڈ ڈیبٹ کارڈ",
"camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ", "camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ",
"camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ", "camera_permission_is_required": "۔ﮯﮨ ﺭﺎﮐﺭﺩ ﺕﺯﺎﺟﺍ ﯽﮐ ﮮﺮﻤﯿﮐ",
@ -175,6 +177,7 @@
"copy_address": "ایڈریس کاپی کریں۔", "copy_address": "ایڈریس کاپی کریں۔",
"copy_id": "کاپی ID", "copy_id": "کاپی ID",
"copyWalletConnectLink": "dApp ﮯﺳ WalletConnect ۔ﮟﯾﺮﮐ ﭧﺴﯿﭘ ﮞﺎﮩﯾ ﺭﻭﺍ ﮟﯾﺮﮐ ﯽﭘﺎﮐ ﻮﮐ ﮏﻨﻟ", "copyWalletConnectLink": "dApp ﮯﺳ WalletConnect ۔ﮟﯾﺮﮐ ﭧﺴﯿﭘ ﮞﺎﮩﯾ ﺭﻭﺍ ﮟﯾﺮﮐ ﯽﭘﺎﮐ ﻮﮐ ﮏﻨﻟ",
"corrupted_seed_notice": "اس پرس کے لئے فائلیں خراب ہیں اور کھولنے سے قاصر ہیں۔ براہ کرم بیج کے فقرے کو دیکھیں ، اسے بچائیں ، اور بٹوے کو بحال کریں۔\n\nاگر قیمت خالی ہے ، تو بیج صحیح طور پر بازیافت کرنے سے قاصر تھا۔",
"countries": "ممالک", "countries": "ممالک",
"create_account": "اکاؤنٹ بنائیں", "create_account": "اکاؤنٹ بنائیں",
"create_backup": "بیک اپ بنائیں", "create_backup": "بیک اپ بنائیں",

View file

@ -38,6 +38,7 @@
"agree_to": "Bằng cách tạo tài khoản, bạn đồng ý với ", "agree_to": "Bằng cách tạo tài khoản, bạn đồng ý với ",
"alert_notice": "Để ý", "alert_notice": "Để ý",
"all": "TẤT CẢ", "all": "TẤT CẢ",
"all_coins": "Tất cả các đồng tiền",
"all_trades": "Tất cả giao dịch", "all_trades": "Tất cả giao dịch",
"all_transactions": "Tất cả giao dịch", "all_transactions": "Tất cả giao dịch",
"alphabetical": "Theo thứ tự chữ cái", "alphabetical": "Theo thứ tự chữ cái",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Mua thẻ trả trước toàn cầu và thẻ quà tặng", "cake_pay_web_cards_subtitle": "Mua thẻ trả trước toàn cầu và thẻ quà tặng",
"cake_pay_web_cards_title": "Thẻ Cake Pay Web", "cake_pay_web_cards_title": "Thẻ Cake Pay Web",
"cake_wallet": "Ví Cake", "cake_wallet": "Ví Cake",
"cakepay_ios_not_available": "Xin lỗi, thẻ quà tặng này không có sẵn trên iOS. Thay vào đó, bạn có thể mua nó trên Android hoặc thông qua trang web của chúng tôi.",
"cakepay_prepaid_card": "Thẻ Ghi Nợ Trả Trước CakePay", "cakepay_prepaid_card": "Thẻ Ghi Nợ Trả Trước CakePay",
"camera_consent": "Máy ảnh của bạn sẽ được sử dụng để chụp hình nhằm mục đích xác minh danh tính bởi ${provider}. Vui lòng kiểm tra Chính sách quyền riêng tư của họ để biết thêm chi tiết.", "camera_consent": "Máy ảnh của bạn sẽ được sử dụng để chụp hình nhằm mục đích xác minh danh tính bởi ${provider}. Vui lòng kiểm tra Chính sách quyền riêng tư của họ để biết thêm chi tiết.",
"camera_permission_is_required": "Cần có quyền truy cập máy ảnh. \nVui lòng bật nó từ cài đặt ứng dụng.", "camera_permission_is_required": "Cần có quyền truy cập máy ảnh. \nVui lòng bật nó từ cài đặt ứng dụng.",
@ -174,6 +176,7 @@
"copy_address": "Sao chép Địa chỉ", "copy_address": "Sao chép Địa chỉ",
"copy_id": "Sao chép ID", "copy_id": "Sao chép ID",
"copyWalletConnectLink": "Sao chép liên kết WalletConnect từ dApp và dán vào đây", "copyWalletConnectLink": "Sao chép liên kết WalletConnect từ dApp và dán vào đây",
"corrupted_seed_notice": "Các tệp cho ví này bị hỏng và không thể mở. Vui lòng xem cụm từ hạt giống, lưu nó và khôi phục ví.\n\nNếu giá trị trống, thì hạt giống không thể được phục hồi chính xác.",
"countries": "Quốc gia", "countries": "Quốc gia",
"create_account": "Tạo tài khoản", "create_account": "Tạo tài khoản",
"create_backup": "Tạo sao lưu", "create_backup": "Tạo sao lưu",

View file

@ -38,6 +38,7 @@
"agree_to": "Tẹ́ ẹ bá dá àkáǹtì ẹ jọ rò ", "agree_to": "Tẹ́ ẹ bá dá àkáǹtì ẹ jọ rò ",
"alert_notice": "Akiyesi", "alert_notice": "Akiyesi",
"all": "Gbogbo", "all": "Gbogbo",
"all_coins": "Gbogbo awọn owó",
"all_trades": "Gbogbo àwọn pàṣípààrọ̀", "all_trades": "Gbogbo àwọn pàṣípààrọ̀",
"all_transactions": "Gbogbo àwọn àránṣẹ́", "all_transactions": "Gbogbo àwọn àránṣẹ́",
"alphabetical": "Labidibi", "alphabetical": "Labidibi",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "Ra àwọn káàdì ìrajà t'á lò nínú ìtajà kan àti àwọn káàdì náà t'á lè lò níbikíbi", "cake_pay_web_cards_subtitle": "Ra àwọn káàdì ìrajà t'á lò nínú ìtajà kan àti àwọn káàdì náà t'á lè lò níbikíbi",
"cake_pay_web_cards_title": "Àwọn káàdì wẹ́ẹ̀bù ti Cake Pay", "cake_pay_web_cards_title": "Àwọn káàdì wẹ́ẹ̀bù ti Cake Pay",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "Ma binu, kaadi ẹbun yii ko wa lori iOS. O le ra lori Android tabi nipasẹ oju opo wẹẹbu wa dipo.",
"cakepay_prepaid_card": "Káàdì ìrajà ti CakePay", "cakepay_prepaid_card": "Káàdì ìrajà ti CakePay",
"camera_consent": "Kamẹra rẹ yoo ṣee lo lati ya aworan kan fun awọn idi idanimọ nipasẹ ${provider}. Jọwọ ṣayẹwo Ilana Aṣiri wọn fun awọn alaye.", "camera_consent": "Kamẹra rẹ yoo ṣee lo lati ya aworan kan fun awọn idi idanimọ nipasẹ ${provider}. Jọwọ ṣayẹwo Ilana Aṣiri wọn fun awọn alaye.",
"camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.", "camera_permission_is_required": "A nilo igbanilaaye kamẹra.\nJọwọ jeki o lati app eto.",
@ -175,6 +177,7 @@
"copy_address": "Ṣẹ̀dà àdírẹ́sì", "copy_address": "Ṣẹ̀dà àdírẹ́sì",
"copy_id": "Ṣẹ̀dà àmì ìdánimọ̀", "copy_id": "Ṣẹ̀dà àmì ìdánimọ̀",
"copyWalletConnectLink": "Daakọ ọna asopọ WalletConnect lati dApp ki o si lẹẹmọ nibi", "copyWalletConnectLink": "Daakọ ọna asopọ WalletConnect lati dApp ki o si lẹẹmọ nibi",
"corrupted_seed_notice": "Awọn faili fun apamọwọ yii jẹ ibajẹ ati pe ko lagbara lati ṣii. Jọwọ wo ọrọ iseda, fipamọ rẹ, ki o mu apamọwọ naa pada.\n\nTi iye ba ṣofo, lẹhinna irugbin naa ko lagbara lati gba pada ni deede.",
"countries": "Awọn orilẹ-ede", "countries": "Awọn orilẹ-ede",
"create_account": "Dá àkáǹtì", "create_account": "Dá àkáǹtì",
"create_backup": "Ṣẹ̀dà nípamọ́", "create_backup": "Ṣẹ̀dà nípamọ́",

View file

@ -38,6 +38,7 @@
"agree_to": "创建账户即表示您同意 ", "agree_to": "创建账户即表示您同意 ",
"alert_notice": "注意", "alert_notice": "注意",
"all": "全部", "all": "全部",
"all_coins": "所有硬币",
"all_trades": "所有的变化", "all_trades": "所有的变化",
"all_transactions": "所有交易", "all_transactions": "所有交易",
"alphabetical": "按字母顺序", "alphabetical": "按字母顺序",
@ -101,6 +102,7 @@
"cake_pay_web_cards_subtitle": "购买全球预付卡和礼品卡", "cake_pay_web_cards_subtitle": "购买全球预付卡和礼品卡",
"cake_pay_web_cards_title": "蛋糕支付网络卡", "cake_pay_web_cards_title": "蛋糕支付网络卡",
"cake_wallet": "Cake Wallet", "cake_wallet": "Cake Wallet",
"cakepay_ios_not_available": "抱歉这张礼品卡在iOS上不可用。您可以在Android或通过我们的网站上购买它。",
"cakepay_prepaid_card": "CakePay 预付借记卡", "cakepay_prepaid_card": "CakePay 预付借记卡",
"camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。", "camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。",
"camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。", "camera_permission_is_required": "需要相机许可。\n请从应用程序设置中启用它。",
@ -175,6 +177,7 @@
"copy_address": "复制地址", "copy_address": "复制地址",
"copy_id": "复制ID", "copy_id": "复制ID",
"copyWalletConnectLink": "从 dApp 复制 WalletConnect 链接并粘贴到此处", "copyWalletConnectLink": "从 dApp 复制 WalletConnect 链接并粘贴到此处",
"corrupted_seed_notice": "该钱包的文件被损坏,无法打开。请查看种子短语,保存并恢复钱包。\n\n如果该值为空则种子无法正确恢复。",
"countries": "国家", "countries": "国家",
"create_account": "创建账户", "create_account": "创建账户",
"create_backup": "创建备份", "create_backup": "创建备份",

View file

@ -14,7 +14,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST
sp_scanner
) )
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)