diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt index 26e6a0c3d0..1f227fc391 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/BasicEventConverter.kt @@ -27,6 +27,7 @@ class BasicEventsPreChecker { BasicTopUpEventConverter().convert(converterData)?.let { Analytics.send(it) } } + @Suppress("ComplexMethod") private fun isReadyToSend(data: BasicEventsSourceData): Boolean { val (scanResponse, walletState, biometricsWalletDataModels) = data if (walletState.derivationsCheckIsScheduled) { @@ -69,13 +70,14 @@ class BasicEventsPreChecker { return false } - if (biometricsWalletDataModels.any { + val isCorrectStatus = biometricsWalletDataModels.any { it.status is WalletDataModel.Loading || it.status is WalletDataModel.NoAccount || it.status is WalletDataModel.Unreachable || it.status is WalletDataModel.MissedDerivation || it.status.isErrorStatus - }) { + } + if (isCorrectStatus) { Timber.d("FAILED: by status") return false } diff --git a/app/src/main/java/com/tangem/tap/common/analytics/converters/ShopOrderToEventConverter.kt b/app/src/main/java/com/tangem/tap/common/analytics/converters/ShopOrderToEventConverter.kt index 49f6762db9..5d779e661f 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/converters/ShopOrderToEventConverter.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/converters/ShopOrderToEventConverter.kt @@ -20,7 +20,8 @@ class ShopOrderToEventConverter : Converter "3" } val amount = "${checkout.totalPriceV2.amount} ${checkout.totalPriceV2.currencyCode.name}" - val code = (checkout.discountApplications.edges.firstOrNull()?.node as? Storefront.DiscountCodeApplication)?.code + val code = (checkout.discountApplications.edges.firstOrNull()?.node as? Storefront.DiscountCodeApplication) + ?.code return Shop.Purchased(sku, count, amount, code) } diff --git a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt index 07e0eee2d4..222768169b 100644 --- a/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt +++ b/app/src/main/java/com/tangem/tap/domain/scanCard/ScanCardProcessor.kt @@ -148,27 +148,29 @@ object ScanCardProcessor { store.dispatchOnMain(DisclaimerAction.SetDisclaimer(disclaimer)) if (disclaimer.isAccepted()) { - nextHandler((scanResponse)) - } else scope.launch { - delay(DELAY_SDK_DIALOG_CLOSE) - disclaimerWillShow() - dispatchOnMain( - DisclaimerAction.Show( - fromScreen = AppScreen.Home, - callback = DisclaimerCallback( - onAccept = { - scope.launch(Dispatchers.Main) { - nextHandler(scanResponse) - } - }, - onDismiss = { - scope.launch(Dispatchers.Main) { - onFailure(TangemSdkError.UserCancelled()) - } - }, + nextHandler(scanResponse) + } else { + scope.launch { + delay(DELAY_SDK_DIALOG_CLOSE) + disclaimerWillShow() + dispatchOnMain( + DisclaimerAction.Show( + fromScreen = AppScreen.Home, + callback = DisclaimerCallback( + onAccept = { + scope.launch(Dispatchers.Main) { + nextHandler(scanResponse) + } + }, + onDismiss = { + scope.launch(Dispatchers.Main) { + onFailure(TangemSdkError.UserCancelled()) + } + }, + ), ), - ), - ) + ) + } } } diff --git a/app/src/main/java/com/tangem/tap/domain/totalBalance/implementation/DefaultTotalFiatBalanceCalculator.kt b/app/src/main/java/com/tangem/tap/domain/totalBalance/implementation/DefaultTotalFiatBalanceCalculator.kt index faa4628b9b..b0224afdac 100644 --- a/app/src/main/java/com/tangem/tap/domain/totalBalance/implementation/DefaultTotalFiatBalanceCalculator.kt +++ b/app/src/main/java/com/tangem/tap/domain/totalBalance/implementation/DefaultTotalFiatBalanceCalculator.kt @@ -47,10 +47,10 @@ internal class DefaultTotalFiatBalanceCalculator : TotalFiatBalanceCalculator { is WalletDataModel.VerifiedOnline, is WalletDataModel.SameCurrencyTransactionInProgress, is WalletDataModel.TransactionInProgress, - is WalletDataModel.NoAccount, - -> { - if (walletData.fiatRate == null) TotalFiatBalanceStatus.Error - else TotalFiatBalanceStatus.Loaded + is WalletDataModel.NoAccount -> if (walletData.fiatRate == null) { + TotalFiatBalanceStatus.Error + } else { + TotalFiatBalanceStatus.Loaded } is WalletDataModel.Unreachable, is WalletDataModel.MissedDerivation, diff --git a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt index 44dbb45fda..902bb0ef47 100644 --- a/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/home/redux/HomeMiddleware.kt @@ -113,7 +113,7 @@ private fun readCard(analyticsEvent: AnalyticsEvent?) = scope.launch { private suspend fun navigateTo(appScreen: AppScreen) { store.dispatchOnMain(NavigationAction.NavigateTo(appScreen)) - delay(200) + delay(timeMillis = 200) changeButtonState(ButtonState.ENABLED) } diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt index 0f0b207431..6236bf847e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/SaltPayExceptionHandler.kt @@ -11,35 +11,33 @@ import com.tangem.tap.store /** [REDACTED_AUTHOR] */ -class SaltPayExceptionHandler { - companion object { - fun handle(throwable: Throwable) { - when (throwable) { - is SaltPayActivationError -> { - val dialog = when (throwable) { - is SaltPayActivationError.NoGas -> SaltPayDialog.Activation.NoGas - is SaltPayActivationError.PutVisaCard -> SaltPayDialog.Activation.PutVisaCard - else -> SaltPayDialog.Activation.OnError(throwable) +object SaltPayExceptionHandler { + fun handle(throwable: Throwable) { + when (throwable) { + is SaltPayActivationError -> { + val dialog = when (throwable) { + is SaltPayActivationError.NoGas -> SaltPayDialog.Activation.NoGas + is SaltPayActivationError.PutVisaCard -> SaltPayDialog.Activation.PutVisaCard + else -> SaltPayDialog.Activation.OnError(throwable) + } + store.dispatchDialogShow(dialog) + } + is TangemSdkError -> { + when (throwable) { + is TangemSdkError.NetworkError -> { + val message = throwable.customMessage + store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) } - store.dispatchDialogShow(dialog) - } - is TangemSdkError -> { - when (throwable) { - is TangemSdkError.NetworkError -> { - val message = (throwable).customMessage - store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) - } - else -> Unit - } - } - is BlockchainSdkError -> { - store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(throwable.customMessage)) - } - else -> { - val message = throwable.localizedMessage ?: "SaltPay unknown error" - store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) + else -> Unit } } + is BlockchainSdkError -> { + store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(throwable.customMessage)) + } + else -> { + val message = throwable.localizedMessage ?: "SaltPay unknown error" + store.dispatchDialogShow(AppDialog.SimpleOkErrorDialog(message)) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt index 1636675ae1..35a99173c3 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/InterruptOnboardingDialog.kt @@ -11,17 +11,15 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class InterruptOnboardingDialog { - companion object { - fun create(context: Context, dialog: OnboardingDialog.InterruptOnboarding): Dialog { - return AlertDialog.Builder(context).apply { - setTitle(context.getString(R.string.onboarding_exit_alert_title)) - setMessage(context.getString(R.string.onboarding_exit_alert_message)) - setPositiveButton(R.string.common_ok) { _, _ -> dialog.onOk() } - setNegativeButton(R.string.common_cancel) { _, _ -> } - setOnDismissListener { store.dispatchDialogHide() } - setCancelable(false) - }.create() - } +object InterruptOnboardingDialog { + fun create(context: Context, dialog: OnboardingDialog.InterruptOnboarding): Dialog { + return AlertDialog.Builder(context).apply { + setTitle(context.getString(R.string.onboarding_exit_alert_title)) + setMessage(context.getString(R.string.onboarding_exit_alert_message)) + setPositiveButton(R.string.common_ok) { _, _ -> dialog.onOk() } + setNegativeButton(R.string.common_cancel) { _, _ -> } + setOnDismissListener { store.dispatchDialogHide() } + setCancelable(false) + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt index ba689a1449..d3daf798fe 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/PutVisaCardDialog.kt @@ -10,18 +10,16 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class PutVisaCardDialog { - companion object { - fun create(context: Context): Dialog { - return AlertDialog.Builder(context).apply { - setTitle(R.string.saltpay_error_empty_backup_title) - setMessage(R.string.saltpay_error_empty_backup_message) - setPositiveButton(R.string.common_ok) { _, _ -> } - setOnDismissListener { - store.dispatch(GlobalAction.HideDialog) - } - setCancelable(false) - }.create() - } +object PutVisaCardDialog { + fun create(context: Context): Dialog { + return AlertDialog.Builder(context).apply { + setTitle(R.string.saltpay_error_empty_backup_title) + setMessage(R.string.saltpay_error_empty_backup_message) + setPositiveButton(R.string.common_ok) { _, _ -> } + setOnDismissListener { + store.dispatch(GlobalAction.HideDialog) + } + setCancelable(false) + }.create() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt index 592b888850..c6e8d9526e 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/message/SaltPayModuleMessage.kt @@ -48,8 +48,7 @@ sealed class SaltPayActivationError( object FailedToGetFundsToClaim : SaltPayActivationError(subCode = 14) object NoFundsToClaim : SaltPayActivationError(subCode = 15) object ClaimTransactionFailed : SaltPayActivationError(subCode = 16) - - object PutVisaCard : SaltPayActivationError(18) + object PutVisaCard : SaltPayActivationError(subCode = 18) companion object { const val EMPTY_MESSAGE = "" diff --git a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt index aeac4ea3e9..dccbe4d7b7 100644 --- a/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/shop/ui/ShopFragment.kt @@ -29,7 +29,7 @@ class ShopFragment : BaseStoreFragment(R.layout.fragment_shop), StoreSubscriber< private val binding: FragmentShopBinding by viewBinding(FragmentShopBinding::bind) private var cardTranslationY = 70f - lateinit var keyboardObserver: KeyboardObserver + private lateinit var keyboardObserver: KeyboardObserver override fun subscribeToStore() { store.subscribe(this) { state -> diff --git a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt index 437c1fd905..ce9f8287dd 100644 --- a/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/wallet/redux/middlewares/WalletMiddleware.kt @@ -66,7 +66,6 @@ import kotlinx.coroutines.awaitAll import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.rekotlin.Action -import org.rekotlin.DispatchFunction import org.rekotlin.Middleware import timber.log.Timber import java.math.BigDecimal @@ -87,17 +86,17 @@ class WalletMiddleware { ) } - val walletMiddleware: Middleware = { dispatch, state -> + val walletMiddleware: Middleware = { _, state -> { next -> { action -> - handleAction(state, action, dispatch) + handleAction(state, action) next(action) } } } @Suppress("LongMethod", "ComplexMethod") - private fun handleAction(state: () -> AppState?, action: Action, dispatch: DispatchFunction) { + private fun handleAction(state: () -> AppState?, action: Action) { if (DemoHelper.tryHandle(state, action)) return val globalState = store.state.globalState @@ -203,7 +202,7 @@ class WalletMiddleware { is WalletAction.Scan -> { store.dispatch(NavigationAction.PopBackTo(AppScreen.Home)) scope.launch { - delay(700) + delay(timeMillis = 700) store.dispatchOnMain(HomeAction.ReadCard(action.onScanSuccessEvent)) } } @@ -344,7 +343,7 @@ class WalletMiddleware { .filter { store -> store.walletsData.any { it.status is WalletDataModel.MissedDerivation } } - .map { it.blockchainNetwork } + .map(WalletStoreModel::blockchainNetwork) store.dispatchOnMain(WalletAction.MultiWallet.AddMissingDerivations(missedDerivations)) } diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt index 4debaff531..33e8bcae4b 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/redux/WalletSelectorMiddleware.kt @@ -104,10 +104,12 @@ internal class WalletSelectorMiddleware { updatedWalletStores: Map>, state: WalletSelectorState, ) { - if (updatedWalletStores.isNotEmpty()) scope.launch(Dispatchers.Default) { - val updatedWallets = state.wallets.updateWalletStoresAndCalculateFiatBalance(updatedWalletStores) - if (updatedWallets != state.wallets) { - store.dispatchOnMain(WalletSelectorAction.BalancesLoaded(updatedWallets)) + if (updatedWalletStores.isNotEmpty()) { + scope.launch(Dispatchers.Default) { + val updatedWallets = state.wallets.updateWalletStoresAndCalculateFiatBalance(updatedWalletStores) + if (updatedWallets != state.wallets) { + store.dispatchOnMain(WalletSelectorAction.BalancesLoaded(updatedWallets)) + } } } } diff --git a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt index b67acbf338..2ce322509d 100644 --- a/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt +++ b/app/src/main/java/com/tangem/tap/features/walletSelector/ui/components/WalletItem.kt @@ -228,10 +228,10 @@ private fun LoadingTokensInfo(isMultiCurrencyWallet: Boolean) { @OptIn(ExperimentalComposeUiApi::class) @Composable private fun LoadedTokensInfo( - modifier: Modifier = Modifier, balanceAmount: String, tokensCount: Int?, showWarning: Boolean, + modifier: Modifier = Modifier, ) { Column( modifier = modifier, diff --git a/buildSrc/src/main/java/Versions.kt b/buildSrc/src/main/java/Versions.kt index f01ebe5896..de9fed5322 100644 --- a/buildSrc/src/main/java/Versions.kt +++ b/buildSrc/src/main/java/Versions.kt @@ -64,7 +64,7 @@ object Versions { const val tangemBlockchainSdk = "develop-154" // const val tangemBlockchainSdk = "0.0.1" // Keep it! - used for local builds - const val tangemCardSdk = "develop-180" + const val tangemCardSdk = "develop-184" // const val tangemCardSgk = "0.0.1" // Keep it! - used for local builds // endregion Tangem diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 2949fd6eec..ceb6d82ea4 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -24,8 +24,6 @@ Keep the wallet in the app Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card. App Settings - Reset - Are you sure you want to do this? Change Access Code Access code will be changed on this card only Reset to Factory Settings @@ -348,7 +346,7 @@ Swap Swap of %1$s to %2$s Other tokens - Choose token + Choose token Your tokens not available Tangem diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 927fa8f9b9..0f6bf84e10 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -24,8 +24,6 @@ Keep the wallet in the app Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card. App Settings - Reset - Are you sure you want to do this? Change Access Code Access code will be changed on this card only Reset to Factory Settings @@ -348,7 +346,7 @@ Swap Swap of %1$s to %2$s Other tokens - Choose token + Choose token Your tokens not available Tangem diff --git a/core/res/src/main/res/values-it/strings.xml b/core/res/src/main/res/values-it/strings.xml index 44aa7b8d83..c754f9efc9 100644 --- a/core/res/src/main/res/values-it/strings.xml +++ b/core/res/src/main/res/values-it/strings.xml @@ -24,8 +24,6 @@ Keep the wallet in the app Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card. App Settings - Reset - Are you sure you want to do this? Change Access Code Access code will be changed on this card only Reset to Factory Settings @@ -348,7 +346,7 @@ Swap Swap of %1$s to %2$s Other tokens - Choose token + Choose token Your tokens not available Tangem diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index ffc2e011c1..aaaa581539 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -24,8 +24,6 @@ Cохранение кошелька Подключите функцию привязки карты в приложении, а также возможность биометрической аутентификации. Подпись транзакции все так же потребует карту. Настройки приложения - Сбросить - Вы уверены, что хотите это сделать? Смена кода доступа Код доступа будет изменен только на данной карте Сброс к заводским настройкам @@ -348,7 +346,7 @@ Обмен Обмен %1$s на %2$s Другие токены - Выберите токен + Выберите токен Ваши токены не доступен Tangem diff --git a/core/res/src/main/res/values-zh-rTW/strings-blockchain.xml b/core/res/src/main/res/values-zh-rTW/strings-blockchain.xml new file mode 100644 index 0000000000..064dc69503 --- /dev/null +++ b/core/res/src/main/res/values-zh-rTW/strings-blockchain.xml @@ -0,0 +1,23 @@ + + + 默認 + 遺留資產 + 獲取費用失敗 + 加載 %1$s+ %2$s 以創建帳戶 + 目標帳戶未激活。發送 %s 或更多以激活帳戶。 + 區塊鏈內部錯誤 + 最小數量是 %s + 更動太小 + 餘額不足 + 無效費用 + 最低餘額為 %s + 未創建目標帳戶。發送金額應為 %s + 費用或更多 + 未知錯誤 + 金額超出餘額 + 無效金額 + 費用超出餘額 + 總金額超出餘額 + 不,全部發送 + 減少 %s XTZ + 為避免下次給錢包充值時支付增加的佣金,請將金額減少 %s XTZ + diff --git a/core/res/src/main/res/values-zh-rTW/strings.xml b/core/res/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000000..ad0a5ac18f --- /dev/null +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,468 @@ + + + 添加自定義代幣 + 僅將 %1$s (%2$s) 從 %3$s 網絡發送到此地址。使用其他代幣和網絡可能會導致資金損失 + 請求支持 + 發送反饋 + 此卡過去已經充值並簽署過交易。如果您從不受信任的來源收到此卡,請考慮立即提取所有資金。如果是您的卡,則無需擔心 + 此功能不在展示模式中提供 + 您正在展示模式。所有資產皆不是真的 + 您掃描的卡是開發卡。不要用它作為付款方式 + 原因:%s + 無法發送交易 + 請注意代幣在不同的網路有不同的地址。請再次檢查正確的地址 + 此卡不支持Solana網路上的代幣因為韌體限制 + 這張卡不是不記名票據。我們目前無法將卡上的簽名計數與區塊鏈上的信息相匹配。這很正常,但在極少數情況下可能意味著以前的持有人正在阻止離線簽名,這是安全問題。不要接受此卡作為您不信任的人的實物付款。它在所有其他方面都非常安全。Tangem 是唯一提供簽名計數保護的硬件錢包。 + 有困難在掃描卡上嗎? + 此卡不適用於此app + 轉到設置以在 Tangem App 中啟用生物識別身份驗證 + 啟用生物辨識 + 這將刪除所有保存的錢包訪問代碼。對錢包的任何進一步操作都需要提交訪問代碼。 + 移除已保存的卡會刪除所有已保存的錢包及其訪問密碼 + 保存訪問密碼 + 在與您的卡進行交互時,將要求進行生物識別身份驗證,而不是訪問密碼 + 將錢包保存在應用程序中 + 啟用以將所有錢包鏈接到 Tangem 應用程序。解鎖應用程序需要生物識別身份驗證。交易簽名需要輕觸您的 Tangem 卡片 + APP設置 + 更改訪問密碼 + 訪問密碼將僅在此卡上更改 + 回復至原廠設置 + 安全模式 + 卡片設置 + Tangem 機器人 + 接受 + 添加 + 注意 + 餘額: %s + 生物識別 + 生物 + 您尚未授予相機訪問權限,請更改您的隱私設置 + 刪除 + 關閉 + 繼續 + 複製 + 創造 + 刪除 + 斷開連接 + 完成 + 允許 + 錯誤 + + OK + 主卡片 + 拒絕 + 重試 + 保存設置 + 搜索 + 伺服器不可用,請稍後在試 + 分享 + 簽署 + 簽署和發送 + 開始 + 提交 + 成功 + 條款和條件 + 我了解 + 警告 + + 已複製代幣地址 + 支持的網路 + 代幣地址 + 無效地址 + 衍生路徑錯誤 + 請選擇網路 + 必填 + 十進制數必須是有效整數,不大於 %d + 小數點 + 默認 + BIP44 幣種 + 如 USD Coin + 名稱 + 未選擇 + 網路 + 如 USDC + 代幣符號 + 此代幣/網路已被加入 + 請注意代幣可以被任何人創造。小心詐騙 + 交談 + 訪問密碼 + 在掃描卡之前,您必須提交正確的訪問密碼 + 長按 + 此機制可防止對卡進行鄰近攻擊。它將強制執行命令的接收和執行之間的延遲。 + 密碼 + 在執行任何需要更改卡狀態的命令之前,您必須輸入密碼 + 推薦計畫 + 隱私政策 + %s hashes + 卡片使用條款 + 卡號 + 連結更多錢包 + App Currency + 發行人 + 發送反饋 + 簽署 + 細節 + 檢查您的網路連接或切換到其他網絡 + 服務條款 + 糟糕,當前版本的應用程序無法使用此卡,請檢查更新 + 您使用了另一個錢包中的卡。點按與此錢包關聯的卡片 + 您收到 + 您發送 + 以下信息是可選的。如果不想共享,可以將其刪除 + 告訴我們您缺少哪些功能,我們會盡力幫助您 + 請告訴我們你有什麼卡 + 嗨! 幫助團隊, + 請告訴我們更多有關您的問題的信息。提供任何小細節都會帶來幫助 + 我的建議 + 無法掃卡 + 反饋 + Tangem反饋 + 無法發送交易 + 訂購 + 要更改訪問密碼,請完全按照上圖所示連接手機和卡片 + 要更改密碼,請完全按照上圖所示連接手機和卡 + 要創建錢包,請完全按照上圖所示連接手機和卡 + 點擊掃描 + 點擊簽名 + 點按卡片 + 內部錯誤:找不到錢包管理器 + 管理代幣 + 為了保護您的資產,我們建議您執行此程序 + 您的錢包尚未備份 + 總餘額 + 該金額不包括您的部分資金 + 要訪問所有的網路您需要掃描卡片 + 掃描卡片 + 代幣 + 您必須設置一個單一的訪問代碼來保護您的所有錢包。 + 保護 + 您可以稍後在每張卡上設置單獨的訪問密碼 + 個人化 + 門禁密碼可以用聯動卡恢復,不要把所有卡都放在一個地方。 + 恢復 + 選擇您想要的任何單詞、短語或數字作為您的訪問代碼。 + 建立訪問密碼 + 重新輸入訪問密碼 + 訪問代碼的長度必須至少為 4 個字符 + 輸入的訪問密碼與初始訪問密碼不匹配 + 您已添加一張備用卡。備份過程完成後,您將無法添加更多備份卡。如果您還有一張卡,請將其添加到備份中。您想繼續備份過程嗎? + 備份過程已部分完成。你現在不能退出 + 餘額 + 添加備用卡 + 掃描卡片 #%d + 立即備份 + 掃描主卡 + 獲取 + 繼續至我的錢包 + 完成備份過程 + 通過Utorg驗證 + 刷新 + 設置PIN碼 + 接收貨幣 + 註冊 + 掃描主卡 + 暫時略過 + 它是如何運作的? + 支援 + 讓我們生成您卡上的所有密鑰並創建一個安全的錢包 + 創建錢包 + 創造錢包 + 您的卡已激活並可以使用 + 成功! + 這此情況,您必須要重新開始 + 您想要離開啟用程序嗎? + 開始 + 驗證身分 + KYC + PIN 碼 + 連接 + 創建備份 + 點擊 SaltPay 卡 + 要開始備份過程,您必須添加 Tangem 卡片作為備份 + 通過創建訪問密碼完成備份 + 點擊 Tangem 卡片 + 沒有備份卡片 + 備份卡片已準備完成 + 準備SaltPay卡 + 要開始,只需將 wxDAI 獲取到您的錢包 + 這會花上幾秒 + 請查看Email已獲得更多指示 + 要開始使用您的卡,您必須通過 KYC驗證 + 請等待驗證完成,您將收到電子郵件通知。通常最多需要 1 小時。您可以關閉該應用程序,稍後再回來 + 要開始備份過程,最多可添加兩張備份卡。 + 您可以再添加一張卡或完成備份過程 + 為您的 SaltPay 卡設置 PIN 碼 + 將您的卡片連接到去中心化支付系統 + 準備編號為 %s 的備份卡 + 準備主卡 + 準備編號為 %s 的主卡 + 恭喜! 您的第一張支付加密卡已啟用! + 您的錢包卡已配置完畢,可以使用了 + 已添加至最大數量。完成備份過程 + 聯繫客服 + 啟用卡片 + 備份卡 #%d + 獲取%s + 獲取中 + 有東西出錯了 + 確認你的身分 + KYC 認證中 + 沒有備用卡 + 添加了一張備用卡 + PIN 碼 + 連接你的錢包 + 準備好你的卡片 + 添加了兩張備用卡 + 要開始使用,只需為錢包充值任意金額 + 要開始,只需為錢包充值超過 %1$s %2$s + 購買加密貨幣 + 顯示錢包地址 + 充值你的錢包 + 結對過程已部分完成。你現在不能退出 + 如果創建錢包的過程以任何方式中斷,您將得重新開始 + 您最多可以備份另外兩張空白的 Tangem 錢包卡。 + 可以使用其中一張備用卡恢復訪問密碼 + 所有備用卡都可以使用相同的密鑰作為全功能使用。 + 您將能夠設置訪問密碼來保護您的錢包 + 備援錢包 + 訪問密碼還原 + 相同的卡片 + 訪問密碼 + 參與 + 無法加載有關推薦計劃的消息。請稍後再試 + 無法加載有關推薦計劃的消息。原因:%s。請稍後再試 + 無法處理您的請求。原因:%s。請稍後再試。無如果問題仍然存在—請隨時聯繫服務人員 + 您的朋友買 + 會得到 + 對於你的朋友在你的 %1$s 網絡地址%2$s 上購買的每個錢包 + + 得到 + 當在 tangem.com購買卡片 + %s 折扣 + 你的朋友 + 個人促銷碼已複製! + 您的優惠碼 + 以折扣價購買 Tangem 錢包!%s + 推薦您的好友至Tangem + 你接受了 + 點擊此按鈕即表示您接受 + 在推薦計劃 + 請持有卡片直至操作完成 + 重置卡片 + 我了解執行此操作後,我將無法再訪問當前錢包 + 恢復原廠設置將從所選卡中完全刪除錢包。您將無法恢復當前錢包或使用卡恢復訪問密碼 + 恢復原廠設置將從所選卡中完全刪除錢包並將其從應用程序中刪除。您將無法恢復當前錢包 + 您有其他國家的銀行卡或銀聯卡嗎? + 目前不接受俄羅斯銀行卡 + 輕觸帶有 visa 標誌的卡片 + 注意 + 請聯繫客服 + 沒有激活資金 + 這樣的 PIN 很容易被暴力破解 + 四個相同的數字不安全 + 登錄應用程序並在不掃描卡片的情況下檢查您的資產 + 訪問應用程序 + 允許使用生物辨識 + 將要求生物識別而不是訪問密碼來與您的錢包進行交互 + 訪問密碼 + 您好像禁用了生物識別,有必要保存錢包 + 啟用生物識別授權 + 您想使用生物識別技術嗎? + 請注意,用您的資金進行交易仍需要您的卡片 + 掃卡失敗。再試一次 + 掃描卡片 + 掃描卡片以更改其設置。這些更改只會影響您掃描過的卡,不會影響綁定到您錢包的其他卡。 + 準備好您的卡! + 搜尋代幣 + 數量 + 地址 + 地址或 PayString + 地址與錢包地址相同 + PayString 未註冊 + PayString 請求失敗 + PayString 不被區塊鏈支持 + 標籤無效。它不會被添加到交易中 + Memo無效。 它不會被添加到交易中 + Tag + Memo + 包含費用 + 費用 + + 正常 + 優先 + 最大值 + 網路費 + 發送 + 發送 %s + 總計 + %1$s 和 %2$s 將被發送 + ≈ %1$s (費用包含: %2$s) + %s 將被發送 + 交易已成功簽署並發送至區塊鏈節點。錢包餘額稍後更新 + 無效地址 + 現在購買 + 免費 + 輸入折扣碼 + Tangem 冷錢包 + 其他付款方式 + 運送 + 總計 + Solana 網絡每 2 天收取 %1$s 的費用。無法付此費用的帳戶將從網絡中清除。向您的帳戶存入超過 %2$s 即可免費使用 + 安全地存儲您的加密貨幣,同時將私鑰保存在您的卡中 + 創新式的硬體錢包 + 最多 + 3張實體卡片 + 到一個錢包 + 更多的安全備份 + 一個冷錢包,可同時將您的比特幣、以太幣和其他幣種-全部存在一張卡中 + 千種虛擬貨幣 + 隨時隨地使用它,不需要接線或電池,只需要你的卡片和手機 + 適合每個人的冷錢包 + 借入 + 購買 + 交易 + 借出 + 付款 + 發送 + 保存 + 認識Tangem + 交易、購買NFT、自由穿梭於100+去中心化服務 + 兼容DeFi + 有錯誤。請再試一遍 + 賦予權限 + 餘額不足 + 您的 %1$s 錢包中沒有足夠的資金來創建交易。首先為您的 %2$s 錢包充值 + 交易進行中... + 等待中 + 允許 + 賦予權限 + 數量 %s + 花費者 + 您的錢包 + 要繼續,您需要允許 1inch 智能合約使用您的 %s + 許可和交換 + 在瀏覽器中查看 + 進行中 + 交換 + 交易 %s 至 + 其他代幣 + 選擇代幣 + 您的代幣 + 無法使用 + Tangem + 隱藏 + 您即將在主屏幕上隱藏此代幣。您可以隨時通過管理代幣頁面將其添加回來。 + 隱藏 %s + 隱藏代幣 + %1$s 是 %2$s 網絡中的代幣, 要進行 %3$s 交易,您需要存入一些 %4$s (%5$s) 以支付網絡費用 + 請等待 %s 交易完成才能發送資金 + %1$s 代幣是 %2$s 網絡上的主要貨幣,只要列表中還有該網絡上的其他代幣,它就無法被隱藏。 + 無法隱藏 %s + 無費用 + 您掃描了同一張卡片。要創建雙錢包,您需要掃描編號為 %d 的卡 + 這一個是你手裡拿著的,另一個是編號為 %s 的,這兩張卡都可以用來從這個錢包中提取資金 + 一個錢包,兩張卡片 + 掃描卡片 #%s + 創建錢包 + 掃描 #%s 雙胞胎卡 + 準備卡片 + Tangem雙胞胎卡 + 這個動作是不可逆的。您將無法訪問舊錢包 + 添加新錢包 + 已選擇 %d + 此錢包已保存,您可以再添加一個 + 多幣種 + 錢包名稱 + 重新命名錢包 + 單一幣種 + 我的錢包 + 用 %s 解鎖全部 + 創建支付字符串 + 探索地址 + 網路無法使用 + 區塊鍊無法使用。稍後再試 + 餘額加載中 + 掃描卡片 + 交易進行中 + 檢視餘額 + 動作 + 購買 + 創造錢包 + 銷售 + 發送 + 交易 + 您想要購買或賣出交易貨幣? + 請求籤署消息。%s + Dapp %1$s,請求\n簽署 BNB 交易。\n%2$s + %1$s 的交易訂單\n價格: %2$s\n接收金額:%3$s\n支付數量: %4$s + 交易明細:\n從: %1$s\n到: %2$s\n數量: %3$s + 剪貼板包含 WalletConnect 代碼。使用複制的值或掃描二維碼 + 請求為 %1$s 創建交易\n%2$s\n\n數量: %3$s\n費用: %4$s\n全部的: %5$s\n餘額: %6$s + 無法交易,無足夠資金 + 未能建立 WalletConnect 連接。請稍後再試 + 無法建立 WalletConnect 連接:超時錯誤。請稍後再試 + 由於技術問題,無法與此 Dapp 建立連接 + 沒有 %s 網路,請先加入後再試一次 + 沒有打開中的WalletConnect連接 + Ooops, 沒有連接 + 打開連接 + 從剪貼板貼上 + 請求開始會話\n%1$s\n\n網絡: %2$s\n\n網址:%3$s + 無法完成執行,您已經使用此參數建立了 WalletConnect 連接 + 掃描新密碼 + 此卡不能用於建立 WalletConnect 連接 + 不支持此網絡。請選擇其他網絡 + 選擇網路 + WalletConnect 連接 + 連結到Dapps + WalletConnect + 創建支付字符串 + $payid.tangem.com + 首先輸入所需的PayString + 此 PayString 已存在。嘗試用不同的 + 創建 PayString 時的錯誤回復 + 支付字符串名稱 + 您的 PayString 是您獨有的信息,例如您的電話號碼、電子郵件或 ABN + %s 網路 + 空白卡片 + 創建錢包以開始使用Tangem + 創建雙胞胎錢包 + 在兩張卡上生成錢包密鑰以開始使用您的雙胞胎 + 帳號尚未被創造 + 不支持此卡 + 您的 Tangem 卡是為與不同的應用程序一起工作而設計的。請查看卡片上的名稱和說明,並安裝正確的應用程序 + 地址已復製到剪貼板 + 無網路 + 接收中 + 來自%s + 發送中 + 至%s + Tangem + 可以更好 + 了解更多 + 了解 + 真的很酷! + %1$s 網絡有一個 Existential Deposit 的概念。如果您的帳戶低於 %2$s,它將被停用,所有剩餘資金將被銷毀 + 此卡可能是生產樣本或偽造品 + 認證檢查失敗 + 重要安全信息\U26A0 + 此卡上只有 %s 個簽名可用。您必須提取所有資金 + 你喜歡 Tangem 嗎? + 一個問題 + 此卡過去曾簽署過交易 + 這是一張測試網卡。不要接受它作為付款。 此卡只能用於測試和開發目的 + 捨棄 + 您有一個備份中斷了,您想繼續嗎? + 是的,恢復 + 捨棄 + 如果您現在要放棄備份,則必須將卡重置為出廠設置才能重新開始 + 恢復備份 + 此動作不可逆 + 使用 %s 登錄 + 掃描卡片 + 使用 %s 或掃描卡片以訪問該應用程序 + 歡迎回來! + + + %s + diff --git a/core/res/src/main/res/values-zh-rTW/strings_plurals.xml b/core/res/src/main/res/values-zh-rTW/strings_plurals.xml new file mode 100644 index 0000000000..80911976be --- /dev/null +++ b/core/res/src/main/res/values-zh-rTW/strings_plurals.xml @@ -0,0 +1,13 @@ + + + %d 卡片 + + + + %d 代幣 + + + + %d 錢包 + + diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index b410d6bc44..72c3273dae 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -24,8 +24,6 @@ Keep the wallet in the app Enable to link all the wallets to Tangem app. Biometric authentication will be required for unlocking the app. Transaction signing requires tapping your Tangem card. App Settings - Reset - Are you sure you want to do this? Change Access Code Access code will be changed on this card only Reset to Factory Settings @@ -348,7 +346,7 @@ Swap Swap of %1$s to %2$s Other tokens - Choose token + Choose token Your tokens not available Tangem @@ -465,6 +463,7 @@ Scan card Use %s or scan a card to access the app Welcome back! + %s diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 9edaf86b9a..6a779df7b5 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -599,8 +599,14 @@ internal class SwapInteractorImpl @Inject constructor( private const val INFINITY_SYMBOL = "∞" private val ONE_INCH_SUPPORTED_NETWORKS = listOf( - "ethereum", "binance-smart-chain", "polygon-pos", - "optimistic-ethereum", "arbitrum-one", "xdai", "avalanche", "fantom", + "ethereum", + "binance-smart-chain", + "polygon-pos", + "optimistic-ethereum", + "arbitrum-one", + "xdai", + "avalanche", + "fantom", ) } } \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt index f086d605b3..9d83769508 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt @@ -52,7 +52,7 @@ fun SwapSelectTokenScreen(state: SwapSelectTokenStateHolder, onBack: () -> Unit) }, topBar = { ExpandableSearchView( - title = stringResource(R.string.swapping_token_list_your_title), + title = stringResource(R.string.swapping_token_list_title), onBackClick = onBack, placeholderSearchText = stringResource(id = R.string.search_tokens_title), onSearchChange = state.onSearchEntered,