Updated on 2026-08-14

This commit is contained in:
Tangem 2022-02-28 11:09:03 +00:00
commit b5bbf6e8d9
18 changed files with 259 additions and 229 deletions

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">DebugTangem</string>
</resources>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">BetaTangem</string>
</resources>

View file

@ -3,6 +3,20 @@ package com.tangem.tap.common.extensions
/**
[REDACTED_AUTHOR]
*/
fun StringBuilder.appendIf(value: String, predicate: (String) -> Boolean) {
fun StringBuilder.appendIf(value: String, predicate: (String) -> Boolean): StringBuilder {
if (predicate(value)) this.append(value)
return this
}
fun StringBuilder.appendIfNotNull(value: String?, prefix: String? = null, postfix: String? = null): StringBuilder {
if (value == null) return this
prefix?.let { append(it) }
append(value)
postfix?.let { append(it) }
return this
}
fun String.appendIfNotNull(value: String?, prefix: String? = null, postfix: String? = null): String {
return StringBuilder(this).apply { appendIfNotNull(value, prefix, postfix) }.toString()
}

View file

@ -1,5 +1,6 @@
package com.tangem.tap.common.redux
import com.tangem.common.extensions.VoidCallback
import com.tangem.tap.features.wallet.redux.AddressData
import com.tangem.tap.features.wallet.redux.Currency
@ -9,8 +10,8 @@ import com.tangem.tap.features.wallet.redux.Currency
interface StateDialog
sealed class AppDialog : StateDialog {
data class SimpleOkDialog(val header: String, val message: String) : AppDialog()
data class SimpleOkDialogRes(val headerId: Int, val messageId: Int) : AppDialog()
data class SimpleOkDialog(val header: String, val message: String, val onOk: VoidCallback? = null) : AppDialog()
data class SimpleOkDialogRes(val headerId: Int, val messageId: Int, val onOk: VoidCallback? = null) : AppDialog()
object ScanFailsDialog : AppDialog()
data class AddressInfoDialog(
val currency: Currency,

View file

@ -1,9 +1,12 @@
package com.tangem.tap.domain
import com.tangem.blockchain.blockchains.solana.RentProvider
import com.tangem.blockchain.common.*
import com.tangem.common.services.Result
import com.tangem.tap.common.extensions.dispatchDebugErrorNotification
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.safeUpdate
import com.tangem.tap.common.extensions.stripZeroPlainString
import com.tangem.tap.common.redux.global.FiatCurrencyName
import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.currenciesRepository
@ -15,12 +18,16 @@ import com.tangem.tap.domain.extensions.makeWalletManagersForApp
import com.tangem.tap.domain.tasks.product.ScanResponse
import com.tangem.tap.domain.tokens.CardCurrencies
import com.tangem.tap.features.demo.isDemoCard
import com.tangem.tap.features.wallet.models.PendingTransactionType
import com.tangem.tap.features.wallet.models.getPendingTransactions
import com.tangem.tap.features.wallet.redux.Currency
import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.network.NetworkConnectivity
import com.tangem.tap.network.coinmarketcap.CoinMarketCapService
import com.tangem.tap.scope
import com.tangem.tap.store
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.math.BigDecimal
@ -32,7 +39,7 @@ class TapWalletManager {
store.state.globalState.configManager?.config?.blockchainSdkConfig ?: BlockchainSdkConfig()
}
val walletManagerFactory: WalletManagerFactory
by lazy { WalletManagerFactory(blockchainSdkConfig) }
by lazy { WalletManagerFactory(blockchainSdkConfig) }
suspend fun loadWalletData(walletManager: WalletManager) {
handleUpdateWalletResult(walletManager.safeUpdate(), walletManager)
@ -53,8 +60,8 @@ class TapWalletManager {
suspend fun loadFiatRate(fiatCurrency: FiatCurrencyName, wallet: Wallet) {
val currencies = wallet.getTokens()
.map { Currency.Token(it) }
.plus(Currency.Blockchain(wallet.blockchain))
.map { Currency.Token(it) }
.plus(Currency.Blockchain(wallet.blockchain))
loadFiatRate(fiatCurrency, currencies)
}
@ -91,7 +98,7 @@ class TapWalletManager {
configManager?.turnOff(ConfigManager.isSendingToPayIdEnabled)
configManager?.turnOff(ConfigManager.isTopUpEnabled)
} else if (blockchain == Blockchain.Bitcoin
|| data.walletData?.blockchain == Blockchain.Bitcoin.id) {
|| data.walletData?.blockchain == Blockchain.Bitcoin.id) {
configManager?.resetToDefault(ConfigManager.isSendingToPayIdEnabled)
configManager?.resetToDefault(ConfigManager.isTopUpEnabled)
} else {
@ -158,7 +165,7 @@ class TapWalletManager {
CardCurrencies(blockchains = blockchains, tokens = emptyList())
))
val walletManagers =
walletManagerFactory.makeWalletManagersForApp(scanResponse, blockchains.toList())
walletManagerFactory.makeWalletManagersForApp(scanResponse, blockchains.toList())
store.dispatch(WalletAction.MultiWallet.AddWalletManagers(walletManagers))
store.dispatch(WalletAction.MultiWallet.AddBlockchains(blockchains.toList()))
}
@ -167,12 +174,12 @@ class TapWalletManager {
} else {
val blockchains = savedCurrencies.blockchains.toList()
val walletManagers = if (
primaryTokens.isNotEmpty() &&
primaryWalletManager != null && primaryBlockchain != null
primaryTokens.isNotEmpty() &&
primaryWalletManager != null && primaryBlockchain != null
) {
val blockchainsWithoutPrimary = blockchains.filterNot { it == primaryBlockchain }
walletManagerFactory.makeWalletManagersForApp(scanResponse, blockchainsWithoutPrimary)
.plus(primaryWalletManager)
.plus(primaryWalletManager)
} else {
walletManagerFactory.makeWalletManagersForApp(scanResponse, blockchains)
}
@ -222,7 +229,10 @@ class TapWalletManager {
private suspend fun handleUpdateWalletResult(result: Result<Wallet>, walletManager: WalletManager) {
withContext(Dispatchers.Main) {
when (result) {
is Result.Success -> store.dispatch(WalletAction.LoadWallet.Success(result.data))
is Result.Success -> {
checkForRentWarning(walletManager)
store.dispatch(WalletAction.LoadWallet.Success(result.data))
}
is Result.Failure -> {
val error = (result.error as? TapError) ?: TapError.UnknownError
when (error) {
@ -231,11 +241,11 @@ class TapWalletManager {
}
is TapError.WalletManagerUpdate.NoAccountError -> {
store.dispatch(WalletAction.LoadWallet
.NoAccount(walletManager.wallet, error.customMessage))
.NoAccount(walletManager.wallet, error.customMessage))
}
is TapError.WalletManagerUpdate.InternalError -> {
store.dispatch(WalletAction.LoadWallet
.Failure(walletManager.wallet, error.customMessage))
.Failure(walletManager.wallet, error.customMessage))
}
else -> {
store.dispatchDebugErrorNotification(error)
@ -246,6 +256,38 @@ class TapWalletManager {
}
}
private fun checkForRentWarning(walletManager: WalletManager) {
val rentProvider = walletManager as? RentProvider ?: return
scope.launch {
when (val result = rentProvider.minimalBalanceForRentExemption()) {
is com.tangem.blockchain.extensions.Result.Success -> {
fun isNeedToShowWarning(balance: BigDecimal, rentExempt: BigDecimal): Boolean = balance < rentExempt
val balance = walletManager.wallet.fundsAvailable(AmountType.Coin)
val outgoingTxs = walletManager.wallet.getPendingTransactions(PendingTransactionType.Outgoing)
val rentExempt = result.data
val show = if (outgoingTxs.isEmpty()) {
isNeedToShowWarning(balance, rentExempt)
} else {
val outgoingAmount = outgoingTxs.sumOf { it.amount ?: BigDecimal.ZERO }
val rest = balance.minus(outgoingAmount)
isNeedToShowWarning(rest, rentExempt)
}
if (!show) return@launch
val currency = walletManager.wallet.blockchain.currency
store.dispatchOnMain(WalletAction.SetWalletRent(
blockchain = walletManager.wallet.blockchain,
minRent = ("${rentProvider.rentAmount().stripZeroPlainString()} $currency"),
rentExempt = ("${rentExempt.stripZeroPlainString()} $currency")
))
}
is com.tangem.blockchain.extensions.Result.Failure -> {}
}
}
}
private suspend fun handleFiatRatesResult(results: List<Pair<Currency, Result<BigDecimal>?>>) {
withContext(Dispatchers.Main) {
results.map {

View file

@ -1,8 +1,10 @@
package com.tangem.tap.features.demo
import com.tangem.blockchain.blockchains.bitcoin.BitcoinWalletManager
import com.tangem.blockchain.common.*
import com.tangem.blockchain.extensions.Result
import com.tangem.blockchain.extensions.SimpleResult
import com.tangem.common.CompletionResult
import com.tangem.tap.common.extensions.dispatchNotification
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.domain.tasks.product.ScanResponse
@ -165,13 +167,26 @@ class DemoTransactionSender(
private val sender: TransactionSender = walletManager as TransactionSender
) : TransactionSender {
override suspend fun getFee(amount: Amount, destination: String): Result<List<Amount>> =
sender.getFee(amount, destination)
override suspend fun getFee(amount: Amount, destination: String): Result<List<Amount>> {
val blockchain = walletManager.wallet.blockchain
return when (walletManager) {
is BitcoinWalletManager -> Result.Success(listOf(
Amount(0.0001.toBigDecimal(), blockchain),
Amount(0.0003.toBigDecimal(), blockchain),
Amount(0.00055.toBigDecimal(), blockchain),
))
else -> sender.getFee(amount, destination)
}
}
override suspend fun send(transactionData: TransactionData, signer: TransactionSigner): SimpleResult {
val dataToSign = randomString(32).toByteArray()
val signerResponse = signer.sign(dataToSign, walletManager.wallet.cardId, walletManager.wallet.publicKey)
return SimpleResult.Failure(Exception(ID))
return when (signerResponse) {
is CompletionResult.Success -> SimpleResult.Failure(Exception(ID))
is CompletionResult.Failure -> SimpleResult.fromTangemSdkError(signerResponse.error)
}
}
private fun randomInt(from: Int, to: Int): Int = kotlin.random.Random.nextInt(from, to)

View file

@ -6,6 +6,8 @@ import com.tangem.blockchain.common.TransactionSender
import com.tangem.blockchain.extensions.Result
import com.tangem.common.extensions.isZero
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.features.demo.DemoTransactionSender
import com.tangem.tap.features.demo.isDemoWallet
import com.tangem.tap.features.send.redux.AmountActionUi
import com.tangem.tap.features.send.redux.FeeAction
import com.tangem.tap.features.send.redux.ReceiptAction
@ -38,7 +40,11 @@ class RequestFeeMiddleware {
val destinationAddress = sendState.addressPayIdState.destinationWalletAddress!!
val destinationAmount = Amount(typedAmount, sendState.amountState.amountToSendCrypto)
val txSender = walletManager as TransactionSender
val txSender = if (walletManager.isDemoWallet()) {
DemoTransactionSender(walletManager)
} else {
walletManager as TransactionSender
}
scope.launch {
val feeResult = txSender.getFee(destinationAmount, destinationAddress)
withContext(Dispatchers.Main) {
@ -84,15 +90,15 @@ class FeeMock {
suspend fun feeZero(blockchain: Blockchain): List<Amount> = listOf(Amount(BigDecimal.ZERO, blockchain))
suspend fun feeStandard(blockchain: Blockchain): List<Amount> = listOf(
Amount(0.001500.toBigDecimal(), blockchain),
Amount(0.0030.toBigDecimal(), blockchain),
Amount(0.0045001.toBigDecimal(), blockchain)
Amount(0.001500.toBigDecimal(), blockchain),
Amount(0.0030.toBigDecimal(), blockchain),
Amount(0.0045001.toBigDecimal(), blockchain)
)
suspend fun feeStandardBig(blockchain: Blockchain): List<Amount> = listOf(
Amount(1.76.toBigDecimal(), blockchain),
Amount(2.30.toBigDecimal(), blockchain),
Amount(3.45.toBigDecimal(), blockchain)
Amount(1.76.toBigDecimal(), blockchain),
Amount(2.30.toBigDecimal(), blockchain),
Amount(3.45.toBigDecimal(), blockchain)
)
suspend fun feeSingle(blockchain: Blockchain): List<Amount> = listOf(Amount(0.0015.toBigDecimal(), blockchain))

View file

@ -246,10 +246,11 @@ private fun sendTransaction(
dispatch(SendAction.SendError(TapError.XmlError.AssetAccountNotCreated))
}
message.contains(DemoTransactionSender.ID) -> {
delay(DELAY_SDK_DIALOG_CLOSE)
store.dispatchDialogShow(AppDialog.SimpleOkDialogRes(
R.string.common_done,
R.string.alert_demo_tx_send
))
R.string.alert_demo_feature_disabled
) { dispatch(NavigationAction.PopBackTo()) })
}
else -> {
(sendResult.error as? TangemSdkError)?.let { error ->

View file

@ -1,12 +1,10 @@
package com.tangem.tap.features.wallet.redux.middlewares
import com.tangem.blockchain.blockchains.solana.RentProvider
import com.tangem.blockchain.common.*
import com.tangem.blockchain.extensions.Result
import com.tangem.common.extensions.isZero
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.safeUpdate
import com.tangem.tap.common.extensions.stripZeroPlainString
import com.tangem.tap.common.redux.global.GlobalState
import com.tangem.tap.common.redux.navigation.AppScreen
import com.tangem.tap.common.redux.navigation.NavigationAction
@ -15,8 +13,6 @@ import com.tangem.tap.domain.extensions.makeWalletManagerForApp
import com.tangem.tap.domain.extensions.makeWalletManagersForApp
import com.tangem.tap.features.demo.DemoHelper
import com.tangem.tap.features.demo.isDemoCard
import com.tangem.tap.features.wallet.models.PendingTransactionType
import com.tangem.tap.features.wallet.models.getPendingTransactions
import com.tangem.tap.features.wallet.redux.Currency
import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.features.wallet.redux.WalletState
@ -38,7 +34,6 @@ class MultiWalletMiddleware {
when (action) {
is WalletAction.MultiWallet.AddWalletManagers -> {
globalState.feedbackManager?.infoHolder?.setWalletsInfo(action.walletManagers)
action.walletManagers.forEach { checkForRentWarning(it) }
if (globalState.scanResponse?.isDemoCard() == true) {
addDummyBalances(action.walletManagers)
}
@ -213,38 +208,6 @@ class MultiWalletMiddleware {
}
}
private fun checkForRentWarning(walletManager: WalletManager) {
val rentProvider = walletManager as? RentProvider ?: return
scope.launch {
when (val result = rentProvider.minimalBalanceForRentExemption()) {
is Result.Success -> {
fun isNeedToShowWarning(balance: BigDecimal, rentExempt: BigDecimal): Boolean = balance >= rentExempt
val balance = walletManager.wallet.fundsAvailable(AmountType.Coin)
val outgoingTxs = walletManager.wallet.getPendingTransactions(PendingTransactionType.Outgoing)
val rentExempt = result.data
val show = if (outgoingTxs.isEmpty()) {
isNeedToShowWarning(balance, rentExempt)
} else {
val outgoingAmount = outgoingTxs.sumOf { it.amount ?: BigDecimal.ZERO }
val rest = balance.minus(outgoingAmount)
isNeedToShowWarning(rest, rentExempt)
}
if (!show) return@launch
val currency = walletManager.wallet.blockchain.currency
store.dispatchOnMain(WalletAction.SetWalletRent(
blockchain = walletManager.wallet.blockchain,
minRent = ("${rentProvider.rentAmount().stripZeroPlainString()} $currency"),
rentExempt = ("${rentExempt.stripZeroPlainString()} $currency")
))
}
is Result.Failure -> {}
}
}
}
private fun addTokens(
tokens: List<Token>,
walletState: WalletState?,

View file

@ -3,8 +3,10 @@ package com.tangem.tap.features.wallet.ui
import android.app.Dialog
import android.os.Bundle
import android.view.*
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.annotation.IdRes
import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
@ -228,45 +230,38 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details),
private fun setupBalanceData(data: BalanceWidgetData) = with(binding.lWalletDetails) {
when (data.status) {
BalanceStatus.Loading -> {
lBalance.root.show()
lBalanceError.root.hide()
lBalance.tvFiatAmount.hide()
lBalance.tvAmount.text = ""
showStatus(R.id.tv_status_loading)
showBalanceWithoutToken(data, false)
lBalance.root.show()
lBalance.groupBalance.show()
lBalance.tvError.hide()
lBalance.tvAmount.text = data.amount
lBalance.tvFiatAmount.text = data.fiatAmountFormatted
lBalance.tvStatus.setLoadingStatus(R.string.wallet_balance_loading)
}
BalanceStatus.VerifiedOnline, BalanceStatus.SameCurrencyTransactionInProgress,
BalanceStatus.TransactionInProgress -> {
lBalance.root.show()
lBalanceError.root.hide()
val statusView = if (data.status == BalanceStatus.VerifiedOnline ||
data.status == BalanceStatus.SameCurrencyTransactionInProgress
) {
R.id.tv_status_verified
} else {
lBalance.tvStatusError.text =
getText(R.string.wallet_balance_tx_in_progress)
R.id.group_error
lBalance.root.show()
lBalance.groupBalance.show()
lBalance.tvError.hide()
lBalance.tvAmount.text = data.amount
lBalance.tvFiatAmount.text = data.fiatAmountFormatted
when (data.status) {
BalanceStatus.VerifiedOnline, BalanceStatus.SameCurrencyTransactionInProgress -> {
lBalance.tvStatus.setVerifiedBalanceStatus(R.string.wallet_balance_verified)
}
else -> {
lBalance.tvStatus.setWarningStatus(R.string.wallet_balance_tx_in_progress)
}
}
showStatus(statusView)
lBalance.tvStatusErrorMessage.hide()
showBalanceWithoutToken(data, true)
}
BalanceStatus.Unreachable -> {
lBalance.root.show()
lBalanceError.root.hide()
lBalance.tvFiatAmount.hide()
lBalance.tvAmount.text = ""
lBalance.tvStatusErrorMessage.text = data.errorMessage
lBalance.tvStatusError.text =
getString(R.string.wallet_balance_blockchain_unreachable)
showStatus(R.id.group_error)
lBalance.tvStatusErrorMessage.show(!data.errorMessage.isNullOrBlank())
lBalance.root.show()
lBalance.groupBalance.hide()
lBalance.tvError.show()
lBalance.tvError.setWarningStatus(R.string.wallet_balance_blockchain_unreachable, data.errorMessage)
}
BalanceStatus.NoAccount -> {
lBalance.root.hide()
lBalanceError.root.show()
@ -281,24 +276,6 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details),
binding.cardPendingTransactionWarning.show(data.status == BalanceStatus.SameCurrencyTransactionInProgress)
}
private fun showStatus(@IdRes viewRes: Int) {
with(binding.lWalletDetails.lBalance) {
groupError.show(viewRes == R.id.group_error)
tvStatusLoading.show(viewRes == R.id.tv_status_loading)
tvStatusVerified.show(viewRes == R.id.tv_status_verified)
}
}
private fun showBalanceWithoutToken(data: BalanceWidgetData, showAmount: Boolean) {
with(binding.lWalletDetails.lBalance) {
tvAmount.text = if (showAmount) data.amount else ""
if (showAmount) {
tvFiatAmount.show()
tvFiatAmount.text = data.fiatAmountFormatted
}
}
}
private fun handleDialogs(walletDialog: StateDialog?) {
when (walletDialog) {
is WalletDialog.SelectAmountToSendDialog -> {
@ -337,4 +314,22 @@ class WalletDetailsFragment : Fragment(R.layout.fragment_wallet_details),
menu.getItem(0).isEnabled = walletCanBeRemoved
}
}
private fun TextView.setWarningStatus(mainMessage: Int, error: String? = null) {
val text = getString(mainMessage).appendIfNotNull(error, "\nError: ")
setStatus(text, R.color.warning, R.drawable.ic_warning_small)
}
private fun TextView.setVerifiedBalanceStatus(mainMessage: Int) {
setStatus(getString(mainMessage), R.color.accent, R.drawable.ic_ok)
}
private fun TextView.setLoadingStatus(mainMessage: Int) {
setStatus(getString(mainMessage), R.color.darkGray4, null)
}
private fun TextView.setStatus(text: String, @ColorRes color: Int, @DrawableRes drawable: Int?) {
this.text = text
setTextColor(getColor(color))
setCompoundDrawablesWithIntrinsicBounds(drawable ?: 0, 0, 0, 0)
}
}

View file

@ -18,7 +18,10 @@ class SimpleOkDialog {
setTitle(dialog.header)
setMessage(dialog.message)
setPositiveButton(R.string.common_ok) { _, _ -> }
setOnDismissListener { store.dispatchDialogHide() }
setOnDismissListener {
store.dispatchDialogHide()
dialog.onOk?.invoke()
}
}.create()
}
@ -27,7 +30,10 @@ class SimpleOkDialog {
setTitle(context.getString(dialog.headerId))
setMessage(dialog.messageId)
setPositiveButton(R.string.common_ok) { _, _ -> }
setOnDismissListener { store.dispatchDialogHide() }
setOnDismissListener {
store.dispatchDialogHide()
dialog.onOk?.invoke()
}
}.create()
}
}

View file

@ -64,70 +64,41 @@
tools:text="J" />
<TextView
android:id="@+id/tv_status_verified"
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="5dp"
android:paddingStart="16dp"
android:paddingTop="4dp"
android:paddingEnd="16dp"
android:text="@string/wallet_balance_verified"
android:textColor="@color/accent"
android:textSize="14sp"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_ok"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_fiat_amount" />
app:layout_constraintTop_toBottomOf="@id/tv_fiat_amount"
tools:text="@string/wallet_balance_verified" />
<TextView
android:id="@+id/tv_status_error"
android:layout_width="wrap_content"
android:id="@+id/tv_error"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawablePadding="5dp"
android:ellipsize="end"
android:maxLines="6"
android:paddingStart="16dp"
android:paddingTop="4dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:text="@string/wallet_balance_blockchain_unreachable"
android:textColor="@color/warning"
android:textSize="14sp"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_warning_small"
android:visibility="visible"
app:layout_constraintEnd_toStartOf="@+id/iv_currency"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_fiat_amount" />
<TextView
android:id="@+id/tv_status_error_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingTop="4dp"
android:paddingEnd="16dp"
android:textColor="@color/darkGray2"
android:textSize="14sp"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_status_error" />
app:layout_constraintTop_toBottomOf="@id/tv_fiat_amount"
tools:text="@string/lorem_ipsum" />
<androidx.constraintlayout.widget.Group
android:id="@+id/group_error"
android:id="@+id/group_balance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="tv_status_error, tv_status_error_message" />
app:constraint_referenced_ids="tv_amount, tv_fiat_amount, tv_status" />
<TextView
android:id="@+id/tv_status_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="5dp"
android:paddingStart="16dp"
android:paddingTop="4dp"
android:paddingEnd="16dp"
android:text="@string/wallet_balance_loading"
android:textColor="@color/darkGray6"
android:textSize="13sp"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_fiat_amount" />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">One Wallet</string>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
@ -26,12 +26,13 @@
<string name="story_backup_description">Up to 3 physical cards to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">Web3 Compatible</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFTs, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order card</string>
<string name="home_button_search_tokens">Search tokens</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode.</string>
<string name="alert_demo_tx_send">The transaction has been successfully signed, but not sent to the blockchain because of Demo mode. </string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">One Wallet</string>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
@ -26,12 +26,13 @@
<string name="story_backup_description">Up to 3 physical cards to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">Web3 Compatible</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFTs, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order card</string>
<string name="home_button_search_tokens">Search tokens</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode.</string>
<string name="alert_demo_tx_send">The transaction has been successfully signed, but not sent to the blockchain because of Demo mode. </string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">One Wallet</string>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
@ -26,12 +26,13 @@
<string name="story_backup_description">Up to 3 physical cards to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">Web3 Compatible</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFTs, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order card</string>
<string name="home_button_search_tokens">Search tokens</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode.</string>
<string name="alert_demo_tx_send">The transaction has been successfully signed, but not sent to the blockchain because of Demo mode. </string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
</resources>

View file

@ -10,15 +10,15 @@
<string name="common_accept">Принять</string>
<string name="common_custom_string">%s</string>
<string name="common_camera_denied_alert_title">Доступ к камере запрещен</string>
<string name="common_camera_denied_alert_message">Вы не предоставили доступ к своей камере, измените настройки конфиденциальности.</string>
<string name="common_camera_denied_alert_message">Вы не предоставили доступ к своей камере, измените настройки конфиденциальности</string>
<string name="common_camera_alert_button_settings">Настройки</string>
<string name="home_welcome">Добро пожаловать в Tangem.\nУ Вас есть одна из наших карт?</string>
<string name="home_welcome_back">Добро пожаловать обратно в Тангем. \nОтсканируйте карту, чтобы начать.</string>
<string name="home_button_shop">Магазин</string>
<string name="home_ready_title">Приготовьтесь приложить свою\nкарту к задней панели\nтелефона.</string>
<string name="home_ready_title">Приготовьтесь приложить свою\nкарту к задней панели\nтелефона</string>
<string name="home_button_tapin">Нажмите на</string>
<string name="home_button_scan">Сканировать карту</string>
<string name="home_button_yes">Да! Отсканировать</string>
<string name="home_button_yes">Да! Отсканировать.</string>
<string name="wallet_button_scan">Сканировать</string>
<string name="wallet_button_send">Отправить</string>
<string name="wallet_button_create_wallet">Создать кошелек</string>
@ -48,7 +48,7 @@
<string name="wallet_create_payid_hint">PayString имя</string>
<string name="wallet_create_payid_domain">$payid.tangem.com</string>
<string name="wallet_create_payid_button_title">Создать</string>
<string name="wallet_create_payid_info">Ваша PayString — это уникальная для вас информация, такая как номер телефона, электронная почта или ABN.</string>
<string name="wallet_create_payid_info">Ваша PayString — это уникальная для вас информация, такая как номер телефона, электронная почта или ABN</string>
<string name="wallet_create_payid_success_message">PayString успешно создан и скопирован в буфер обмена</string>
<string name="wallet_create_payid_error_message">Ошибка при создании PayString</string>
<string name="wallet_create_payid_error_already_created">Такой PayString уже существует. Попробуйте другой.</string>
@ -73,7 +73,7 @@
<string name="send_total_subtitle_fiat_format">≈ %1$s (включая комиссию: %2$s)</string>
<string name="send_total_subtitle_asset_format">%1$s %2$s и %3$s %4$s будут отправлены</string>
<string name="send_balance_subtitle_format">Баланс: %1$s %2$s</string>
<string name="send_transaction_success">Транзакция успешно подписана и отправлена в блокчейн. Баланс кошелька будет обновлен через некоторое время</string>
<string name="send_transaction_success">Транзакция успешно подписана и отправлена в блокчейн. Баланс кошелька будет обновлен через некоторое время.</string>
<string name="details_title">Подробности</string>
<string name="details_row_title_cid">ID карты</string>
<string name="details_row_title_issuer">Эмитент</string>
@ -91,17 +91,17 @@
<string name="details_manage_security_long_tap">Длительное удержание</string>
<string name="details_manage_security_long_tap_description">Этот механизм защищает карту от бесконтактной атаки. Это обеспечит задержку между приемом и выполнением команды. После первой подписанной транзакции этот телефон будет привязан к карте, и транзакции будут подписаны без задержки.</string>
<string name="details_manage_security_passcode">Пароль</string>
<string name="details_manage_security_passcode_description">Перед выполнением любой команды, влекущей за собой изменение состояния карты, вам необходимо будет ввести пароль.</string>
<string name="details_manage_security_passcode_description">Перед выполнением любой команды, влекущей за собой изменение состояния карты, вам необходимо будет ввести пароль</string>
<string name="details_manage_security_access_code">Код доступа</string>
<string name="details_manage_security_access_code_description">Перед сканированием карты вам нужно будет ввести правильный код доступа.</string>
<string name="alert_old_device_this_card">У Вас могут возникнуть проблемы с NFC на некоторых iPhone 7/7+ во время извлечения.</string>
<string name="details_manage_security_access_code_description">Перед сканированием карты вам нужно будет ввести правильный код доступа</string>
<string name="alert_old_device_this_card">У Вас могут возникнуть проблемы с NFC на некоторых iPhone 7/7+ во время извлечения</string>
<string name="alert_card_signed_transactions">Эта карта уже пополнялась и подписывала транзакции в прошлом. Рассмотрите возможность немедленного снятия всех средств, если Вы получили эту карту из ненадежного источника.</string>
<string name="alert_title">Предупреждение</string>
<string name="alert_unsupported_card">Эта карта не предназначена для работы с этим приложением</string>
<string name="alert_developer_card">Карта, которую Вы отсканировали, является картой для разработчиков. Не принимайте ее в качестве оплаты.</string>
<string name="alert_old_card">Карты Tangem, выпущенные до сентября 2019 года, в настоящее время не могут быть извлечены с помощью iPhone. Мы усердно работаем с Apple, чтобы сделать это возможным в будущих версиях iOS.</string>
<string name="initial_message_sign_header">Нажмите, чтобы подписать</string>
<string name="initial_message_sign_body">Приложите карту к телефону, как показано выше.</string>
<string name="initial_message_sign_body">Приложите карту к телефону, как показано выше</string>
<string name="initial_message_purge_wallet_body">Приложите, чтобы удалить кошелек</string>
<string name="initial_message_create_wallet_body">Приложите, чтобы создать кошелек</string>
<string name="initial_message_change_access_code_body">Приложите, чтобы изменить код доступа</string>
@ -132,7 +132,7 @@
<string name="xtz_withdrawal_message_warning">Чтобы не платить повышенную комиссию при следующем пополнении кошелька, уменьшите сумму на %s XTZ</string>
<string name="xtz_withdrawal_message_reduce">Уменьшить на %s XTZ</string>
<string name="xtz_withdrawal_message_ignore">Нет, отправить все</string>
<string name="scan_card_error">Ошибка сканирования карты. Попробуй снова</string>
<string name="scan_card_error">Ошибка сканирования карты. Попробуй снова.</string>
<string name="wallet_button_buy">Купить</string>
<string name="wallet_button_sell">Продать</string>
<string name="wallet_button_trade">Торговать</string>
@ -141,10 +141,10 @@
<string name="wallet_address_chip_legacy">Устаревший</string>
<string name="wallet_button_create_twin_wallet">Создать кошелек</string>
<string name="wallet_error_empty_twin_card">Создать кошелек</string>
<string name="wallet_error_empty_twin_card_subtitle">Сгенерируйте ключи кошелька на обеих картах, чтобы начать использовать свои Twin карты.</string>
<string name="wallet_error_empty_twin_card_subtitle">Сгенерируйте ключи кошелька на обеих картах, чтобы начать использовать свои Twin карты</string>
<string name="twins_onboarding_title">Tangem Twin</string>
<string name="twins_onboarding_subtitle">Один кошелек. Две карты.</string>
<string name="twins_onboarding_description_format">Одна, которую Вы держите в руках, и вторая карта с номером #%s.</string>
<string name="twins_onboarding_description_format">Одна, которую Вы держите в руках, и вторая карта с номером #%s</string>
<string name="wallet_twins_chip_format">Карта %1d из %2d</string>
<string name="details_row_title_twins_recreate">Пересоздать Twin кошелек</string>
<string name="details_row_title_card_tou">Условия использования карты</string>
@ -165,20 +165,20 @@
<string name="common_search">Поиск</string>
<string name="send_extras_hint_memo">Памятка</string>
<string name="send_extras_hint_destination_tag">Тег назначения</string>
<string name="send_error_invalid_destination_tag">Недопустимый тег назначения. Он не будет добавлен в транзакцию</string>
<string name="send_error_invalid_memo_id">Недопустимый идентификатор памятки. Он не будет добавлен в транзакцию</string>
<string name="send_error_invalid_destination_tag">Недопустимый тег назначения. Он не будет добавлен в транзакцию.</string>
<string name="send_error_invalid_memo_id">Недопустимый идентификатор памятки. Он не будет добавлен в транзакцию.</string>
<string name="details_section_title_app">Приложение</string>
<string name="details_row_title_send_feedback">Отправить отзыв</string>
<string name="alert_app_feedback_sent_title">Успешно отправлено</string>
<string name="alert_app_feedback_sent_message">Спасибо за ваш отзыв</string>
<string name="alert_negative_app_rate_sent_title">Ваши предложения отправлены</string>
<string name="alert_negative_app_rate_sent_message">Спасибо за ваш отзыв. Мы ответим как можно скорее</string>
<string name="alert_negative_app_rate_sent_message">Спасибо за ваш отзыв. Мы ответим как можно скорее.</string>
<string name="alert_failed_to_send_email_title">Не удалось отправить электронное письмо</string>
<string name="alert_failed_to_send_email_message">Причина: %s</string>
<string name="alert_failed_to_send_transaction_title">Не могу отправить транзакцию</string>
<string name="alert_failed_to_send_transaction_message">Причина: %s. Хотите отправить отзыв?</string>
<string name="alert_troubleshooting_scan_card_title">У Вас возникли трудности со сканированием вашей карты?</string>
<string name="alert_troubleshooting_scan_card_message">Пожалуйста, попробуйте приложить карту точно так, как показано на анимации, или обратитесь в поддержку.</string>
<string name="alert_troubleshooting_scan_card_message">Пожалуйста, попробуйте приложить карту точно так, как показано на анимации, или обратитесь в поддержку</string>
<string name="alert_troubleshooting_scan_card_ok">Отмена</string>
<string name="alert_button_try_again">Попробуйте снова</string>
<string name="alert_button_request_support">Обратиться в поддержку</string>
@ -206,21 +206,20 @@
<string name="custom_token_token_symbol_input_title">Символ токена</string>
<string name="custom_token_contract_address_input_title">Адрес контракта</string>
<string name="custom_token_decimals_input_title">Десятичные</string>
<string name="custom_token_name_input_placeholder">бывший. USD Coin</string>
<string name="custom_token_token_symbol_input_placeholder">бывший. USDC</string>
<string name="custom_token_name_input_placeholder">бывший USD Coin</string>
<string name="custom_token_token_symbol_input_placeholder">бывший USDC</string>
<string name="add_token_added">Добавлен</string>
<string name="remove_token">Удалить токен</string>
<string name="token_icon">Значок токена</string>
<string name="details_section_title_blockchain">Блокчейн</string>
<string name="details_row_title_manage_tokens">Управление токенами</string>
<string name="add_tokens_subtitle_blockchains">Блокчейны</string>
<string name="add_tokens_subtitle_format" translatable="false">%s токены</string>
<string name="wallet_address_button_copy">Копировать</string>
<string name="wallet_address_button_share">Поделиться</string>
<string name="wallet_button_add_tokens">+ Добавить токены</string>
<string name="wallet_pending_transaction_warning">Пожалуйста, дождитесь завершения транзакции, чтобы иметь возможность отправить средства</string>
<string name="warning_failed_to_verify_card_title">Проверка подлинности не удалась</string>
<string name="warning_failed_to_verify_card_message">Эта карта может быть производственным образцом или подделкой.</string>
<string name="warning_failed_to_verify_card_message">Эта карта может быть производственным образцом или подделкой</string>
<string name="warning_important_security_info">Важная информация о безопасности \u26A0</string>
<string name="warning_signed_tx_previously">Эта карта ранее подписывала транзакции</string>
<string name="warning_button_learn_more">Узнать подробнее</string>
@ -232,7 +231,7 @@
<string name="common_reject">Отклонить</string>
<string name="warning_testnet_card_message">Это тестовая карта. Не принимайте ее в качестве оплаты. Она должна использоваться только в целях тестирования и разработки.</string>
<string name="wallet_dialog_choose_trade_action">Вы хотите купить или продать криптовалюту?</string>
<string name="error_update_app">К сожалению, текущая версия приложения не готова к работе с этой картой, проверьте наличие обновлений.</string>
<string name="error_update_app">К сожалению, текущая версия приложения не готова к работе с этой картой, проверьте наличие обновлений</string>
<string name="home_welcome_header">Добро пожаловать в Tangem</string>
<string name="home_welcome_body">Самый безопасный способ покупать, использовать и\n хранить криптовалюту</string>
<string name="home_button_get_new_card">Получить новую карту</string>
@ -244,7 +243,7 @@
<string name="onboarding_create_wallet_button_create_wallet">Создать кошелек</string>
<string name="onboarding_top_up_header">Пополните свой кошелек</string>
<string name="onboarding_top_up_body">Чтобы начать, просто пополните карту на любую сумму</string>
<string name="onboarding_top_up_body_no_account_error">Чтобы начать, просто пополните кошелек более чем на %s %s.</string>
<string name="onboarding_top_up_body_no_account_error">Чтобы начать, просто пополните кошелек более чем на %s %s</string>
<string name="onboarding_top_up_button_but_crypto">Купить криптовалюту</string>
<string name="onboarding_top_up_button_show_wallet_address">Показать адрес кошелька</string>
<string name="onboarding_dialog_wallet_address">Отсканируйте адрес, чтобы пополнить кошелек</string>
@ -257,7 +256,7 @@
<string name="onboarding_twins_interrupt_warning">Если процесс повторного создания кошелька каким-либо образом прервется, вам придется начать все сначала.</string>
<string name="onboarding_twin_exit_warning">Процесс связывания карт частично завершен. Вы не можете выйти из него сейчас.</string>
<string name="onboarding_error_create_primary_wallet">Внутренняя ошибка: не удается создать менеджер кошельков</string>
<string name="wallet_balance_blockchain_unreachable_try_later">Блокчейн недоступен. Попробуй позже</string>
<string name="wallet_balance_blockchain_unreachable_try_later">Блокчейн недоступен. Попробуй позже.</string>
<string name="warning_button_ok">Хорошо, понял!</string>
<string name="onboarding_success">Успешно!</string>
<string name="onboarding_getting_started">Начнем</string>
@ -275,40 +274,40 @@
<string name="onboarding_title_one_backup_card">Добавлена одна резервная карта</string>
<string name="onboarding_title_two_backup_cards">Добавлены две резервные карты</string>
<string name="onboarding_title_backup_card_format">Резервная карта #%d</string>
<string name="onboarding_subtitle_backup_card">Вы можете привязать до трех карт к одному кошельку.</string>
<string name="onboarding_subtitle_backup_card">Вы можете привязать до трех карт к одному кошельку</string>
<string name="onboarding_subtitle_no_backup_cards">Чтобы начать процесс резервного копирования, добавьте еще максимум 2 карты</string>
<string name="onboarding_subtitle_scan_origin_card_format">Подготовьте основную карту с номером %s</string>
<string name="onboarding_subtitle_scan_origin_card">Подготовьте основную карту</string>
<string name="onboarding_subtitle_one_backup_card">Вы можете добавить еще одну карту или завершить процесс резервного копирования</string>
<string name="onboarding_subtitle_two_backup_cards">Добавлено максимальное количество карт.</string>
<string name="onboarding_subtitle_backup_warning">Если процесс резервного копирования будет прерван каким-либо образом, вам придется начать все сначала.</string>
<string name="onboarding_subtitle_two_backup_cards">Добавлено максимальное количество карт</string>
<string name="onboarding_subtitle_backup_warning">Если процесс резервного копирования будет прерван каким-либо образом, вам придется начать все сначала</string>
<string name="onboarding_alert_message_not_max_backup_cards_added">Вы добавили одну резервную карту. После того, как процесс будет завершен, Вы больше не сможете добавить карт. Если у Вас есть еще одна карта, добавьте ее в резервную копию. Хотите продолжить?</string>
<string name="onboarding_access_code_intro_title">Создать код доступа</string>
<string name="onboarding_access_code_repeat_code_title">Введите код доступа повторно</string>
<string name="onboarding_access_code_feature_1_title">Защитить</string>
<string name="onboarding_access_code_feature_2_title">Персонализировать</string>
<string name="onboarding_access_code_feature_3_title">Восстановить</string>
<string name="onboarding_access_code_feature_1_description">Вам необходимо установить единый код доступа для защиты всех ваших кошельков.</string>
<string name="onboarding_access_code_feature_2_description">Позже Вы сможете установить индивидуальный код доступа для каждой карты.</string>
<string name="onboarding_access_code_feature_3_description">Код доступа можно восстановить с помощью привязанной карты, не храните все карты в одном месте.</string>
<string name="onboarding_access_code_hint">Выберите любое слово, фразу или номер в качестве кода доступа.</string>
<string name="onboarding_access_code_too_short">Код доступа должен состоять не менее чем из 4 символов.</string>
<string name="onboarding_access_code_feature_1_description">Вам необходимо установить единый код доступа для защиты всех ваших кошельков</string>
<string name="onboarding_access_code_feature_2_description">Позже Вы сможете установить индивидуальный код доступа для каждой карты</string>
<string name="onboarding_access_code_feature_3_description">Код доступа можно восстановить с помощью привязанной карты, не храните все карты в одном месте</string>
<string name="onboarding_access_code_hint">Выберите любое слово, фразу или номер в качестве кода доступа</string>
<string name="onboarding_access_code_too_short">Код доступа должен состоять не менее чем из 4 символов</string>
<string name="onboarding_access_codes_doesnt_match">Введенный код доступа не соответствует исходному коду доступа</string>
<string name="common_create">Создать</string>
<string name="common_submit">Подтвердить</string>
<string name="onboarding_subtitle_success_backup">Вы создали 2 резервные карты, и теперь эти карты готовы к использованию.</string>
<string name="onboarding_subtitle_success_backup">Вы создали 2 резервные карты, и теперь эти карты готовы к использованию</string>
<string name="onboarding_navbar_title_creating_backup">Создание резервной копии</string>
<string name="onboarding_backup_exit_warning">Процесс резервного копирования частично завершен. Вы не можете выйти из него сейчас.</string>
<string name="onboarding_wallet_info_title_first">Резервный кошелек</string>
<string name="onboarding_wallet_info_title_second">Идентичные карты</string>
<string name="onboarding_wallet_info_title_third">Код доступа</string>
<string name="onboarding_wallet_info_title_fourth">Восстановление кода доступа</string>
<string name="onboarding_wallet_info_subtitle_first">Вы можете сделать до двух резервных копий карты Tangem Wallet.</string>
<string name="onboarding_wallet_info_subtitle_second">Все резервные карты могут использоваться как полнофункциональные с одинаковыми ключами.</string>
<string name="onboarding_wallet_info_subtitle_third">Вы сможете установить код доступа для защиты своих кошельков.</string>
<string name="onboarding_wallet_info_subtitle_fourth">Код доступа можно восстановить с помощью одной из резервных карт.</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Ваша карта Tangem Wallet настроена и готова к использованию.</string>
<string name="onboarding_subtitle_success_backup_one_card">Вы создали 1 резервную карту, и теперь эта карта готова к использованию.</string>
<string name="onboarding_wallet_info_subtitle_first">Вы можете сделать до двух резервных копий карты Tangem Wallet</string>
<string name="onboarding_wallet_info_subtitle_second">Все резервные карты могут использоваться как полнофункциональные с одинаковыми ключами</string>
<string name="onboarding_wallet_info_subtitle_third">Вы сможете установить код доступа для защиты своих кошельков</string>
<string name="onboarding_wallet_info_subtitle_fourth">Код доступа можно восстановить с помощью одной из резервных карт</string>
<string name="onboarding_subtitle_success_tangem_wallet_onboarding">Ваша карта Tangem Wallet настроена и готова к использованию</string>
<string name="onboarding_subtitle_success_backup_one_card">Вы создали 1 резервную карту, и теперь эта карта готова к использованию</string>
<string name="common_origin_card">Основная карта</string>
<string name="onboarding_alert_i_understand">Я понимаю</string>
<string name="details_row_title_backup_status">Статус резервного копирования</string>
@ -332,20 +331,20 @@
<string name="onboarding_subtitle_scan_primary_card_format">Подготовьте основную карту с номером %s</string>
<string name="details_row_title_reset_factory_settings">Сброс до заводских настроек</string>
<string name="details_row_title_reset_factory_settings_warning">Это действие необратимо. Если после сброса карты кто-то отправит на нее средства, то Вы не сможете их вывести.</string>
<string name="details_manage_security_access_code_disclaimer">Код доступа доступен только для карт с резервной копией.</string>
<string name="details_manage_security_access_code_disclaimer">Код доступа доступен только для карт с резервной копией</string>
<string name="solana_rent_warning">Сеть Solana взымает арендную плату в размере %s каждые 2 дня. Аккаунты, которые не могут позволить себе арендную плату, удаляются из сети. Пополните свой счет более чем на %s, чтобы использовать его бесплатно.</string>
<string name="token_symbol_address_format">%1s (%2s)</string>
<string name="alert_signed_hashes_message">Эта карта не является векселем на предъявителя. В настоящее время мы не можем сопоставить количество подписей на карте с информацией в блокчейне. Это нормально, но в редких случаях может означать, что предыдущий владелец скрывает автономную подпись, что является проблемой безопасности.\n\nНе принимайте эту карту в качестве физического платежа от кого-то, кому Вы не доверяете.\n\nВо всех остальных отношениях - это совершенно безопасно.\n\nTangem — единственный аппаратный кошелек, предлагающий защиту от подсчета подписей.</string>
<string name="wallet_connect">Wallet Connect</string>
<string name="wallet_connect">WalletConnect</string>
<string name="wallet_connect_create_tx_message">Запрос на создание транзакции для %2s\n%3s\n\nСумма: %4s\nКомиссия: %5s\nВсего: %6s\nБаланс: %7s</string>
<string name="wallet_connect_request_session_start">Запрос на запуск сеанса для карты с идентификатором %1s\nдля %2s\n\nURL: %3s</string>
<string name="wallet_connect_sessions_title">Сеансы подключения кошелька</string>
<string name="wallet_connect_sessions_title">Сессии WalletConnect</string>
<string name="wallet_connect_session_opened">Сеанс WalletConnect открыт с %s</string>
<string name="wallet_connect_no_sessions_title">Упс. Нет сессий.</string>
<string name="wallet_connect_no_sessions_message">Нет открытых сессий WalletConnect</string>
<string name="wallet_connect_open_session">Открытая сессия</string>
<string name="wallet_connect_card_number">Карта: %s</string>
<string name="wallet_connect_scan_card_message">Коснитесь карты, чтобы привязать ее к кошельку.</string>
<string name="wallet_connect_scan_card_message">Коснитесь карты, чтобы привязать ее WalletConnect</string>
<string name="wallet_connect_create_tx_not_enough_funds">Не удается отправить транзакцию. Недостаточно средств.</string>
<string name="wallet_connect_alert_sign_message">Просьба подписать сообщение\nкартой %s\n\n</string>
<string name="wallet_connect_personal_sign_message">Сообщение для %s:\n%s</string>
@ -356,7 +355,7 @@
<string name="wallet_connect_could_not_complete">Операция не может быть завершена</string>
<string name="wallet_connect_same_wcuri">Операция не может быть завершена. \n\nВы уже установили сеанс WalletConnect с этими параметрами.</string>
<string name="wallet_connect_error_timeout">Не удалось установить сеанс WalletConnect: ошибка времени выполнения. Пожалуйста, повторите попытку позже.</string>
<string name="wallet_connect_bnb_transaction_signed">Транзакция BNB успешно подписана и отправлена в DApp.</string>
<string name="wallet_connect_bnb_transaction_signed">Транзакция BNB успешно подписана и отправлена в DApp</string>
<string name="wallet_connect_bnb_sign_message">DApp %s, запрашивает\nподпись транзакции BNB с\nкартой: %s\n\n%s</string>
<string name="wallet_connect_bnb_transaction_message">Сведения о транзакции:\nОт: %s\nКому: %s\nСумма: %s</string>
<string name="wallet_connect_bnb_trade_order_message">Торговый ордер на %s\nЦена: %s\nСумма к получению: %s\nСумма к оплате: %s</string>
@ -366,10 +365,10 @@
<string name="feedback_subject_tx_push_failed">Не могу протолкнуть транзакцию</string>
<string name="feedback_subject_support_tangem">Обращение в поддержку Tangem</string>
<string name="feedback_subject_support">Обращение в поддержку</string>
<string name="feedback_preface_rate_negative">Расскажите, каких функций Вам не хватает, и мы постараемся Вам помочь.</string>
<string name="feedback_preface_rate_negative">Расскажите, каких функций Вам не хватает, и мы постараемся Вам помочь</string>
<string name="feedback_preface_scan_failed">Скажите, пожалуйста, какая у Вас карта?</string>
<string name="feedback_preface_tx_failed">Пожалуйста, расскажите нам больше о Вашей проблеме. Каждая маленькая деталь может помочь.</string>
<string name="feedback_preface_support">Привет, команда поддержки,</string>
<string name="feedback_preface_tx_push_failed">Пожалуйста, расскажите нам больше о Вашей проблеме. Каждая деталь может быть полезной</string>
<string name="feedback_preface_tx_push_failed">Пожалуйста, расскажите нам больше о Вашей проблеме. Каждая деталь может быть полезной.</string>
<string name="feedback_data_collection_message">Информация ниже не является обязательной. Вы можете стереть её, если хотите.</string>
</resources>

View file

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">Один Кошелек</string>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 карты</string>
<string name="shop_2_cards">2 карты</string>
<string name="shop_shipping">Доставка</string>
<string name="shop_free">Бесплатно</string>
<string name="shop_i_have_a_promo_code">У меня есть промо-код</string>
<string name="shop_i_have_a_promo_code">У меня есть промо-код...</string>
<string name="shop_total">Итого</string>
<string name="shop_other_payment_methods">Другие способы оплаты</string>
<string name="shop_buy_now">Купить сейчас</string>
<string name="shop_placing_order">Оформление вашего заказа</string>
<string name="shop_placing_order">Оформление заказа</string>
<string name="shop_web_checkout_title">Ваш заказ</string>
<string name="story_meet_title">Встречайте\nTangem</string>
<string name="story_meet_buy">Покупайте</string>
@ -17,21 +17,22 @@
<string name="story_meet_send">Отправляйте</string>
<string name="story_meet_pay">Расплачивайтесь</string>
<string name="story_meet_exchange">Обменивайте</string>
<string name="story_meet_lend">Одалживайте</string>
<string name="story_meet_lend">Вкладывайте</string>
<string name="story_meet_borrow">Занимайте</string>
<string name="story_meet_stake">Вкладывайте</string>
<string name="story_meet_stake">Стейкайте</string>
<string name="story_awe_title">Революционный аппаратный кошелек</string>
<string name="story_awe_description">Держите свои криптосбережения в безопасности - приватные ключи надежно хранятся на карте</string>
<string name="story_backup_title">Ультрабезопасная резервная копия</string>
<string name="story_awe_description">Держите свои криптосбережения в безопасности. Приватные ключи надежно хранятся на карте.</string>
<string name="story_backup_title">Все ключи в безопасности</string>
<string name="story_backup_description">До трех карт с одним кошельком</string>
<string name="story_currencies_title">Тысячи криптовалют</string>
<string name="story_currencies_description">Аппаратный кошелек для ваших биткоинов, эфира и многих других валют одновременно — все в одной карте</string>
<string name="story_web3_title">Поддерживает Web3</string>
<string name="story_web3_description">Обменивайте, покупайте NFT, получайте займы и вклады в более чем 100 различных децентрализованных сервисах</string>
<string name="story_web3_title">Поддержка DeFi</string>
<string name="story_web3_description">Обменивайте, покупайте NFT, получайте займы и делайте вклады в более чем 100 различных децентрализованных сервисах</string>
<string name="story_finish_title">Кошелек для каждого</string>
<string name="story_finish_description">Используйте его на ходу, в любом месте, в любое время. Без проводов и аккумуляторов. Как только понадобится крипта, просто приложите карту к телефону.</string>
<string name="story_finish_description">Используйте его на ходу, в любом месте, в любое время. Без проводов и батареек. Как только понадобится крипта, просто приложите карту к телефону.</string>
<string name="home_button_order">Заказать карту</string>
<string name="home_button_search_tokens">Поиск токенов</string>
<string name="search_tokens_title">Поиск токенов</string>
<string name="alert_demo_message">Приложение работает в демонстрационном режиме. Средства на всех счетах ненастоящие.</string>
<string name="alert_demo_feature_disabled">Эта функция недоступна в демонстрационном режиме</string>
<string name="alert_demo_tx_send">Транзакция успешно подписана, но не отправлена в блокчейн, потому что активирован демонстрационный режим.</string>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="shop_one_wallet">One Wallet</string>
<string name="shop_one_wallet">Tangem Wallet</string>
<string name="shop_3_cards">3 cards</string>
<string name="shop_2_cards">2 cards</string>
<string name="shop_shipping">Shipping</string>
@ -26,12 +26,13 @@
<string name="story_backup_description">Up to 3 physical cards to one wallet</string>
<string name="story_currencies_title">Thousands of Currencies</string>
<string name="story_currencies_description">A hardware wallet for your Bitcoin, Ethereum and many more currencies simultaneously all in one card</string>
<string name="story_web3_title">Web3 Compatible</string>
<string name="story_web3_title">DeFi Compatible</string>
<string name="story_web3_description">Exchange, buy NFTs, make loans and deposits in more than 100 different decentralized services</string>
<string name="story_finish_title">The Wallet for Everyone</string>
<string name="story_finish_description">Use it on the go, anywhere, anytime. No wires or batteries. Just tap the card to your phone when you need your crypto.</string>
<string name="home_button_order">Order card</string>
<string name="home_button_search_tokens">Search tokens</string>
<string name="search_tokens_title">Search tokens</string>
<string name="alert_demo_message">You are currently running in Demo mode. All funds are not real.</string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode.</string>
<string name="alert_demo_tx_send">The transaction has been successfully signed, but not sent to the blockchain because of Demo mode. </string>
<string name="alert_demo_feature_disabled">This feature is disabled in Demo mode</string>
</resources>