diff --git a/README.md b/README.md index 4df6e8660b..3d667fafd1 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ ## About Next gen application for Polkadot & Kusama ecosystem, transparent & community-oriented, focused on convenient UX/UI, fast performance & security. Nova Wallet aims to provide as many Polkadot ecosystem features as possible in a form of mobile app, unbiased to any network & without any restrictions/limits to the users. -Developed by former Fearless Wallet team & based on open source work under Apache 2.0 license. +Developed by the former Fearless Wallet team & based on open-source work under Apache 2.0 license. ## License Nova Wallet Android is available under the Apache 2.0 license. See the LICENSE file for more info. -© Novasama Technologies GmbH 2023 \ No newline at end of file +© Novasama Technologies GmbH 2023 diff --git a/app/src/androidTest/java/io/novafoundation/nova/GovernanceIntegrationTest.kt b/app/src/androidTest/java/io/novafoundation/nova/GovernanceIntegrationTest.kt index b449ae0a01..13c0b09123 100644 --- a/app/src/androidTest/java/io/novafoundation/nova/GovernanceIntegrationTest.kt +++ b/app/src/androidTest/java/io/novafoundation/nova/GovernanceIntegrationTest.kt @@ -28,6 +28,8 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import org.junit.Test import java.math.BigInteger +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers class GovernanceIntegrationTest : BaseIntegrationTest() { @@ -128,7 +130,7 @@ class GovernanceIntegrationTest : BaseIntegrationTest() { val chain = chain() val selectedGovernance = supportedGovernanceOption(chain, Chain.Governance.V1) - val referendumDetails = referendumDetailsInteractor.referendumDetailsFlow(referendumId, selectedGovernance, accountId) + val referendumDetails = referendumDetailsInteractor.referendumDetailsFlow(referendumId, selectedGovernance, accountId, CoroutineScope(Dispatchers.Main)) .first() Log.d(this@GovernanceIntegrationTest.LOG_TAG, referendumDetails.toString()) diff --git a/build.gradle b/build.gradle index b0db7f24e1..29e27fa8e9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ buildscript { ext { // App version - versionName = '8.3.1' - versionCode = 150 + versionName = '8.4.0' + versionCode = 152 applicationId = "io.novafoundation.nova" releaseApplicationSuffix = "market" @@ -140,7 +140,7 @@ buildscript { // lifecycle scopes lifeCycleKtxDep = "androidx.lifecycle:lifecycle-runtime-ktx:$architectureComponentVersion" - permissionsDep = "com.github.florent37:runtime-permission-kotlin:$permissionsVersion" + permissionsDep = "com.github.florent37:RuntimePermission:$permissionsVersion" roomDep = "androidx.room:room-runtime:$roomVersion" roomKtxDep = "androidx.room:room-ktx:$roomVersion" diff --git a/common/src/main/java/io/novafoundation/nova/common/domain/ExtendedLoadingState.kt b/common/src/main/java/io/novafoundation/nova/common/domain/ExtendedLoadingState.kt index 683e12c5e2..55f95cb1e5 100644 --- a/common/src/main/java/io/novafoundation/nova/common/domain/ExtendedLoadingState.kt +++ b/common/src/main/java/io/novafoundation/nova/common/domain/ExtendedLoadingState.kt @@ -3,6 +3,7 @@ package io.novafoundation.nova.common.domain import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.transform sealed class ExtendedLoadingState { @@ -19,6 +20,14 @@ inline fun Flow>.mapLoading(crossinline mapper: s return map { loadingState -> loadingState.map { mapper(it) } } } +fun Flow>.filterLoaded(): Flow { + return transform { loadingState -> + if (loadingState is ExtendedLoadingState.Loaded) { + emit(loadingState.data) + } + } +} + inline fun ExtendedLoadingState.map(mapper: (T) -> R): ExtendedLoadingState { return when (this) { is ExtendedLoadingState.Loading -> this @@ -33,6 +42,11 @@ val ExtendedLoadingState.dataOrNull: T? else -> null } +fun ExtendedLoadingState.loadedAndEmpty(): Boolean = when (this) { + is ExtendedLoadingState.Loaded -> data == null + else -> false +} + fun loadedNothing(): ExtendedLoadingState { return ExtendedLoadingState.Loaded(null) } diff --git a/common/src/main/java/io/novafoundation/nova/common/presentation/DescriptiveButtonState.kt b/common/src/main/java/io/novafoundation/nova/common/presentation/DescriptiveButtonState.kt index fbd241b942..392ad2c2ce 100644 --- a/common/src/main/java/io/novafoundation/nova/common/presentation/DescriptiveButtonState.kt +++ b/common/src/main/java/io/novafoundation/nova/common/presentation/DescriptiveButtonState.kt @@ -9,4 +9,6 @@ sealed class DescriptiveButtonState { object Loading : DescriptiveButtonState() object Gone : DescriptiveButtonState() + + object Invisible : DescriptiveButtonState() } diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/Ext.kt b/common/src/main/java/io/novafoundation/nova/common/utils/Ext.kt index 49621ba902..4c949a28ca 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/Ext.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/Ext.kt @@ -88,3 +88,5 @@ fun CoroutineScope.childScope(supervised: Boolean = true): CoroutineScope { fun Int.asBoolean() = this != 0 fun Boolean?.orFalse() = this ?: false + +fun Boolean?.orTrue() = this ?: true diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/FlowExt.kt b/common/src/main/java/io/novafoundation/nova/common/utils/FlowExt.kt index c0ebdf200a..c6ed5ae41c 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/FlowExt.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/FlowExt.kt @@ -187,6 +187,8 @@ fun Flow.withLoadingShared(sourceSupplier: suspend (T) -> Flow): Fl suspend inline fun Flow>.firstLoaded(): T = first { it.dataOrNull != null }.dataOrNull as T +suspend fun Flow>.firstIfLoaded(): T? = first().dataOrNull + /** * Modifies flow so that it firstly emits [LoadingState.Loading] state. * Then emits each element from upstream wrapped into [LoadingState.Loaded] state. diff --git a/common/src/main/java/io/novafoundation/nova/common/utils/KotlinExt.kt b/common/src/main/java/io/novafoundation/nova/common/utils/KotlinExt.kt index 4cea3e8b25..c0e40bfb69 100644 --- a/common/src/main/java/io/novafoundation/nova/common/utils/KotlinExt.kt +++ b/common/src/main/java/io/novafoundation/nova/common/utils/KotlinExt.kt @@ -17,6 +17,7 @@ import java.io.InputStream import java.math.BigDecimal import java.math.BigInteger import java.math.MathContext +import java.math.RoundingMode import java.util.Calendar import java.util.Collections import java.util.Date @@ -179,6 +180,35 @@ fun BigInteger.atLeastZero() = coerceAtLeast(BigInteger.ZERO) fun BigDecimal.atLeastZero() = coerceAtLeast(BigDecimal.ZERO) +fun BigDecimal.lessEpsilon(): BigDecimal = when { + this.isZero -> this + else -> this.subtract(BigInteger.ONE.toBigDecimal(scale = MathContext.DECIMAL64.precision)) +} + +fun BigDecimal.divideOrNull(value: BigDecimal): BigDecimal? = try { + this.divide(value) +} catch (e: ArithmeticException) { + null +} + +fun BigDecimal.divideOrNull(value: BigDecimal, mathContext: MathContext): BigDecimal? = try { + this.divide(value, mathContext) +} catch (e: ArithmeticException) { + null +} + +fun BigDecimal.divideOrNull(value: BigDecimal, roundingMode: RoundingMode): BigDecimal? = try { + this.divide(value, roundingMode) +} catch (e: ArithmeticException) { + null +} + +fun BigDecimal.coerceInOrNull(from: BigDecimal, to: BigDecimal): BigDecimal? = if (this >= from && this <= to) { + this +} else { + null +} + fun Long.daysFromMillis() = TimeUnit.MILLISECONDS.toDays(this) inline fun Collection.sumByBigInteger(extractor: (T) -> BigInteger) = fold(BigInteger.ZERO) { acc, element -> diff --git a/common/src/main/java/io/novafoundation/nova/common/view/PrimaryButton.kt b/common/src/main/java/io/novafoundation/nova/common/view/PrimaryButton.kt index 17eab75f30..23c0dc22c1 100644 --- a/common/src/main/java/io/novafoundation/nova/common/view/PrimaryButton.kt +++ b/common/src/main/java/io/novafoundation/nova/common/view/PrimaryButton.kt @@ -10,6 +10,7 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.ContextThemeWrapper +import android.view.View import androidx.annotation.ColorInt import androidx.annotation.StyleRes import androidx.appcompat.widget.AppCompatTextView @@ -23,7 +24,6 @@ import io.novafoundation.nova.common.presentation.DescriptiveButtonState import io.novafoundation.nova.common.utils.dp import io.novafoundation.nova.common.utils.getColorFromAttr import io.novafoundation.nova.common.utils.getEnum -import io.novafoundation.nova.common.utils.setVisible import io.novafoundation.nova.common.utils.useAttributes import io.novafoundation.nova.common.view.shape.addRipple import io.novafoundation.nova.common.view.shape.getCornersStateDrawable @@ -33,7 +33,8 @@ enum class ButtonState { NORMAL, DISABLED, PROGRESS, - GONE + GONE, + INVISIBLE } private const val ICON_SIZE_DP_DEFAULT = 24 @@ -172,7 +173,12 @@ class PrimaryButton @JvmOverloads constructor( fun setState(state: ButtonState) { isEnabled = state == ButtonState.NORMAL - setVisible(state != ButtonState.GONE) + + visibility = when (state) { + ButtonState.GONE -> View.GONE + ButtonState.INVISIBLE -> View.INVISIBLE + else -> View.VISIBLE + } if (state == ButtonState.PROGRESS) { checkPreparedForProgress() @@ -282,5 +288,9 @@ fun PrimaryButton.setState(descriptiveButtonState: DescriptiveButtonState) { DescriptiveButtonState.Gone -> { setState(ButtonState.GONE) } + + DescriptiveButtonState.Invisible -> { + setState(ButtonState.INVISIBLE) + } } } diff --git a/common/src/main/java/io/novafoundation/nova/common/view/PrimaryButtonV2.kt b/common/src/main/java/io/novafoundation/nova/common/view/PrimaryButtonV2.kt new file mode 100644 index 0000000000..93722991d0 --- /dev/null +++ b/common/src/main/java/io/novafoundation/nova/common/view/PrimaryButtonV2.kt @@ -0,0 +1,88 @@ +package io.novafoundation.nova.common.view + +import android.content.Context +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.View +import androidx.lifecycle.LifecycleOwner +import com.github.razir.progressbutton.DrawableButton +import com.github.razir.progressbutton.bindProgressButton +import com.github.razir.progressbutton.hideProgress +import com.github.razir.progressbutton.isProgressActive +import com.github.razir.progressbutton.showProgress +import com.google.android.material.button.MaterialButton +import io.novafoundation.nova.common.presentation.DescriptiveButtonState + +class PrimaryButtonV2 @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0, +) : MaterialButton(context, attrs, defStyle) { + + private var cachedIcon: Drawable? = null + private var cachedText: String? = null + + private var preparedForProgress = false + + fun prepareForProgress(lifecycleOwner: LifecycleOwner) { + lifecycleOwner.bindProgressButton(this) + + preparedForProgress = true + } + + fun checkPreparedForProgress() { + if (!preparedForProgress) { + throw IllegalArgumentException("You must call prepareForProgress() first!") + } + } + + fun showProgress(show: Boolean) { + isEnabled = !show + + if (show) { + checkPreparedForProgress() + + showButtonProgress() + } else { + hideProgress() + } + } + + fun hideButtonProgress() { + if (isProgressActive()) { + icon = cachedIcon + hideProgress(cachedText) + } + } + + fun showButtonProgress() { + if (isProgressActive()) return + + cachedIcon = icon + cachedText = text.toString() + + icon = null + showProgress { + progressColor = currentTextColor + gravity = DrawableButton.GRAVITY_CENTER + } + } +} + +fun PrimaryButtonV2.setState(state: DescriptiveButtonState) { + isEnabled = state is DescriptiveButtonState.Enabled + + visibility = when (state) { + DescriptiveButtonState.Gone -> View.GONE + DescriptiveButtonState.Invisible -> View.INVISIBLE + else -> View.VISIBLE + } + + if (state == DescriptiveButtonState.Loading) { + checkPreparedForProgress() + + showButtonProgress() + } else { + hideButtonProgress() + } +} diff --git a/common/src/main/res/color/selector_button_background_negative.xml b/common/src/main/res/color/selector_button_background_negative.xml new file mode 100644 index 0000000000..4d1561e4b2 --- /dev/null +++ b/common/src/main/res/color/selector_button_background_negative.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/color/selector_button_background_positive.xml b/common/src/main/res/color/selector_button_background_positive.xml new file mode 100644 index 0000000000..e08e9b3ef4 --- /dev/null +++ b/common/src/main/res/color/selector_button_background_positive.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/color/selector_button_background_primary.xml b/common/src/main/res/color/selector_button_background_primary.xml new file mode 100644 index 0000000000..196990eba4 --- /dev/null +++ b/common/src/main/res/color/selector_button_background_primary.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/color/selector_button_background_secondary.xml b/common/src/main/res/color/selector_button_background_secondary.xml new file mode 100644 index 0000000000..0c64a6d22d --- /dev/null +++ b/common/src/main/res/color/selector_button_background_secondary.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/ic_abstain_vote.xml b/common/src/main/res/drawable/ic_abstain_vote.xml new file mode 100644 index 0000000000..9fcd8e5629 --- /dev/null +++ b/common/src/main/res/drawable/ic_abstain_vote.xml @@ -0,0 +1,9 @@ + + + diff --git a/common/src/main/res/drawable/ic_thumbs_down_filled.xml b/common/src/main/res/drawable/ic_thumbs_down_filled.xml new file mode 100644 index 0000000000..e970e58ea5 --- /dev/null +++ b/common/src/main/res/drawable/ic_thumbs_down_filled.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/common/src/main/res/drawable/ic_thumbs_up_filled.xml b/common/src/main/res/drawable/ic_thumbs_up_filled.xml new file mode 100644 index 0000000000..93d829d9e9 --- /dev/null +++ b/common/src/main/res/drawable/ic_thumbs_up_filled.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/common/src/main/res/values-es/strings.xml b/common/src/main/res/values-es/strings.xml index 6bc5fb49c7..44b635371d 100644 --- a/common/src/main/res/values-es/strings.xml +++ b/common/src/main/res/values-es/strings.xml @@ -971,6 +971,9 @@ Buscar por título de referendo o ID Referendos Referendo no encontrado + Los votos de Abstención solo se pueden realizar con una convicción de 0.1x. ¿Votar con una convicción de 0.1x? + Actualización de la convicción + Votos de Abstención A favor: %s Usar el navegador Nova DApp Solo el proponente puede editar esta descripción y el título. Si posees la cuenta del proponente, visita Polkassembly y completa la información sobre tu propuesta @@ -1127,6 +1130,7 @@ Twitter Wiki Youtube + La convicción se establecerá en 0.1x cuando se Abstenga No puedes hacer stake con Staking Directo y Pools de Nominación al mismo tiempo Ya estás en staking Gestión avanzada de staking diff --git a/common/src/main/res/values-fr-rFR/strings.xml b/common/src/main/res/values-fr-rFR/strings.xml index 9506bf19e1..b097dcdf30 100644 --- a/common/src/main/res/values-fr-rFR/strings.xml +++ b/common/src/main/res/values-fr-rFR/strings.xml @@ -971,6 +971,9 @@ Recherche par titre de référendum ou ID Référendums Référendum non trouvé + Les votes d\'abstention ne peuvent se faire qu\'avec une conviction de 0,1x. Voter avec une conviction de 0,1x ? + Mise à jour de la conviction + Votes d\'abstention Oui : %s Utiliser le navigateur Nova DApp Seul le proposant peut modifier cette description et le titre. Si vous possédez le compte du proposant, visitez Polkassembly et remplissez les informations relatives à votre proposition. @@ -1127,6 +1130,7 @@ Twitter Wiki YouTube + La conviction sera fixée à 0,1x lorsque vous vous abstenez Vous ne pouvez pas staker avec le Stake direct et les Pools de Nomination en même temps Déjà staké Gestion avancée du staking diff --git a/common/src/main/res/values-in/strings.xml b/common/src/main/res/values-in/strings.xml index 8cca4e037a..622b95fa1f 100644 --- a/common/src/main/res/values-in/strings.xml +++ b/common/src/main/res/values-in/strings.xml @@ -964,6 +964,9 @@ Cari berdasarkan judul referendum atau ID Referenda Referendum tidak ditemukan + Suara Abstain hanya dapat dilakukan dengan keyakinan 0,1x. Pilih dengan keyakinan 0,1x? + Pembaruan keyakinan + Suara abstain Ya: %s Gunakan browser Nova DApp Hanya penyarankan yang dapat mengedit deskripsi dan judul ini. Jika Anda memiliki akun penyarankan, kunjungi Polkassembly dan isi informasi tentang proposal Anda @@ -1119,6 +1122,7 @@ Twitter Wiki Youtube + Keyakinan akan diatur ke 0,1x ketika Abstain Anda tidak dapat melakukan staking dengan Staking Langsung dan Pool Nominasi pada saat yang sama Sudah melakukan staking Pengelolaan Staking lanjutan diff --git a/common/src/main/res/values-it/strings.xml b/common/src/main/res/values-it/strings.xml index 0016756163..d8bf094ac5 100644 --- a/common/src/main/res/values-it/strings.xml +++ b/common/src/main/res/values-it/strings.xml @@ -971,6 +971,9 @@ Cerca per titolo o ID del referendum Referendum Referendum non trovato + I voti di astensione possono essere effettuati solo con una convinzione di 0.1x. Votare con una convinzione di 0.1x? + Aggiornamento della convinzione + Voti di astensione Affermativo: %s Usa il browser Nova DApp Solo il proponente può modificare questa descrizione e il titolo. Se possiedi l\'account del proponente, visita Polkassembly e inserisci informazioni sulla tua proposta @@ -1127,6 +1130,7 @@ Twitter Wiki Youtube + La convinzione sarà impostata a 0.1x quando Abstain Non puoi fare staking contemporaneamente con Direct Staking e con Nomination Pools Già in staking Gestione avanzata dello staking diff --git a/common/src/main/res/values-ja/strings.xml b/common/src/main/res/values-ja/strings.xml index 15388902f4..7c3a3acab7 100644 --- a/common/src/main/res/values-ja/strings.xml +++ b/common/src/main/res/values-ja/strings.xml @@ -964,6 +964,9 @@ レファレンダムのタイトルまたはIDで検索 レファレンダム レファレンダムが見つかりません + 棄権票は0.1xの信念でのみ行うことができます。0.1xの信念で投票しますか? + 信念の更新 + 棄権票 賛成: %s Nova DAppブラウザを使用 提案者のみがこの説明とタイトルを編集できます。提案者のアカウントをお持ちの場合は、Polkassembly にアクセスして提案に関する情報を入力してください @@ -1119,6 +1122,7 @@ Twitter ウィキ Youtube + 棄権時には信念が0.1xに設定されます Direct StakingとNomination Poolsを同時にステークすることはできません すでにステーキング中 高度なStaking管理 diff --git a/common/src/main/res/values-ko/strings.xml b/common/src/main/res/values-ko/strings.xml index 690b614cd6..82c8911a8c 100644 --- a/common/src/main/res/values-ko/strings.xml +++ b/common/src/main/res/values-ko/strings.xml @@ -964,6 +964,9 @@ 국민투표 제목 또는 ID로 검색 국민투표 국민투표를 찾을 수 없습니다 + 기권 투표는 0.1x 확신도로만 가능합니다. 0.1x 확신도로 투표하시겠습니까? + 확신도 업데이트 + 기권 투표 찬성: %s Nova DApp 브라우저 사용 제안자만 이 설명과 제목을 수정할 수 있습니다. 제안자의 계정을 소유하고 있다면, Polkassembly에 방문하여 제안에 대한 정보를 입력하세요. @@ -1119,6 +1122,7 @@ Twitter 위키 Youtube + 기권 시 확신도가 0.1x로 설정됩니다 직접 Staking과 Nomination Pools를 동시에 사용할 수 없습니다 이미 Staking 중 고급 Staking 관리 diff --git a/common/src/main/res/values-pl/strings.xml b/common/src/main/res/values-pl/strings.xml index 167e62ac1d..ba5b5fb24c 100644 --- a/common/src/main/res/values-pl/strings.xml +++ b/common/src/main/res/values-pl/strings.xml @@ -985,6 +985,9 @@ Szukaj według tytułu lub ID Referenda Referendum nie znaleziono + Wstrzymanie się od głosu może być dokonane tylko z 0.1x conviction. Głosować z 0.1x conviction? + Aktualizacja conviction + Głosy wstrzymujące się Za: %s Użyj przeglądarki Nova DApp Tylko wnioskodawca może edytować ten opis i tytuł. Jeśli posiadasz konto wnioskodawcy, odwiedź Polkassembly i uzupełnij informacje o swoim wniosku @@ -1143,6 +1146,7 @@ Twitter Wiki Youtube + Conviction zostanie ustawione na 0.1x podczas Wstrzymania się Nie możesz stake z Direct Staking i Nomination Pools jednocześnie Już staking Zaawansowane zarządzanie Staking diff --git a/common/src/main/res/values-pt/strings.xml b/common/src/main/res/values-pt/strings.xml index 8c6e9a7c0d..d565311f13 100644 --- a/common/src/main/res/values-pt/strings.xml +++ b/common/src/main/res/values-pt/strings.xml @@ -971,6 +971,9 @@ Buscar por título de referendo ou ID Referendos Referendo não encontrado + Os votos de abstenção só podem ser feitos com convicção de 0.1x. Votar com convicção de 0.1x? + Atualização de convicção + Votos de abstenção A favor: %s Use o navegador Nova DApp Somente o proponente pode editar esta descrição e o título. Se você possui a conta do proponente, visite o Polkassembly e preencha informações sobre sua proposta @@ -1127,6 +1130,7 @@ Twitter Wiki Youtube + A convicção será definida como 0.1x quando Abstain Você não pode fazer staking com Staking Direto e Pools de Nomeação ao mesmo tempo Já está em staking Gerenciamento avançado de staking diff --git a/common/src/main/res/values-ru/strings.xml b/common/src/main/res/values-ru/strings.xml index 808bbb6a09..9de3568f1f 100644 --- a/common/src/main/res/values-ru/strings.xml +++ b/common/src/main/res/values-ru/strings.xml @@ -985,6 +985,9 @@ Поиск по заголовку или ID Референдумы Референдум не найден + Голосование с воздержанием возможно только с убежденностью 0.1x. Проголосовать с убежденностью 0.1x? + Обновление убежденности + Голоса \\"воздержался\\" За: %s Используйте Nova DApp браузер Только автор референдума может редактировать это описание и заголовок. Если у вас есть доступ к аккаунту автора, посетите Polkassembly и заполните информацию о вашем референдуме @@ -1143,6 +1146,7 @@ Twitter Руководство пользователя Youtube + Убежденность будет установлена на 0.1x при Воздержании Невозможно стейкать напрямую и в пуле одновременно Уже застейкано Расширенное управление стейкингом diff --git a/common/src/main/res/values-tr/strings.xml b/common/src/main/res/values-tr/strings.xml index bf541afd71..9b96a975b6 100644 --- a/common/src/main/res/values-tr/strings.xml +++ b/common/src/main/res/values-tr/strings.xml @@ -971,6 +971,9 @@ Referandum başlığı veya ID ile ara Referandumlar Referandum bulunamadı + Çekimser oylar yalnızca 0.1x inançla yapılabilir. 0.1x inançla oy kullanmak ister misiniz? + İnanç Güncellemesi + Çekimser Oylar Evet: %s Nova DApp tarayıcısını kullanın Bu açıklamayı ve başlığı yalnızca öneren kişi düzenleyebilir. Eğer öneren kişinin hesabına erişiminiz varsa, Polkassembly\'i ziyaret edin ve teklifiniz hakkında bilgi doldurun @@ -1127,6 +1130,7 @@ Twitter Wiki Youtube + Çekinmelerde 0.1x olarak Ayarlanacak Aynı anda hem Doğrudan Stake hem de Nomination Havuzlarını kullanarak stake yapamazsınız Zaten stake edilmekte Gelişmiş staking yönetimi diff --git a/common/src/main/res/values-vi/strings.xml b/common/src/main/res/values-vi/strings.xml index f975011efb..d34bf2770b 100644 --- a/common/src/main/res/values-vi/strings.xml +++ b/common/src/main/res/values-vi/strings.xml @@ -964,6 +964,9 @@ Tìm kiếm theo tiêu đề hoặc ID cuộc trưng cầu dân ý Cuộc trưng cầu dân ý Không tìm thấy cuộc trưng cầu dân ý + Bỏ phiếu Abstain chỉ có thể thực hiện với độ xác tín 0.1x. Bỏ phiếu với độ xác tín 0.1x? + Cập nhật độ xác tín + Bỏ phiếu Abstain Đồng ý: %s Sử dụng trình duyệt Nova DApp Chỉ người đề xuất mới có thể chỉnh sửa mô tả và tiêu đề này. Nếu bạn sở hữu tài khoản của người đề xuất, hãy truy cập Polkassembly và điền thông tin về đề xuất của bạn. @@ -1119,6 +1122,7 @@ Twitter Wiki Youtube + Độ xác tín sẽ được đặt là 0.1x khi bỏ phiếu Abstain Bạn không thể Stake với Direct Staking và Nomination Pools cùng một lúc Đã staking Quản lý Stake nâng cao diff --git a/common/src/main/res/values-zh-rCN/strings.xml b/common/src/main/res/values-zh-rCN/strings.xml index 8a01162ed7..00b90a90b4 100644 --- a/common/src/main/res/values-zh-rCN/strings.xml +++ b/common/src/main/res/values-zh-rCN/strings.xml @@ -964,6 +964,9 @@ 按公投标题或 ID 搜索 公投 未找到公投 + 弃权票只能通过 0.1x 决心投票。是否以 0.1x 决心投票? + 更新决心 + 弃权投票 赞成:%s 使用 Nova DApp 浏览器 只有提案人可以编辑此描述和标题。如果您拥有提案人的账户,请访问 Polkassembly 并填写有关您提案的信息 @@ -1119,6 +1122,7 @@ Twitter 维基 Youtube + 弃权时将把决心设置为 0.1x 不能同时使用直接质押和提名池进行质押 已质押 高级质押管理 diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 0e6cb4c0f1..54adb3845f 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -1,6 +1,12 @@ + Conviction will be set to 0.1x when you vote Abstain + + Abstain votes + Conviction update + Abstain votes can only be done with 0.1x conviction. Vote with 0.1x conviction? + Warning! DApp is unknown Malicious DApps can withdraw all your funds. Always do your own research before using a DApp, granting permission, or sending funds out.\n\nIf someone is urging you to visit this DApp, it is likely a scam. When in doubt, please contact Nova Wallet support: %s. Open anyway diff --git a/common/src/main/res/values/styles.xml b/common/src/main/res/values/styles.xml index 15248a3865..9926e6da01 100644 --- a/common/src/main/res/values/styles.xml +++ b/common/src/main/res/values/styles.xml @@ -437,6 +437,52 @@ + + + + + + + + + + + + + + + + + +