Porównaj commity

...

28 Commity

Autor SHA1 Wiadomość Data
Tony Giorgio 5eebdb4f02
Merge 08f1b43908 into 6600a49564 2024-04-22 12:10:15 -03:00
Vitor Pamplona 6600a49564 Fixes the lack of refresh when adding hidden words in the Security filters 2024-04-18 19:34:15 -04:00
Vitor Pamplona cdb65640ba Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2024-04-18 17:18:29 -04:00
Vitor Pamplona 0c9e76eeaf adds content type on CardFeedView 2024-04-18 17:17:17 -04:00
Vitor Pamplona cfdbd0a9b6
Merge pull request #842 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2024-04-18 16:35:05 -04:00
Crowdin Bot 09b8178a7c New Crowdin translations by GitHub Action 2024-04-18 20:21:04 +00:00
Vitor Pamplona 5ea793eb51 Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2024-04-18 16:19:21 -04:00
Vitor Pamplona 8cf04967c3 Makes sure only one pepare is run for each video view. 2024-04-18 14:46:01 -04:00
Vitor Pamplona ef363457e8 Moves ClientController executor to a thread 2024-04-18 14:45:28 -04:00
Vitor Pamplona e87394f3f7
Merge pull request #841 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2024-04-18 10:49:50 -04:00
Crowdin Bot 86ebfe8564 New Crowdin translations by GitHub Action 2024-04-18 14:24:22 +00:00
Vitor Pamplona a2b3cfb991 Increases timeout to Tor connections 2024-04-18 10:22:19 -04:00
Vitor Pamplona 1b6aa621cd
Merge pull request #840 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2024-04-17 17:55:02 -04:00
Crowdin Bot b7f73c6eab New Crowdin translations by GitHub Action 2024-04-17 21:50:53 +00:00
Vitor Pamplona e35fb88ff1 Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2024-04-17 17:49:00 -04:00
Vitor Pamplona 6ecb3c8e1f - Improves Zap efficiency for large zap splits
- Adds a queue of commands while the relay connects.
- Makes sure only one connection per URL is made when doing splits
- Removes unecessary Amber calls when decrypting private zaps
2024-04-17 17:48:53 -04:00
Vitor Pamplona ff20f0a266 Deleting unecessary logs 2024-04-17 17:47:17 -04:00
Vitor Pamplona a4cc6337f9 Don't use DM relays to find metadata 2024-04-17 17:43:40 -04:00
Vitor Pamplona 202b897029 Refactors AppScreen out of Activity. 2024-04-17 16:25:13 -04:00
Vitor Pamplona 79c174b92e
Merge pull request #839 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2024-04-17 12:23:15 -04:00
Crowdin Bot bdd3f19b2c New Crowdin translations by GitHub Action 2024-04-17 15:16:18 +00:00
Vitor Pamplona afcc775d1b Merge branch 'main' of https://github.com/vitorpamplona/amethyst 2024-04-17 11:14:10 -04:00
Vitor Pamplona 8bbf308619 refactors the use of lud16 and lud06 2024-04-17 11:14:03 -04:00
Vitor Pamplona df378937fe Adds a preview for UserNames with emojis 2024-04-17 11:12:51 -04:00
Vitor Pamplona 02ab7a3f3f
Merge pull request #838 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2024-04-16 17:16:22 -04:00
Crowdin Bot 68ba9b3b91 New Crowdin translations by GitHub Action 2024-04-16 21:14:51 +00:00
Vitor Pamplona f62833d1be Updates Firebase and Media3 dependencies 2024-04-16 17:11:52 -04:00
Tony Giorgio 08f1b43908
Change release to use personal github token 2023-06-08 11:07:08 -05:00
28 zmienionych plików z 1176 dodań i 412 usunięć

Wyświetl plik

@ -84,7 +84,7 @@ jobs:
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
@ -96,7 +96,7 @@ jobs:
id: upload-release-asset-play-universal-apk
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/play/release/app-play-universal-release-unsigned-signed.apk
@ -107,7 +107,7 @@ jobs:
id: upload-release-asset-play-x86-apk
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/play/release/app-play-x86-release-unsigned-signed.apk
@ -118,7 +118,7 @@ jobs:
id: upload-release-asset-play-x86-64-apk
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/play/release/app-play-x86_64-release-unsigned-signed.apk
@ -152,7 +152,7 @@ jobs:
id: upload-release-asset-fdroid-universal-apk
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/fdroid/release/app-fdroid-universal-release-unsigned-signed.apk
@ -163,7 +163,7 @@ jobs:
id: upload-release-asset-fdroid-x86-apk
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/fdroid/release/app-fdroid-x86-release-unsigned-signed.apk
@ -174,7 +174,7 @@ jobs:
id: upload-release-asset-fdroid-x86-64-apk
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/apk/fdroid/release/app-fdroid-x86_64-release-unsigned-signed.apk
@ -210,7 +210,7 @@ jobs:
id: upload-release-asset-play-aab
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/bundle/playRelease/app-play-release.aab
@ -222,7 +222,7 @@ jobs:
id: upload-release-asset-fdroid-aab
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: app/build/outputs/bundle/fdroidRelease/app-fdroid-release.aab

Wyświetl plik

@ -709,6 +709,7 @@ class Account(
fun sendZapPaymentRequestFor(
bolt11: String,
zappedNote: Note?,
onSent: () -> Unit,
onResponse: (Response?) -> Unit,
) {
if (!isWriteable()) return
@ -730,6 +731,8 @@ class Account(
LocalCache.consume(event, zappedNote) { it.response(signer) { onResponse(it) } }
Client.send(event, nip47.relayUri, wcListener.feedTypes) { wcListener.destroy() }
onSent()
}
}
}

Wyświetl plik

@ -77,7 +77,7 @@ object HttpClientManager {
proxy: Proxy?,
timeout: Duration,
): OkHttpClient {
val seconds = if (proxy != null) timeout.seconds * 2 else timeout.seconds
val seconds = if (proxy != null) timeout.seconds * 3 else timeout.seconds
val duration = Duration.ofSeconds(seconds)
return OkHttpClient.Builder()
.proxy(proxy)

Wyświetl plik

@ -21,7 +21,6 @@
package com.vitorpamplona.amethyst.service
import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.relays.COMMON_FEED_TYPES
import com.vitorpamplona.amethyst.service.relays.EOSETime
import com.vitorpamplona.amethyst.service.relays.EVENT_FINDER_TYPES
import com.vitorpamplona.amethyst.service.relays.JsonFilter
@ -42,7 +41,7 @@ object NostrSingleUserDataSource : NostrDataSource("SingleUserFeed") {
return listOf(
TypedFilter(
types = COMMON_FEED_TYPES,
types = EVENT_FINDER_TYPES,
filter =
JsonFilter(
kinds = listOf(MetadataEvent.KIND),

Wyświetl plik

@ -28,6 +28,7 @@ import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.lnurl.LightningAddressResolver
import com.vitorpamplona.amethyst.ui.screen.loggedIn.collectSuccessfulSigningOperations
import com.vitorpamplona.quartz.events.LiveActivitiesEvent
import com.vitorpamplona.quartz.events.LnZapEvent
import com.vitorpamplona.quartz.events.PayInvoiceErrorResponse
@ -35,7 +36,6 @@ import com.vitorpamplona.quartz.events.ZapSplitSetup
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.math.round
@ -59,9 +59,8 @@ class ZapPaymentHandler(val account: Account) {
onPayViaIntent: (ImmutableList<Payable>) -> Unit,
zapType: LnZapEvent.ZapType,
) = withContext(Dispatchers.IO) {
val zapSplitSetup = note.event?.zapSplitSetup()
val noteEvent = note.event
val zapSplitSetup = noteEvent?.zapSplitSetup()
val zapsToSend =
if (!zapSplitSetup.isNullOrEmpty()) {
@ -69,7 +68,7 @@ class ZapPaymentHandler(val account: Account) {
} else if (noteEvent is LiveActivitiesEvent && noteEvent.hasHost()) {
noteEvent.hosts().map { ZapSplitSetup(it, null, weight = 1.0, false) }
} else {
val lud16 = note.author?.info?.lud16?.trim() ?: note.author?.info?.lud06?.trim()
val lud16 = note.author?.info?.lnAddress()
if (lud16.isNullOrBlank()) {
onError(
@ -84,101 +83,216 @@ class ZapPaymentHandler(val account: Account) {
listOf(ZapSplitSetup(lud16, null, weight = 1.0, true))
}
val totalWeight = zapsToSend.sumOf { it.weight }
val invoicesToPayOnIntent = mutableListOf<Payable>()
zapsToSend.forEachIndexed { index, value ->
val outerProgressMin = index / zapsToSend.size.toFloat()
val outerProgressMax = (index + 1) / zapsToSend.size.toFloat()
val zapValue = round((amountMilliSats * value.weight / totalWeight) / 1000f).toLong() * 1000
if (value.isLnAddress) {
innerZap(
lud16 = value.lnAddressOrPubKeyHex,
note = note,
amount = zapValue,
pollOption = pollOption,
message = message,
context = context,
onError = onError,
onProgress = {
onProgress((it * (outerProgressMax - outerProgressMin)) + outerProgressMin)
},
zapType = zapType,
onPayInvoiceThroughIntent = {
invoicesToPayOnIntent.add(
Payable(
info = value,
user = null,
amountMilliSats = zapValue,
invoice = it,
),
)
},
)
onProgress(0.02f)
signAllZapRequests(note, pollOption, message, zapType, zapsToSend) { splitZapRequestPairs ->
if (splitZapRequestPairs.isEmpty()) {
onProgress(0.00f)
return@signAllZapRequests
} else {
val user = LocalCache.getUserIfExists(value.lnAddressOrPubKeyHex)
val lud16 = user?.info?.lnAddress()
onProgress(0.05f)
}
if (lud16 != null) {
innerZap(
lud16 = lud16,
note = note,
amount = zapValue,
pollOption = pollOption,
message = message,
context = context,
onError = onError,
onProgress = {
onProgress((it * (outerProgressMax - outerProgressMin)) + outerProgressMin)
},
zapType = zapType,
overrideUser = user,
onPayInvoiceThroughIntent = {
invoicesToPayOnIntent.add(
Payable(
info = value,
user = user,
amountMilliSats = zapValue,
invoice = it,
),
)
},
)
assembleAllInvoices(splitZapRequestPairs.toList(), amountMilliSats, message, onError, onProgress = {
onProgress(it * 0.7f + 0.05f) // keeps within range.
}, context) {
if (it.isEmpty()) {
onProgress(0.00f)
return@assembleAllInvoices
} else {
onError(
context.getString(
R.string.missing_lud16,
),
context.getString(
R.string.user_x_does_not_have_a_lightning_address_setup_to_receive_sats,
user?.toBestDisplayName() ?: value.lnAddressOrPubKeyHex,
),
onProgress(0.75f)
}
if (account.hasWalletConnectSetup()) {
payViaNWC(it.values.map { it.second }, note, onError, onProgress = {
onProgress(it * 0.25f + 0.75f) // keeps within range.
}, context) {
// onProgress(1f)
}
} else {
onPayViaIntent(
it.map {
Payable(
info = it.key.first,
user = null,
amountMilliSats = it.value.first,
invoice = it.value.second,
)
}.toImmutableList(),
)
onProgress(0f)
}
}
}
}
if (invoicesToPayOnIntent.isNotEmpty()) {
onPayViaIntent(invoicesToPayOnIntent.toImmutableList())
onProgress(1f)
} else {
launch(Dispatchers.IO) {
// Awaits for the event to come back to LocalCache.
var count = 0
while (invoicesToPayOnIntent.size < zapsToSend.size || count < 4) {
count++
Thread.sleep(5000)
}
if (invoicesToPayOnIntent.isNotEmpty()) {
onPayViaIntent(invoicesToPayOnIntent.toImmutableList())
onProgress(1f)
private fun calculateZapValue(
amountMilliSats: Long,
weight: Double,
totalWeight: Double,
): Long {
val shareValue = amountMilliSats * (weight / totalWeight)
val roundedZapValue = round(shareValue / 1000f).toLong() * 1000
return roundedZapValue
}
suspend fun signAllZapRequests(
note: Note,
pollOption: Int?,
message: String,
zapType: LnZapEvent.ZapType,
zapsToSend: List<ZapSplitSetup>,
onAllDone: suspend (MutableMap<ZapSplitSetup, String>) -> Unit,
) {
collectSuccessfulSigningOperations<ZapSplitSetup, String>(
operationsInput = zapsToSend,
runRequestFor = { next: ZapSplitSetup, onReady ->
if (next.isLnAddress) {
prepareZapRequestIfNeeded(note, pollOption, message, zapType) { zapRequestJson ->
if (zapRequestJson != null) {
onReady(zapRequestJson)
}
}
} else {
onProgress(1f)
val user = LocalCache.getUserIfExists(next.lnAddressOrPubKeyHex)
prepareZapRequestIfNeeded(note, pollOption, message, zapType, user) { zapRequestJson ->
if (zapRequestJson != null) {
onReady(zapRequestJson)
}
}
}
},
onReady = onAllDone,
)
}
suspend fun assembleAllInvoices(
invoices: List<Pair<ZapSplitSetup, String>>,
totalAmountMilliSats: Long,
message: String,
onError: (String, String) -> Unit,
onProgress: (percent: Float) -> Unit,
context: Context,
onAllDone: suspend (MutableMap<Pair<ZapSplitSetup, String>, Pair<Long, String>>) -> Unit,
) {
var progressAllPayments = 0.00f
val totalWeight = invoices.sumOf { it.first.weight }
collectSuccessfulSigningOperations<Pair<ZapSplitSetup, String>, Pair<Long, String>>(
operationsInput = invoices,
runRequestFor = { splitZapRequestPair: Pair<ZapSplitSetup, String>, onReady ->
assembleInvoice(
splitSetup = splitZapRequestPair.first,
nostrZapRequest = splitZapRequestPair.second,
zapValue = calculateZapValue(totalAmountMilliSats, splitZapRequestPair.first.weight, totalWeight),
message = message,
onError = onError,
onProgressStep = { percentStepForThisPayment ->
progressAllPayments += percentStepForThisPayment / invoices.size
onProgress(progressAllPayments)
},
context = context,
onReady = onReady,
)
},
onReady = onAllDone,
)
}
suspend fun payViaNWC(
invoices: List<String>,
note: Note,
onError: (String, String) -> Unit,
onProgress: (percent: Float) -> Unit,
context: Context,
onAllDone: suspend (MutableMap<String, Boolean>) -> Unit,
) {
var progressAllPayments = 0.00f
collectSuccessfulSigningOperations<String, Boolean>(
operationsInput = invoices,
runRequestFor = { invoice: String, onReady ->
account.sendZapPaymentRequestFor(
bolt11 = invoice,
zappedNote = note,
onSent = {
progressAllPayments += 0.5f / invoices.size
onProgress(progressAllPayments)
onReady(true)
},
onResponse = { response ->
if (response is PayInvoiceErrorResponse) {
progressAllPayments += 0.5f / invoices.size
onProgress(progressAllPayments)
onError(
context.getString(R.string.error_dialog_pay_invoice_error),
context.getString(
R.string.wallet_connect_pay_invoice_error_error,
response.error?.message
?: response.error?.code?.toString() ?: "Error parsing error message",
),
)
} else {
progressAllPayments += 0.5f / invoices.size
onProgress(progressAllPayments)
}
},
)
},
onReady = onAllDone,
)
}
private fun assembleInvoice(
splitSetup: ZapSplitSetup,
nostrZapRequest: String,
zapValue: Long,
message: String,
onError: (String, String) -> Unit,
onProgressStep: (percent: Float) -> Unit,
context: Context,
onReady: (Pair<Long, String>) -> Unit,
) {
var progressThisPayment = 0.00f
var user: User? = null
val lud16 =
if (splitSetup.isLnAddress) {
splitSetup.lnAddressOrPubKeyHex
} else {
user = LocalCache.getUserIfExists(splitSetup.lnAddressOrPubKeyHex)
user?.info?.lnAddress()
}
if (lud16 != null) {
LightningAddressResolver()
.lnAddressInvoice(
lnaddress = lud16,
milliSats = zapValue,
message = message,
nostrRequest = nostrZapRequest,
onError = onError,
onProgress = {
val step = it - progressThisPayment
progressThisPayment = it
onProgressStep(step)
},
context = context,
onSuccess = {
onProgressStep(1 - progressThisPayment)
onReady(Pair(zapValue, it))
},
)
} else {
onError(
context.getString(
R.string.missing_lud16,
),
context.getString(
R.string.user_x_does_not_have_a_lightning_address_setup_to_receive_sats,
user?.toBestDisplayName() ?: splitSetup.lnAddressOrPubKeyHex,
),
)
}
}
@ -198,63 +312,4 @@ class ZapPaymentHandler(val account: Account) {
onReady(null)
}
}
private suspend fun innerZap(
lud16: String,
note: Note,
amount: Long,
pollOption: Int?,
message: String,
context: Context,
onError: (String, String) -> Unit,
onProgress: (percent: Float) -> Unit,
onPayInvoiceThroughIntent: (String) -> Unit,
zapType: LnZapEvent.ZapType,
overrideUser: User? = null,
) {
onProgress(0.05f)
prepareZapRequestIfNeeded(note, pollOption, message, zapType, overrideUser) { zapRequestJson ->
onProgress(0.10f)
LightningAddressResolver()
.lnAddressInvoice(
lud16,
amount,
message,
zapRequestJson,
onSuccess = {
onProgress(0.7f)
if (account.hasWalletConnectSetup()) {
account.sendZapPaymentRequestFor(
bolt11 = it,
note,
onResponse = { response ->
if (response is PayInvoiceErrorResponse) {
onProgress(0.0f)
onError(
context.getString(R.string.error_dialog_pay_invoice_error),
context.getString(
R.string.wallet_connect_pay_invoice_error_error,
response.error?.message
?: response.error?.code?.toString() ?: "Error parsing error message",
),
)
} else {
onProgress(1f)
}
},
)
onProgress(0.8f)
} else {
onPayInvoiceThroughIntent(it)
onProgress(0f)
}
},
onError = onError,
onProgress = onProgress,
context = context,
)
}
}
}

Wyświetl plik

@ -27,10 +27,11 @@ import android.util.Log
import android.util.LruCache
import androidx.media3.session.MediaController
import androidx.media3.session.SessionToken
import com.google.common.util.concurrent.MoreExecutors
import kotlinx.coroutines.CancellationException
import java.util.concurrent.Executors
object PlaybackClientController {
var executorService = Executors.newCachedThreadPool()
val cache = LruCache<Int, SessionToken>(1)
@androidx.annotation.OptIn(androidx.media3.common.util.UnstableApi::class)
@ -67,7 +68,7 @@ object PlaybackClientController {
Log.e("Playback Client", "Failed to load Playback Client for $videoUri", e)
}
},
MoreExecutors.directExecutor(),
executorService,
)
} catch (e: Exception) {
if (e is CancellationException) throw e

Wyświetl plik

@ -27,7 +27,6 @@ import com.vitorpamplona.quartz.events.EventInterface
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.UUID
@ -125,47 +124,8 @@ object Client : RelayPool.Listener {
} else if (relay == null) {
RelayPool.send(signedEvent)
} else {
val useConnectedRelayIfPresent = RelayPool.getRelays(relay)
if (useConnectedRelayIfPresent.isNotEmpty()) {
useConnectedRelayIfPresent.forEach { it.send(signedEvent) }
} else {
/** temporary connection */
newSporadicRelay(
relay,
feedTypes,
onConnected = { myRelay -> myRelay.send(signedEvent) },
onDone = onDone,
)
}
}
}
@OptIn(DelicateCoroutinesApi::class)
private fun newSporadicRelay(
url: String,
feedTypes: Set<FeedType>?,
onConnected: (Relay) -> Unit,
onDone: (() -> Unit)?,
) {
val relay = Relay(url, true, true, feedTypes ?: emptySet())
RelayPool.addRelay(relay)
relay.connectAndRun {
allSubscriptions().forEach {
relay.sendFilter(it.key, it.value)
}
onConnected(relay)
GlobalScope.launch(Dispatchers.IO) {
delay(60000) // waits for a reply
relay.disconnect()
RelayPool.removeRelay(relay)
if (onDone != null) {
onDone()
}
RelayPool.getOrCreateRelay(relay, feedTypes, onDone) {
it.send(signedEvent)
}
}
}

Wyświetl plik

@ -90,6 +90,7 @@ class Relay(
var afterEOSEPerSubscription = mutableMapOf<String, Boolean>()
val authResponse = mutableMapOf<HexKey, Boolean>()
val sendWhenReady = mutableListOf<EventInterface>()
fun register(listener: Listener) {
listeners = listeners.plus(listener)
@ -167,6 +168,13 @@ class Relay(
// Log.w("Relay", "Relay OnOpen, Loading All subscriptions $url")
onConnected(this@Relay)
synchronized(sendWhenReady) {
sendWhenReady.forEach {
send(it)
}
sendWhenReady.clear()
}
listeners.forEach { it.onRelayStateChange(this@Relay, StateType.CONNECT, null) }
}
@ -272,6 +280,7 @@ class Relay(
val event = Event.fromJson(msgArray.get(2))
// Log.w("Relay", "Relay onEVENT ${event.kind} $url, $subscriptionId ${msgArray.get(2)}")
listeners.forEach {
it.onEvent(
this@Relay,
@ -456,6 +465,10 @@ class Relay(
if (isReady) {
socket?.send(event)
eventUploadCounterInBytes += event.bytesUsedInMemory()
} else {
synchronized(sendWhenReady) {
sendWhenReady.add(signedEvent)
}
}
} else {
// sends all filters after connection is successful.

Wyświetl plik

@ -24,10 +24,15 @@ import androidx.compose.runtime.Immutable
import com.vitorpamplona.amethyst.service.checkNotInMainThread
import com.vitorpamplona.quartz.events.Event
import com.vitorpamplona.quartz.events.EventInterface
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.launch
/**
* RelayPool manages the connection to multiple Relays and lets consumers deal with simple events.
@ -58,6 +63,57 @@ object RelayPool : Relay.Listener {
return relays.filter { it.url == url }
}
fun getOrCreateRelay(
url: String,
feedTypes: Set<FeedType>? = null,
onDone: (() -> Unit)? = null,
whenConnected: (Relay) -> Unit,
) {
synchronized(this) {
val matching = getRelays(url)
if (matching.isNotEmpty()) {
matching.forEach { whenConnected(it) }
} else {
/** temporary connection */
newSporadicRelay(
url,
feedTypes,
onConnected = whenConnected,
onDone = onDone,
)
}
}
}
@OptIn(DelicateCoroutinesApi::class)
fun newSporadicRelay(
url: String,
feedTypes: Set<FeedType>?,
onConnected: (Relay) -> Unit,
onDone: (() -> Unit)?,
) {
val relay = Relay(url, true, true, feedTypes ?: emptySet())
addRelay(relay)
relay.connectAndRun {
Client.allSubscriptions().forEach {
relay.sendFilter(it.key, it.value)
}
onConnected(relay)
GlobalScope.launch(Dispatchers.IO) {
delay(60000) // waits for a reply
relay.disconnect()
removeRelay(relay)
if (onDone != null) {
onDone()
}
}
}
}
fun loadRelays(relayList: List<Relay>) {
if (!relayList.isNullOrEmpty()) {
relayList.forEach { addRelay(it) }

Wyświetl plik

@ -0,0 +1,80 @@
/**
* Copyright (c) 2024 Vitor Pamplona
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.vitorpamplona.amethyst.ui
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.adaptive.calculateDisplayFeatures
import com.vitorpamplona.amethyst.ServiceManager
import com.vitorpamplona.amethyst.ui.screen.AccountScreen
import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
import com.vitorpamplona.amethyst.ui.screen.SharedPreferencesViewModel
import com.vitorpamplona.amethyst.ui.theme.AmethystTheme
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@Composable
fun prepareSharedViewModel(act: MainActivity): SharedPreferencesViewModel {
val sharedPreferencesViewModel: SharedPreferencesViewModel = viewModel()
val displayFeatures = calculateDisplayFeatures(act)
val windowSizeClass = calculateWindowSizeClass(act)
LaunchedEffect(key1 = sharedPreferencesViewModel) {
sharedPreferencesViewModel.init()
sharedPreferencesViewModel.updateDisplaySettings(windowSizeClass, displayFeatures)
}
LaunchedEffect(act.isOnMobileDataState) {
sharedPreferencesViewModel.updateConnectivityStatusState(act.isOnMobileDataState)
}
return sharedPreferencesViewModel
}
@Composable
fun AppScreen(
sharedPreferencesViewModel: SharedPreferencesViewModel,
serviceManager: ServiceManager,
) {
AmethystTheme(sharedPreferencesViewModel) {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
) {
val accountStateViewModel: AccountStateViewModel = viewModel()
accountStateViewModel.serviceManager = serviceManager
LaunchedEffect(key1 = Unit) {
accountStateViewModel.tryLoginExistingAccountAsync()
}
AccountScreen(accountStateViewModel, sharedPreferencesViewModel)
}
}
}

Wyświetl plik

@ -33,16 +33,7 @@ import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import com.google.accompanist.adaptive.calculateDisplayFeatures
import com.vitorpamplona.amethyst.LocalPreferences
import com.vitorpamplona.amethyst.ServiceManager
import com.vitorpamplona.amethyst.model.LocalCache
@ -53,10 +44,6 @@ import com.vitorpamplona.amethyst.ui.components.DEFAULT_MUTED_SETTING
import com.vitorpamplona.amethyst.ui.components.keepPlayingMutex
import com.vitorpamplona.amethyst.ui.navigation.Route
import com.vitorpamplona.amethyst.ui.navigation.debugState
import com.vitorpamplona.amethyst.ui.screen.AccountScreen
import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
import com.vitorpamplona.amethyst.ui.screen.SharedPreferencesViewModel
import com.vitorpamplona.amethyst.ui.theme.AmethystTheme
import com.vitorpamplona.quartz.encoders.Nip19Bech32
import com.vitorpamplona.quartz.encoders.Nip47WalletConnect
import com.vitorpamplona.quartz.events.ChannelCreateEvent
@ -76,14 +63,13 @@ import java.util.Timer
import kotlin.concurrent.schedule
class MainActivity : AppCompatActivity() {
private val isOnMobileDataState = mutableStateOf(false)
val isOnMobileDataState = mutableStateOf(false)
private val isOnWifiDataState = mutableStateOf(false)
// Service Manager is only active when the activity is active.
val serviceManager = ServiceManager()
private var shouldPauseService = true
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
@RequiresApi(Build.VERSION_CODES.R)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -91,36 +77,8 @@ class MainActivity : AppCompatActivity() {
Log.d("Lifetime Event", "MainActivity.onCreate")
setContent {
val sharedPreferencesViewModel: SharedPreferencesViewModel = viewModel()
val displayFeatures = calculateDisplayFeatures(this)
val windowSizeClass = calculateWindowSizeClass(this)
LaunchedEffect(key1 = sharedPreferencesViewModel) {
sharedPreferencesViewModel.init()
sharedPreferencesViewModel.updateDisplaySettings(windowSizeClass, displayFeatures)
}
LaunchedEffect(isOnMobileDataState) {
sharedPreferencesViewModel.updateConnectivityStatusState(isOnMobileDataState)
}
AmethystTheme(sharedPreferencesViewModel) {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background,
) {
val accountStateViewModel: AccountStateViewModel = viewModel()
accountStateViewModel.serviceManager = serviceManager
LaunchedEffect(key1 = Unit) {
accountStateViewModel.tryLoginExistingAccountAsync()
}
AccountScreen(accountStateViewModel, sharedPreferencesViewModel)
}
}
val sharedPreferencesViewModel = prepareSharedViewModel(act = this)
AppScreen(sharedPreferencesViewModel = sharedPreferencesViewModel, serviceManager = serviceManager)
}
}

Wyświetl plik

@ -21,6 +21,7 @@
package com.vitorpamplona.amethyst.ui.components
import androidx.compose.animation.Crossfade
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@ -132,6 +133,29 @@ fun RichTextViewer(
}
}
@Preview
@Composable
fun RenderStrangeNamePreview() {
val nav: (String) -> Unit = {}
Column(modifier = Modifier.padding(10.dp)) {
RenderRegular(
"If you want to stream or download the music from nostr:npub1sctag667a7np6p6ety2up94pnwwxhd2ep8n8afr2gtr47cwd4ewsvdmmjm can you here",
EmptyTagList,
) { word, state ->
when (word) {
is BechSegment -> {
Text(
"FreeFrom Official \uD80C\uDD66",
modifier = Modifier.border(1.dp, Color.Red),
)
}
is RegularTextSegment -> Text(word.segmentText)
}
}
}
}
@Preview
@Composable
fun RenderRegularPreview() {

Wyświetl plik

@ -115,6 +115,7 @@ import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.launch
import java.util.UUID
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.math.abs
public val DEFAULT_MUTED_SETTING = mutableStateOf(true)
@ -394,6 +395,8 @@ fun GetVideoController(
) {
val context = LocalContext.current
val onlyOnePreparing = AtomicBoolean()
val controller =
remember(videoUri) {
mutableStateOf(
@ -421,31 +424,36 @@ fun GetVideoController(
// If it is not null, the user might have come back from a playing video, like clicking on
// the notification of the video player.
if (controller.value == null) {
scope.launch(Dispatchers.IO) {
Log.d("PlaybackService", "Preparing Video $videoUri ")
PlaybackClientController.prepareController(
uid,
videoUri,
nostrUriCallback,
context,
) {
scope.launch(Dispatchers.Main) {
// REQUIRED TO BE RUN IN THE MAIN THREAD
if (!it.isPlaying) {
if (keepPlayingMutex?.isPlaying == true) {
// There is a video playing, start this one on mute.
it.volume = 0f
} else {
// There is no other video playing. Use the default mute state to
// decide if sound is on or not.
it.volume = if (defaultToStart) 0f else 1f
// If there is a connection, don't wait.
if (!onlyOnePreparing.getAndSet(true)) {
scope.launch(Dispatchers.IO) {
Log.d("PlaybackService", "Preparing Video $videoUri ")
PlaybackClientController.prepareController(
uid,
videoUri,
nostrUriCallback,
context,
) {
scope.launch(Dispatchers.Main) {
// REQUIRED TO BE RUN IN THE MAIN THREAD
if (!it.isPlaying) {
if (keepPlayingMutex?.isPlaying == true) {
// There is a video playing, start this one on mute.
it.volume = 0f
} else {
// There is no other video playing. Use the default mute state to
// decide if sound is on or not.
it.volume = if (defaultToStart) 0f else 1f
}
}
it.setMediaItem(mediaItem.value)
it.prepare()
controller.value = it
onlyOnePreparing.getAndSet(false)
}
it.setMediaItem(mediaItem.value)
it.prepare()
controller.value = it
}
}
}
@ -454,6 +462,8 @@ fun GetVideoController(
controller.value?.let {
scope.launch(Dispatchers.Main) {
if (it.playbackState == Player.STATE_IDLE || it.playbackState == Player.STATE_ENDED) {
Log.d("PlaybackService", "Preparing Existing Video $videoUri ")
if (it.isPlaying) {
// There is a video playing, start this one on mute.
it.volume = 0f
@ -497,32 +507,35 @@ fun GetVideoController(
// if the controller is null, restarts the controller with a new one
// if the controller is not null, just continue playing what the controller was playing
if (controller.value == null) {
scope.launch(Dispatchers.IO) {
Log.d("PlaybackService", "Preparing Video from Resume $videoUri ")
PlaybackClientController.prepareController(
uid,
videoUri,
nostrUriCallback,
context,
) {
scope.launch(Dispatchers.Main) {
// REQUIRED TO BE RUN IN THE MAIN THREAD
// checks again to make sure no other thread has created a controller.
if (!it.isPlaying) {
if (keepPlayingMutex?.isPlaying == true) {
// There is a video playing, start this one on mute.
it.volume = 0f
} else {
// There is no other video playing. Use the default mute state to
// decide if sound is on or not.
it.volume = if (defaultToStart) 0f else 1f
if (!onlyOnePreparing.getAndSet(true)) {
scope.launch(Dispatchers.IO) {
Log.d("PlaybackService", "Preparing Video from Resume $videoUri ")
PlaybackClientController.prepareController(
uid,
videoUri,
nostrUriCallback,
context,
) {
scope.launch(Dispatchers.Main) {
// REQUIRED TO BE RUN IN THE MAIN THREAD
// checks again to make sure no other thread has created a controller.
if (!it.isPlaying) {
if (keepPlayingMutex?.isPlaying == true) {
// There is a video playing, start this one on mute.
it.volume = 0f
} else {
// There is no other video playing. Use the default mute state to
// decide if sound is on or not.
it.volume = if (defaultToStart) 0f else 1f
}
}
it.setMediaItem(mediaItem.value)
it.prepare()
controller.value = it
onlyOnePreparing.getAndSet(false)
}
it.setMediaItem(mediaItem.value)
it.prepare()
controller.value = it
}
}
}

Wyświetl plik

@ -182,7 +182,6 @@ fun LoggedInPage(
contentResolver = { Amethyst.instance.contentResolver },
)
onDispose {
Log.d("onDispose", "Called onDispose")
accountViewModel.account.signer.launcher.clearLauncher()
lifeCycleOwner.lifecycle.removeObserver(observer)
}

Wyświetl plik

@ -158,7 +158,11 @@ private fun FeedLoaded(
ShowDonationCard(accountViewModel, nav)
}
itemsIndexed(state.feed.value, key = { _, item -> item.id() }) { _, item ->
itemsIndexed(
items = state.feed.value,
key = { _, item -> item.id() },
contentType = { _, item -> item.javaClass.simpleName },
) { _, item ->
val defaultModifier = remember { Modifier.fillMaxWidth().animateItemPlacement() }
Row(defaultModifier) {

Wyświetl plik

@ -301,7 +301,9 @@ open class CardFeedViewModel(val localFilter: FeedFilter<Note>) : ViewModel(), I
if (notes.isEmpty()) {
_feedContent.update { CardFeedState.Empty }
} else if (currentState is CardFeedState.Loaded) {
currentState.showHidden.value = localFilter.showHiddenKey()
if (currentState.showHidden.value != localFilter.showHiddenKey()) {
currentState.showHidden.value = localFilter.showHiddenKey()
}
currentState.feed.value = notes
} else {
_feedContent.update {

Wyświetl plik

@ -93,9 +93,12 @@ import kotlinx.collections.immutable.toImmutableSet
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.async
import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
@ -291,26 +294,27 @@ class AccountViewModel(val account: Account, val settings: SettingsState) : View
onNewState: (ImmutableList<ZapAmountCommentNotification>) -> Unit,
) {
viewModelScope.launch(Dispatchers.IO) {
val myList = zaps.toList()
val initialResults =
myList
.associate {
it.request to
ZapAmountCommentNotification(
it.request.author,
it.request.event?.content()?.ifBlank { null },
showAmountAxis((it.response?.event as? LnZapEvent)?.amount),
)
}
zaps.associate {
it.request to
ZapAmountCommentNotification(
it.request.author,
it.request.event?.content()?.ifBlank { null },
showAmountAxis((it.response.event as? LnZapEvent)?.amount),
)
}
.toMutableMap()
collectSuccessfulSigningOperations<CombinedZap, ZapAmountCommentNotification>(
operationsInput = myList,
operationsInput = zaps.filter { (it.request.event as? LnZapRequestEvent)?.isPrivateZap() == true },
runRequestFor = { next, onReady ->
checkNotInMainThread()
innerDecryptAmountMessage(next.request, next.response, onReady)
},
) {
checkNotInMainThread()
it.forEach { decrypted -> initialResults[decrypted.key.request] = decrypted.value }
onNewState(initialResults.values.toImmutableList())
@ -477,7 +481,9 @@ class AccountViewModel(val account: Account, val settings: SettingsState) : View
message,
context,
onError,
onProgress,
onProgress = {
onProgress(it)
},
onPayViaIntent,
zapType,
)
@ -1392,48 +1398,41 @@ class HasNotificationDot(bottomNavigationItems: ImmutableList<Route>) {
@Immutable data class LoadedBechLink(val baseNote: Note?, val nip19: Nip19Bech32.ParseReturn)
public fun <T, K> allOrNothingSigningOperations(
remainingTos: List<T>,
runRequestFor: (T, (K) -> Unit) -> Unit,
output: MutableList<K> = mutableListOf(),
onReady: (List<K>) -> Unit,
) {
if (remainingTos.isEmpty()) {
onReady(output)
return
}
val next = remainingTos.first()
runRequestFor(next) { result: K ->
output.add(result)
allOrNothingSigningOperations(remainingTos.minus(next), runRequestFor, output, onReady)
}
}
public suspend fun <T, K> collectSuccessfulSigningOperations(
operationsInput: List<T>,
runRequestFor: (T, (K) -> Unit) -> Unit,
output: MutableMap<T, K> = mutableMapOf(),
onReady: (MutableMap<T, K>) -> Unit,
onReady: suspend (MutableMap<T, K>) -> Unit,
) {
if (operationsInput.isEmpty()) {
onReady(output)
return
}
for (input in operationsInput) {
// runs in sequence to avoid overcrowding Amber.
val result =
withTimeoutOrNull(100) {
suspendCancellableCoroutine { continuation ->
runRequestFor(input) { result: K -> continuation.resume(result) }
val (value, elapsed) =
measureTimedValue {
coroutineScope {
val jobs =
operationsInput.map {
async {
val result =
withTimeoutOrNull(10000) {
suspendCancellableCoroutine { continuation ->
runRequestFor(it) { result: K -> continuation.resume(result) }
}
}
if (result != null) {
output[it] = result
}
}
}
// runs in parallel to avoid overcrowding Amber.
withTimeoutOrNull(15000) {
jobs.joinAll()
}
}
if (result != null) {
output[input] = result
}
}
onReady(output)
}

Wyświetl plik

@ -74,7 +74,6 @@ import com.vitorpamplona.amethyst.ui.screen.NostrSpammerAccountsFeedViewModel
import com.vitorpamplona.amethyst.ui.screen.RefresheableBox
import com.vitorpamplona.amethyst.ui.screen.RefreshingFeedUserFeedView
import com.vitorpamplona.amethyst.ui.screen.StringFeedView
import com.vitorpamplona.amethyst.ui.screen.UserFeedViewModel
import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
import com.vitorpamplona.amethyst.ui.theme.ButtonPadding
import com.vitorpamplona.amethyst.ui.theme.DividerThickness
@ -104,6 +103,12 @@ fun HiddenUsersScreen(
factory = NostrSpammerAccountsFeedViewModel.Factory(accountViewModel.account),
)
WatchAccountAndBlockList(accountViewModel = accountViewModel) {
hiddenFeedViewModel.invalidateData()
spammerFeedViewModel.invalidateData()
hiddenWordsFeedViewModel.invalidateData()
}
HiddenUsersScreen(
hiddenFeedViewModel,
hiddenWordsFeedViewModel,
@ -197,14 +202,8 @@ fun HiddenUsersScreen(
}
HorizontalPager(state = pagerState) { page ->
when (page) {
0 ->
RefreshingUserFeedView(hiddenFeedViewModel, accountViewModel) {
RefreshingFeedUserFeedView(hiddenFeedViewModel, accountViewModel, nav)
}
1 ->
RefreshingUserFeedView(spammerFeedViewModel, accountViewModel) {
RefreshingFeedUserFeedView(spammerFeedViewModel, accountViewModel, nav)
}
0 -> RefreshingFeedUserFeedView(hiddenFeedViewModel, accountViewModel, nav)
1 -> RefreshingFeedUserFeedView(spammerFeedViewModel, accountViewModel, nav)
2 -> HiddenWordsFeed(hiddenWordsViewModel, accountViewModel)
}
}
@ -268,25 +267,17 @@ private fun AddMuteWordTextField(accountViewModel: AccountViewModel) {
}
}
@Composable
fun RefreshingUserFeedView(
feedViewModel: UserFeedViewModel,
accountViewModel: AccountViewModel,
inner: @Composable () -> Unit,
) {
WatchAccountAndBlockList(feedViewModel, accountViewModel)
inner()
}
@Composable
fun WatchAccountAndBlockList(
feedViewModel: UserFeedViewModel,
accountViewModel: AccountViewModel,
invalidate: () -> Unit,
) {
val accountState by accountViewModel.accountLiveData.observeAsState()
val blockListState by accountViewModel.account.flowHiddenUsers.collectAsStateWithLifecycle()
LaunchedEffect(accountViewModel, accountState, blockListState) { feedViewModel.invalidateData() }
LaunchedEffect(accountViewModel, accountState, blockListState) {
invalidate()
}
}
@Composable

Wyświetl plik

@ -1182,7 +1182,7 @@ fun DisplayLNAddress(
zapExpanded = false
// pay directly
if (accountViewModel.account.hasWalletConnectSetup()) {
accountViewModel.account.sendZapPaymentRequestFor(it, null) { response ->
accountViewModel.account.sendZapPaymentRequestFor(it, null, onSent = {}) { response ->
if (response is PayInvoiceSuccessResponse) {
showInfoMessageDialog = context.getString(R.string.payment_successful)
} else if (response is PayInvoiceErrorResponse) {

Wyświetl plik

@ -559,11 +559,16 @@
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">Nepodařilo se vyřešit %1$s. Zkontrolujte, zda jste připojeni, zda je server aktivní a zda je adresa %2$s správná.\n\nVýjimka byla: %3$s</string>
<string name="could_not_fetch_invoice_from">Nepodařilo se načíst fakturu z %1$s</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">Chyba při analýze JSON z Lightning adresy. Zkontrolujte uživatelovo bleskové nastavení</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">Chyba při analýze JSON z %1$s. Zkontrolujte uživatelské bleskové nastavení</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">URL adresa zpětného volání nebyla nalezena v konfiguraci serveru pro bleskovou adresu uživatele</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">Adresa URL zpětného volání nebyla nalezena v odpovědi %1$s</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">Chyba při analýze JSON z načtení faktur v Lightning adrese. Zkontrolujte uživatelské nastavení</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">Chyba při analýze JSON z načtení faktury %1$s. Zkontrolujte uživatelské bleskové nastavení</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">Nesprávná částka faktury (%1$s sats) od %2$s. Měla by být %3$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">Nepodařilo se vytvořit bleskovou fakturu před odesláním zap. Blesková peněženka příjemce odeslala následující chybu: %1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">Nelze vytvořit bleskovou fakturu. Zpráva od %1$s: %2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">Nepodařilo se vytvořit bleskovou fakturu před odesláním zap. Prvek pr nebyl nalezen v výsledném JSON.</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">Nelze vytvořit bleskovou fakturu z %1$s: Prvek pr nebyl nalezen ve výsledném JSON.</string>
<string name="read_only_user">Uživatel pouze pro čtení</string>
<string name="no_reactions_setup">Žádné nastavení reakcí</string>
<string name="select_push_server">Vyberte distributor push oznámení</string>

Wyświetl plik

@ -564,11 +564,16 @@ anz der Bedingungen ist erforderlich</string>
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">Konnte %1$s nicht auflösen. Überprüfen Sie, ob Sie verbunden sind, ob der Server online ist und ob die Lightning-Adresse %2$s korrekt ist.\n\nAusnahme war: %3$s</string>
<string name="could_not_fetch_invoice_from">Konnte Rechnung nicht von %1$s abholen</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">Fehler beim analysieren von JSON aus der Lightning-Adresse. Überprüfen Sie die Lightning-Konfiguration des Benutzers</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">Fehler beim Parsen von JSON von %1$s. Überprüfen Sie die Blitzeinrichtung des Benutzers</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">Callback-URL nicht in der Serverkonfiguration der Lightning-Adresse des Benutzers gefunden</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">Callback-URL aus %1$s Antwort nicht gefunden</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">Fehler beim Parsen von JSON aus der Rechnungsabruf der Lightning-Adresse. Überprüfen Sie die Lightning-Konfiguration des Benutzers</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">Fehler beim Parsen von JSON von %1$s. Überprüfen Sie die Blitzeinrichtung des Benutzers</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">Falscher Rechnungsbetrag (%1$s Sats) von %2$s. Er hätte %3$s sein sollen</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">Konnte keine Lightning-Rechnung erstellen, bevor der Zap gesendet wurde. Die Lightning-Wallet des Empfängers hat folgenden Fehler gesendet: %1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">Blitzrechnung konnte nicht erstellt werden. Nachricht von %1$s: %2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">Konnte keine Lightning-Rechnung erstellen, bevor der Zap gesendet wurde. Element pr wurde nicht in der resultierenden JSON gefunden.</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">Kann keine Blitzrechnung von %1$s erstellen: Element pr nicht im resultierenden JSON gefunden.</string>
<string name="read_only_user">Nur-Lese-Benutzer</string>
<string name="no_reactions_setup">Keine Reaktionen eingerichtet</string>
<string name="select_push_server">Einen Push-Benachrichtigungsanbieter auswählen</string>

Wyświetl plik

@ -561,11 +561,16 @@
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">Impossible de résoudre %1$s. Vérifiez si vous êtes connecté, si le serveur est actif et si l\'adresse Lightning %2$s est correcte.\n\nL\'erreur était : %3$s</string>
<string name="could_not_fetch_invoice_from">Impossible de récupérer la facture depuis %1$s</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">Erreur lors de l\'analyse du JSON à partir de l\'Adresse Lightning. Vérifiez la configuration lightning de l\'utilisateur</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">Erreur lors de l\'analyse du JSON de %1$s. Vérifiez la configuration lightning de l\'utilisateur</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">URL de callback introuvable dans la configuration serveur de l\'adresse lightning de l\'utilisateur</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">URL de callback introuvable dans la réponse de %1$s</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">Erreur lors de l\'analyse du JSON à partir de la récupération de la facture de l\'Adresse Lightning. Vérifiez la configuration Lightning de l\'utilisateur</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">Erreur lors de l\'analyse du JSON de la facture de %1$s. Vérifiez la configuration lightning de l\'utilisateur</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">Montant de la facture (%1$s sats) incorrect de %2$s. Il aurait dû être %3$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">Impossible de créer une facture lightning avant d\'envoyer le zap. Le portefeuille lightning du destinataire a envoyé l\'erreur suivante : %1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">Impossible de créer une facture lightning. Message de %1$s: %2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">Impossible de créer une facture lightning avant d\'envoyer le zap. Élément pr introuvable dans le JSON résultant.</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">Impossible de créer une facture lightning avec %1$s. Élément pr introuvable dans le JSON résultant.</string>
<string name="read_only_user">Utilisateur en lecture seule</string>
<string name="no_reactions_setup">Aucune réaction configurée</string>
<string name="select_push_server">Sélectionnez une application UnifiedPush</string>
@ -700,4 +705,5 @@
<string name="it_s_not_possible_to_react_to_a_draft_note">Il n\'est pas possible de réagir à un brouillon</string>
<string name="it_s_not_possible_to_zap_to_a_draft_note">Il n\'est pas possible de zapper un brouillon</string>
<string name="draft_note">Brouillon</string>
<string name="load_from_text">Depuis message</string>
</resources>

Wyświetl plik

@ -2,43 +2,43 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="point_to_the_qr_code">क्यूआर क्रमचित्र के अभिमुख करें</string>
<string name="show_qr">क्यूआर क्रमचित्र दिखाएँ</string>
<string name="profile_image">स्व चित्र</string>
<string name="your_profile_image">आपका चित्र</string>
<string name="scan_qr">क्यूआर क्रमचित्र का जाँच करें</string>
<string name="profile_image">परिचय चित्र</string>
<string name="your_profile_image">आपका परिचय चित्र</string>
<string name="scan_qr">क्यूआर क्रमचित्र को परखें</string>
<string name="show_anyway">फिर भी दिखाएँ</string>
<string name="post_was_hidden">इस लेख को छिपाया गया क्योंकि इसमें आपके आच्छाद्य उपयोगकर्ता अथवा शब्द उल्लेखित हैं</string>
<string name="post_was_flagged_as_inappropriate_by">लेख को शान्त किया गया अथवा आपत्ति उठाया गया इनके द्वारा</string>
<string name="post_not_found">घटना उपलब्ध किया जा रहा है अथवा आपके पुनःप्रसारक सूची द्वारा प्राप्य नही</string>
<string name="post_was_hidden">इस प्रकाशित पत्र को छिपाया गया क्योंकि इसमें आपके आच्छाद्य उपयोगकर्ता अथवा शब्द उल्लेखित हैं</string>
<string name="post_was_flagged_as_inappropriate_by">प्रकाशित पत्र को मौन किया गया अथवा आपत्ति उठाया गया इनके द्वारा</string>
<string name="post_not_found">घटना उपलब्ध किया जा रहा है अथवा आपके पुनःप्रसारक सूची द्वारा प्राप्य नही</string>
<string name="channel_image">प्रणाली चित्र</string>
<string name="referenced_event_not_found">उद्धृत घटना अप्राप्त</string>
<string name="could_not_decrypt_the_message">सन्देश का अरहस्यकरण असफल</string>
<string name="could_not_decrypt_the_message">सन्देश का अरहस्यकरण असफल</string>
<string name="group_picture">समूह चित्र</string>
<string name="explicit_content">अभद्र विषयवस्तु</string>
<string name="spam">कचरा</string>
<string name="impersonation">ढोंग</string>
<string name="spam">कचरालेख</string>
<string name="impersonation">पररूपण</string>
<string name="illegal_behavior">अवैध बरताव</string>
<string name="other">अन्य</string>
<string name="unknown">अज्ञात</string>
<string name="relay_icon">पनःप्रसारक चिह्न</string>
<string name="unknown_author">अज्ञात लेखक</string>
<string name="copy_text">लेख की प्रतिलिपि बनाएँ</string>
<string name="copy_user_pubkey">लेखक विभेदक का प्रतिलिपि करें</string>
<string name="copy_note_id">टीका विभेदक का प्रतिलिपि करें</string>
<string name="copy_user_pubkey">लेखक विभेदक का अनुकरण करें</string>
<string name="copy_note_id">टीका विभेदक का अनुकरण करें</string>
<string name="broadcast">प्रसारण</string>
<string name="timestamp_it">समयांकन करें</string>
<string name="timestamp_pending">समयांकन : शेष पुष्टिकरण</string>
<string name="timestamp_pending_short">समयांकन : शेष</string>
<string name="request_deletion">हटाने की याचना</string>
<string name="block_report">अवरोधित करें / सूचना दें</string>
<string name="block_hide_user"><![CDATA[अवरोधित करें तथा उपयोगकर्ता को छिपाएँ]]></string>
<string name="report_spam_scam">कचरा / घोटाला की सूचना दें</string>
<string name="report_impersonation">ढोंग की सूचना दें</string>
<string name="block_report">बाधित करें / सूचना दें</string>
<string name="block_hide_user"><![CDATA[बाधित करें तथा उपयोगकर्ता को छिपाएँ]]></string>
<string name="report_spam_scam">कचरालेख / घोटाला की सूचना दें</string>
<string name="report_impersonation">पररूपण की सूचना दें</string>
<string name="report_explicit_content">अभद्र विषयवस्तु की सूचना दें</string>
<string name="report_illegal_behaviour">अवैध बरताव की सूचना दें</string>
<string name="login_with_a_private_key_to_be_able_to_reply">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। प्रत्युत्तर देने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="login_with_a_private_key_to_be_able_to_boost_posts">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। टीकाओं को उद्धृत करने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="login_with_a_private_key_to_like_posts">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। टीकाओं को चाहने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="no_zap_amount_setup_long_press_to_change">ज्साप संख्या स्थापित नही किया गया। दीर्घतः दबाएँ परिवर्तित करने के लिए</string>
<string name="login_with_a_private_key_to_be_able_to_reply">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। त्तर देने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="login_with_a_private_key_to_be_able_to_boost_posts">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। प्रकाशित पत्रों को उद्धृत करने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="login_with_a_private_key_to_like_posts">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। प्रसारणों को चाहने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="no_zap_amount_setup_long_press_to_change">ज्साप मात्रा स्थापित नहीं किया गया। दीर्घतः दबाएँ परिवर्तित करने के लिए</string>
<string name="login_with_a_private_key_to_be_able_to_send_zaps">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। ज्साप भेजने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="login_with_a_private_key_to_be_able_to_follow">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। अनुचरण करने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
<string name="login_with_a_private_key_to_be_able_to_unfollow">आप ख्याप्य कुंचिका का प्रयोग कर रहे हैं जिससे केवल पढ सकते हैं। अनुचरण रोकने के लिए गुप्त कुंचिका के साथ प्रवेशांकन करें</string>
@ -54,26 +54,26 @@
<string name="quote">वचन</string>
<string name="fork">पथभेद</string>
<string name="propose_an_edit">सम्पादन सुझाव दें</string>
<string name="new_amount_in_sats">साट्स में नया संख्य</string>
<string name="new_amount_in_sats">साट्स में नयी मात्र</string>
<string name="add">जोडें</string>
<string name="replying_to">"उत्तर दें इनको "</string>
<string name="and">" तथा "</string>
<string name="in_channel">"प्रणाली अभ्यन्तर "</string>
<string name="profile_banner">परिचय पृष्ठ चित्र</string>
<string name="profile_banner">परिचय पृष्ठ चौडाचित्र</string>
<string name="payment_successful">भुगतान सफल</string>
<string name="error_parsing_error_message">अपक्रम संदेश परखने में अपक्रम</string>
<string name="following">" अनुचरण"</string>
<string name="following">" अनुचरण चालू"</string>
<string name="followers">" अनुचर"</string>
<string name="profile">परिचय</string>
<string name="security_filters">सुरक्षा छलन</string>
<string name="security_filters">सुरक्षा छलनियाँ</string>
<string name="log_out">निर्गमनांकन</string>
<string name="show_more">अधिक दिखाएँ</string>
<string name="lightning_invoice">लैटनिंग चालान</string>
<string name="pay">भुगतान ें</string>
<string name="pay">भुगतान करें</string>
<string name="lightning_tips">लैटनिंग दान</string>
<string name="note_to_receiver">ग्राहक के लिए सूचना</string>
<string name="thank_you_so_much">बहुत धन्यवाद!</string>
<string name="amount_in_sats">संख्या साट्स में</string>
<string name="amount_in_sats">मात्रा साट्स में</string>
<string name="send_sats">साट्स भेजें</string>
<string name="error_parsing_preview_for">"%1$s का पूर्वीक्षण परखने में अपक्रम : %2$s"</string>
<string name="preview_card_image_for">"%1$s के लिए पूर्वीक्षण पत्ता चित्र"</string>
@ -84,13 +84,13 @@
<string name="description">विवरण</string>
<string name="about_us">"हमारा परिचय.. "</string>
<string name="what_s_on_your_mind">आपके मन में क्या है।</string>
<string name="post">टीका</string>
<string name="post">पत्र प्रकाशन</string>
<string name="save">अभिलेखित करें</string>
<string name="create">बनाएँ</string>
<string name="cancel">रोक दें</string>
<string name="cancel">निरस्त करें</string>
<string name="failed_to_upload_the_image">चित्र आरोहण असफल</string>
<string name="relay_address">पुनःप्रसारक पता</string>
<string name="posts">टीकाएँ</string>
<string name="posts">पत्र</string>
<string name="bytes">अष्टक</string>
<string name="errors">अपक्रम</string>
<string name="home_feed">मुख्य सूचनावली</string>
@ -109,50 +109,601 @@
<string name="avatar_url">अवतारचित्र जालपता</string>
<string name="banner_url">चौडाचित्र जालपता</string>
<string name="website_url">जालस्थान पता</string>
<string name="ln_address">लै॰ने॰ पता</string>
<string name="ln_url_outdated">लै॰ने॰ पता (पुराना)</string>
<string name="image_saved_to_the_gallery">चित्र को चित्रालय में जोड दिया गया</string>
<string name="ln_address">लै॰जाल पता</string>
<string name="ln_url_outdated">लै॰जाल पता (पुराना)</string>
<string name="image_saved_to_the_gallery">चित्र को चित्रालय क्रमक में जोड दिया गया</string>
<string name="failed_to_save_the_image">चित्र को अभिलेखित करने में असफल</string>
<string name="upload_image">चित्र आरोहण</string>
<string name="uploading">आरोहण चल रहा है…</string>
<string name="user_does_not_have_a_lightning_address_setup_to_receive_sats">उपयोगकर्ता का कोई लैटनिंग पता स्थापित नही जिसपर साट्स प्राप्त कर सके</string>
<string name="user_does_not_have_a_lightning_address_setup_to_receive_sats">उपयोगकर्ता का कोई लैटनिंग पता स्थापित नही जिसपर साट्स प्राप्त कर सके</string>
<string name="reply_here">"उत्तर यहाँ दें.. "</string>
<string name="copies_the_note_id_to_the_clipboard_for_sharing">नोस्ट्र में बाँटने के लिए टीका विभेदक का प्रतिलिपि करता है योज्यफलक में</string>
<string name="copy_channel_id_note_to_the_clipboard">प्रणाली विभेदक (टीका) का प्रतिलिपि करें योज्यफलक में</string>
<string name="copies_the_note_id_to_the_clipboard_for_sharing">नोस्ट्र में बाँटने के लिए टीका विभेदक का अनुकरण करता है टाँकाफलक में</string>
<string name="copy_channel_id_note_to_the_clipboard">प्रणाली विभेदक (टीका) का अनुकरण करें टाँकाफलक में</string>
<string name="edits_the_channel_metadata">प्रणाली उपतथ्य का सम्पादन करता है</string>
<string name="join">जुडें</string>
<string name="known">ज्ञात</string>
<string name="new_requests">नये अनुरोध</string>
<string name="blocked_users">अवरोधित उपयोगकर्ता</string>
<string name="blocked_users">बाधित उपयोगकर्ता</string>
<string name="new_threads">नये सूत्र</string>
<string name="conversations">संवाद</string>
<string name="notes">टीकाएँ</string>
<string name="replies">उत्तर</string>
<string name="follows">"अनुचर"</string>
<string name="replies">उत्तरें</string>
<string name="follows">"अनुचरण कर्ता है"</string>
<string name="reports">"सूचनाएँ"</string>
<string name="more_options">अधिक विकल्प</string>
<string name="relays">" पुनःप्रसारक"</string>
<string name="website">जालस्थान</string>
<string name="lightning_address">लैटनिंग पता</string>
<string name="copies_the_nsec_id_your_password_to_the_clipboard_for_backup">NSEC विभेदक (आपका गुप्त पारणशब्द) का प्रतिलिपि करता है योज्यफलक में सुरक्षा के लिए</string>
<string name="copy_private_key_to_the_clipboard">गुप्त कुंचिका का प्रतिलिपि करें योज्यफलक में</string>
<string name="copies_the_public_key_to_the_clipboard_for_sharing">ख्याप्य कुंचिका का प्रतिलिपि करता है योज्यफलक में बाँटने के लिए</string>
<string name="copy_public_key_npub_to_the_clipboard">ख्याप्य कुंचिका (NPub) का प्रतिलिपि करें योज्यफलक में</string>
<string name="copies_the_nsec_id_your_password_to_the_clipboard_for_backup">NSEC विभेदक (आपका गुप्त पारणशब्द) का अनुकरण करता है टाँकाफलक में सुरक्षित रखने के लिए</string>
<string name="copy_private_key_to_the_clipboard">गुप्त कुंचिका का अनुकरण करें टाँकाफलक में</string>
<string name="copies_the_public_key_to_the_clipboard_for_sharing">ख्याप्य कुंचिका का अनुकरण करता है टाँकाफलक में बाँटने के लिए</string>
<string name="copy_public_key_npub_to_the_clipboard">ख्याप्य कुंचिका (NPub) का अनुकरण करें टाँकाफलक में</string>
<string name="send_a_direct_message">सीधा संदेश भेजें</string>
<string name="edits_the_user_s_metadata">उपयोगकर्ता के उपतथ्य का सम्पादन करता है</string>
<string name="follow">अनुरण करें</string>
<string name="follow_back">प्रति अनुरण करें</string>
<string name="unblock">अवरोध हटाएँ</string>
<string name="copy_user_id">उपयोगकर्ता विभेदक का प्रतिलिपि करें</string>
<string name="unblock_user">उपयोगकर्ता अवरोध हटाएँ</string>
<string name="follow">अनुरण करें</string>
<string name="follow_back">प्रति अनुरण करें</string>
<string name="unblock">बाधा हटाएँ</string>
<string name="copy_user_id">उपयोगकर्ता विभेदक का अनुकरण करें</string>
<string name="unblock_user">उपयोगकर्ता बाधा हटाएँ</string>
<string name="npub_hex_username">"npub, उपयोगकर्ता नाम, लेख"</string>
<string name="clear">मा्जित करें</string>
<string name="clear">रिक्त करें</string>
<string name="app_logo">क्रमक चिह्न</string>
<string name="nsec_npub_hex_private_key">nsec.. अथवा npub..</string>
<string name="ncryptsec_password">पारणशब्द कुंचिका को खोलने के लिए</string>
<string name="ncryptsec_password">कुंचिका को खोलने के लिए पारणशब्द</string>
<string name="show_password">पारणशब्द दिखाएँ</string>
<string name="hide_password">पारणशब्द छिपाएँ</string>
<string name="invalid_key">अमान्य कुंचिका</string>
<string name="invalid_key_with_message">अमान्य कुंचिका : %1$s</string>
<string name="i_accept_the">"मैं स्वीकार कर्ता हूँ "</string>
<string name="terms_of_use">प्रयोग के नियम</string>
<string name="acceptance_of_terms_is_required">नियमों को स्वीकृत करना अनिवार्य</string>
<string name="password_is_required">पारणशब्द अनिवार्य</string>
<string name="key_is_required">कुंचिका अनिवार्य</string>
<string name="name_is_required">नाम अनिवार्य</string>
<string name="login">प्रवेशांकन</string>
<string name="sign_up">सदस्यता लें</string>
<string name="create_account">लेखा बनाएँ</string>
<string name="how_should_we_call_you">आपको कैसे सम्बोधित करें</string>
<string name="don_t_have_an_account">क्या नोस्ट्र लेखा नहीं है?</string>
<string name="already_have_an_account">क्या नोस्ट्र लेखा पहले से है?</string>
<string name="create_a_new_account">नया लेखा बनाएँ</string>
<string name="generate_a_new_key">नयी कुंचिका बनाएँ</string>
<string name="loading_feed">सूचनावली प्राप्त किया जा रहा है</string>
<string name="loading_account">लेखा प्राप्त किया जा रहा है</string>
<string name="error_loading_replies">"उत्तरों को प्राप्त करने में अपक्रम "</string>
<string name="try_again">पुनः प्रयास करें</string>
<string name="feed_is_empty">सूचनावली रिक्त है।</string>
<string name="refresh">नवीकरण</string>
<string name="created">बनाया गया</string>
<string name="with_description_of">इसके विवरण सहित</string>
<string name="and_picture">तथा चित्र</string>
<string name="changed_chat_name_to">चर्चा नाम यह बना दिया गया</string>
<string name="description_to">इसका विवरण</string>
<string name="and_picture_to">तथा इसका चित्र</string>
<string name="leave">निर्गमन</string>
<string name="unfollow">अनुचरण ना करें</string>
<string name="channel_created">प्रणाली बनायी गयी</string>
<string name="channel_information_changed_to">"प्रणाली सूचना परिवर्तित किया गया यथा"</string>
<string name="public_chat">सार्वजनिक चर्चा</string>
<string name="posts_received">पत्र प्राप्त</string>
<string name="remove">हटाएँ</string>
<string name="translations_auto">स्वचालित</string>
<string name="translations_translated_from">इससे अनुवादित</string>
<string name="translations_to">इस तक</string>
<string name="translations_show_in_lang_first">प्रथम %1$s में दिखाएँ</string>
<string name="translations_always_translate_to_lang">सर्वदा अनुवाद करें %1$s में</string>
<string name="translations_never_translate_from_lang">कभी भी अनुवाद ना करें %1$s से</string>
<string name="nip_05">नोस्ट्र पता</string>
<string name="never">कभी नहीं</string>
<string name="now">अभी</string>
<string name="h"></string>
<string name="m"></string>
<string name="d"></string>
<string name="nudity">नग्नता</string>
<string name="profanity_hateful_speech">अपशब्द / द्वेषपूर्ण भाषण</string>
<string name="report_hateful_speech">द्वेषपूर्ण भाषण की सूचना दें</string>
<string name="report_nudity_porn">नग्नता / अश्लील चित्र की सूचना दें</string>
<string name="others">अन्य</string>
<string name="mark_all_known_as_read">सब ज्ञात को पढ लिया चिह्नित करें</string>
<string name="mark_all_new_as_read">सब नये को पढ लिया चिह्नित करें</string>
<string name="mark_all_as_read">सब पढ लिया चिह्नित करें</string>
<string name="backup_keys">कुंचिका सुरक्षित करें</string>
<string name="account_backup_tips2_md" tools:ignore="Typos">## कुंचिका सुरक्षार्थ प्रतिलिपि तथा सुरक्षा सुझाव
\n\nआपकी लेखा एक गुप्त कुंचिका से सुरक्षित किया गया है। कुंचिका अक्षरों की एक लम्बी श्रृंखला है जो **nsec1** से आरम्भ होता है। जिस किसी के पास यह कुंचिका है वह पत्र प्रकाशन कर सकेगा तथा आपका परिचय परिवर्तित कर सकेगा।
\n\n- आपकी गुप्त कुंचिका किसी भी जालस्थान अथवा क्रमक में **ना** डालें जिसपर आपका विश्वास ना हो।
\n- अमेथिस्ट क्रमलेख विकासकर्ता आपकी गुप्त कुंचिका **कभी नहीं** पूछेंगे।
\n- आपकी गुप्त कुंचिका की एक सुरक्षित प्रतिलिपि **अवश्य** रखें अपनी लेखा पुनः प्राप्त करने के लिए। पारणशब्ध प्रबंधन क्रमक की पुनःशंसा करते हैं।
</string>
<string name="account_backup_tips3_md" tools:ignore="Typos"> अधिक सुरक्षा के लिए आप अपनी कुंचिका का रहस्यीकरण कर सकते हैं एक पारणशब्द के साथ। यह कुंचिका आरम्भ होगी **ncryptsec1** से तथा पारणशब्द के बिना प्रयोग साध्य नहीं।
\n\n यदि आप अपना पारणशब्द खो देते हैं, तो आप अपनी कुंचिका को पुनः प्राप्त नहीं कर सकते।
</string>
<string name="failed_to_encrypt_key">आपकी निजी कुंचिका का रहस्यीकरण असफल</string>
<string name="secret_key_copied_to_clipboard">गुप्त कुंचिका (nsec) का अनुकरण टाँकाफलक में डाला गया।</string>
<string name="copy_my_secret_key">मेरी गुप्त कुंचिका का अनुकरण करें</string>
<string name="encrypt_and_copy_my_secret_key">मेरी गुप्त कुंचिका का रहस्यीकरण तथा अनुकरण करें</string>
<string name="biometric_authentication_failed">प्रमाणीकरण असफल</string>
<string name="biometric_authentication_failed_explainer">जैविकमात्राएँ द्वारा इस संचारयन्त्र के अधिपति का प्रमाणीकरण असफल</string>
<string name="biometric_authentication_failed_explainer_with_error">जैविकमात्राएँ द्वारा इस संचारयन्त्र के अधिपति का प्रमाणीकरण असफल। अपक्रम : %1$s</string>
<string name="biometric_error">अपक्रम</string>
<string name="badge_created_by">"%1$s के द्वारा बनाया गया"</string>
<string name="badge_award_image_for">"पदक पुरस्कार चित्र %1$s के लिए"</string>
<string name="new_badge_award_notif">आपको नया पदक पुरस्कार प्राप्त हुआ</string>
<string name="award_granted_to">पदक पुरस्कार इनको दिया गया</string>
<string name="copied_note_text_to_clipboard">टीका लेख की प्रतिलिपि किया गया टाँकाफलक में</string>
<string name="copied_user_id_to_clipboard" tools:ignore="Typos">लेखक का @npub का अनुकरण किया गया टाँकाफलक में</string>
<string name="copied_note_id_to_clipboard" tools:ignore="Typos">टीका विभेदक (@note1) का अनुकरण किया गया टाँकाफलक में</string>
<string name="select_text_dialog_top">लेख चुनें</string>
<string name="private_conversation_notification">"&lt;निजी संदेश का अरहस्यीकरण असफल&gt;\n\nआप का उल्लेख किया गया एक निजी / रहस्यीकृत संवाद में %1$s तथा %2$s के बीच."</string>
<string name="account_switch_add_account_dialog_title">लेखा</string>
<string name="drawer_accounts">लेखाएँ</string>
<string name="account_switch_select_account">लेखा चुनें</string>
<string name="account_switch_add_account_btn">नया लेखा जोडें</string>
<string name="account_switch_active_account">सक्रिय लेखा</string>
<string name="account_switch_has_private_key">निजी कुंचिका उपलब्ध</string>
<string name="account_switch_pubkey_only">केवल पढ सकते हैं, निजी कुंचिका नहीं</string>
<string name="back">पीछे चलें</string>
<string name="quick_action_select">चयन करें</string>
<string name="quick_action_share_browser_link">जालसंचारक पता बाँटें</string>
<string name="quick_action_share">बाँटें</string>
<string name="quick_action_copy_user_id">लेखक विभेदक</string>
<string name="quick_action_copy_note_id">टीका विभेदक</string>
<string name="quick_action_copy_text">लेख की प्रतिलिपि करें</string>
<string name="quick_action_delete">मिटाएँ</string>
<string name="quick_action_unfollow">अनुचरण ना करें</string>
<string name="quick_action_follow">अनुचरण करें</string>
<string name="quick_action_request_deletion_alert_title">हटाने की याचना</string>
<string name="quick_action_request_deletion_alert_body">अमेथिस्ट अनुरोध करेगा कि आपका टीका मिटा दिया जाए उन पुनःप्रसारकों से जिनके साथ आप अब जुडे हुए हैं। कोई आश्वासन नहीं कि आपका टीका सर्वदा के लिए मिटा दिया जाएगा उन पुनःप्रसारकों से, अथवा अन्य पुनःप्रसारकों में से जहाँ यह रखा गया हो।</string>
<string name="quick_action_block_dialog_btn">बाधित करें</string>
<string name="quick_action_delete_dialog_btn">मिटाएँ</string>
<string name="quick_action_block">बाधित करें</string>
<string name="quick_action_report">सूचना</string>
<string name="quick_action_delete_button">मिटाएँ</string>
<string name="quick_action_dont_show_again_button">फिर से ना दिखाएँ</string>
<string name="report_dialog_spam">कचरालेख अथवा घोटाला</string>
<string name="report_dialog_profanity">अपशब्द अथवा द्वेषपूर्ण बरताव</string>
<string name="report_dialog_impersonation">दुर्भावनापूर्ण पररूपण</string>
<string name="report_dialog_nudity">नग्नता अथवा आपत्तिजनक विषयवस्तु</string>
<string name="report_dialog_illegal">अवैध बरताव</string>
<string name="report_dialog_blocking_a_user">उपयोगकर्ता को बाधित करने से उनका विषयवस्तु आपके लिए छिपाया जाएगा क्रमक में। आपके टीकाएँ सार्वजनिक रूप से दृश्य रहेंगे, उन जनों के लिए भी जिनहे आपने बाधित किया। बाधित उपयोगकर्ता सूचित हैं सुरक्षा छलनियाँ पटल पर।</string>
<string name="report_dialog_block_hide_user_btn"><![CDATA[उपयोगकर्ता को बाधित करें तथा छिपाएँ]]></string>
<string name="report_dialog_report_btn">दुर्व्यवहार की सूचना दें</string>
<string name="report_dialog_reminder_public">सभी प्रकाशित सूचनाएँ सार्वजनिक रूप से दृश्य होंगे।</string>
<string name="report_dialog_additional_reason_placeholder">विकल्पतः अधिक प्रसंग उपलब्ध करवाएँ आपकी सूचना के विषय में…</string>
<string name="report_dialog_additional_reason_label">अधिक प्रसंग</string>
<string name="report_dialog_select_reason_label">कारण</string>
<string name="report_dialog_select_reason_placeholder">एक कारण का चयन करें…</string>
<string name="report_dialog_post_report_btn">सूचना प्रकाशित करें</string>
<string name="report_dialog_title">बाधित करें तथा सूचना दें</string>
<string name="block_only">बाधित करें</string>
<string name="bookmarks">स्मारकचिह्न</string>
<string name="drafts">पाण्डुलिपियाँ</string>
<string name="private_bookmarks">निजी स्मारकचिह्नित वस्तु</string>
<string name="public_bookmarks">सार्वजनिक स्मारकचिह्नित वस्तु</string>
<string name="add_to_private_bookmarks">निजी स्मारकचिह्नित वस्तु सूची में जोडें</string>
<string name="add_to_public_bookmarks">सार्वजनिक स्मारकचिह्नित वस्तु सूची में जोडें</string>
<string name="remove_from_private_bookmarks">निजी स्मारकचिह्नित वस्तु सूची से हटाएँ</string>
<string name="remove_from_public_bookmarks">सार्वजनिक स्मारकचिह्नित वस्तु सूची से हटाएँ</string>
<string name="wallet_connect_service">धनकोष संयोजन सेवा</string>
<string name="wallet_connect_service_explainer">एक नोस्ट्र रहस्य को अधिकृत करता है ज्साप भुगतान करने के लिए क्रमक से बाहर चले बिना। रहस्य को सुरक्षित रखें तथा एक निजी पुनःप्रसारक का प्रयोग करें हो सके तो।</string>
<string name="wallet_connect_service_pubkey">धनकोष संयोजन ख्याप्यकुंचिका</string>
<string name="wallet_connect_service_relay">धनकोष संयोजन पुनःप्रसारक</string>
<string name="wallet_connect_service_secret">धनकोष संयोजन रहस्य</string>
<string name="wallet_connect_service_show_secret">गुप्त कुंचिका दिखाएँ</string>
<string name="wallet_connect_service_secret_placeholder">nsec / षोडशांकरूप निजी कुंचिका</string>
<string name="pledge_amount_in_sats">प्रतिज्ञा मात्रा साट्स में</string>
<string name="post_poll">मतदान पत्र प्रकाशित करें</string>
<string name="poll_heading_required">अनिवार्य प्रपत्रस्थान :</string>
<string name="poll_zap_recipients">ज्साप के ग्राहक</string>
<string name="poll_primary_description">प्रमुख मतदान विवरण…</string>
<string name="poll_option_index">विकल्प %s</string>
<string name="poll_option_description">मतदान विकल्प विवरण</string>
<string name="poll_heading_optional">प्रपत्रस्थान जो अनिवार्य नहीं :</string>
<string name="poll_zap_value_min">ज्साप न्यूनतम</string>
<string name="poll_zap_value_max">ज्साप अधिकतम</string>
<string name="poll_consensus_threshold">सर्वसम्मति</string>
<string name="poll_consensus_threshold_percent">( से १००) प्रतिशत</string>
<string name="poll_closing_time">के पश्चात समाप्त करें</string>
<string name="poll_closing_time_days">दिन</string>
<string name="poll_unable_to_vote">मतदान देनें में असफल</string>
<string name="poll_is_closed_explainer">मतदान समाप्त हो गया</string>
<string name="poll_zap_amount">ज्साप मात्रा</string>
<string name="one_vote_per_user_on_atomic_votes">प्रत्येक उपयोगकर्ता को केवल एक मत देने की अनुमति है इस प्रकार के मतदान में।</string>
<string name="looking_for_event">"घटना %1$s के लिए खोज चल रहा है"</string>
<string name="custom_zaps_add_a_message">सार्वजनिक संदेश जोडें</string>
<string name="custom_zaps_add_a_message_private">निजी संदेश जोडें</string>
<string name="custom_zaps_add_a_message_nonzap">चालान संदेश जोडें</string>
<string name="custom_zaps_add_a_message_example">आपके परिश्रम के लिए धन्यवाद!</string>
<string name="lightning_create_and_add_invoice">बनाएँ तथा जोडें</string>
<string name="poll_author_no_vote">मतदानकर्ता अपने ही मतदान में मत नहीं दे सकते।</string>
<string name="hash_verification_info_title">इसका अर्थ क्या है?</string>
<string name="hash_verification_passed">यह विषयवस्तु वैसे ही है जैसे पत्र प्रकाशन पर</string>
<string name="hash_verification_failed">यह विषयवस्तु परिवर्तित हुआ है। हो सकता है लेखक ने परिवर्तन देखा नहीं अथवा अनुमति दिया नहीं।</string>
<string name="content_description_add_image">चित्र जोडें</string>
<string name="content_description_add_video">चलचित्र जोडें</string>
<string name="content_description_add_document">पत्र जोडें</string>
<string name="add_content">संदेश मे जोड दें</string>
<string name="content_description">विषयवस्तु का विवरण</string>
<string name="content_description_example">एक नीला नाव श्वेत रेतीला तट पर सूर्यास्त पर</string>
<string name="zap_type">ज्साप प्रकार</string>
<string name="zap_type_explainer">ज्साप प्रकार सभी विकल्पों के लिए</string>
<string name="zap_type_public">सार्वजनिक</string>
<string name="zap_type_public_explainer">सब देख सकते हैं व्यापार तथा संदेश</string>
<string name="zap_type_private">निजी</string>
<string name="zap_type_private_explainer">भेजनेवाला तथा ग्राहक एक दूसरे को देख सकते हैं तथा संदेश पढ सकते हैं</string>
<string name="zap_type_anonymous">नामरहित</string>
<string name="zap_type_anonymous_explainer">ग्राहक तथा जनता को पता नहीं किसने भुगतान भेजा</string>
<string name="zap_type_nonzap">ज्साप अतिरिक्त</string>
<string name="zap_type_nonzap_explainer">नोस्ट्र में कोई पदचिह्न नहीं, केवल लैटनिंग पर</string>
<string name="file_server">अभिलेख सेवाकर्ता</string>
<string name="zap_forward_lnAddress">लै॰जाल पता अथवा @उपयोगकर्ता</string>
<string name="upload_server_relays_nip95">आपके पुनःप्रसारक (NIP-95)</string>
<string name="upload_server_relays_nip95_explainer">अभिलेख आपके पुनःप्रसारक द्वारा रखे जाते हैं। नया NIP: जाँच करें यदि वे सक्षम हैं</string>
<string name="connect_via_tor_short">टोर / ओर्बोट स्थापन</string>
<string name="connect_via_tor">आपकी ओर्बोट स्थापना द्वारा संयोजन करें</string>
<string name="do_you_really_want_to_disable_tor_title">क्या आपके ओर्बोट / टोर से संयोजन काटें</string>
<string name="do_you_really_want_to_disable_tor_text">आपके तथ्य तत्क्षणतः सामान्य जाल से चलने लगेंगे</string>
<string name="yes">हाँ</string>
<string name="no">नहीं</string>
<string name="follow_list_selection">अनुचरण सूची</string>
<string name="follow_list_kind3follows">सभी अनुचरण</string>
<string name="follow_list_global">वैश्विक</string>
<string name="follow_list_mute_list">मौन सूची</string>
<string name="connect_through_your_orbot_setup_markdown"> ## टोर द्वारा संयोजन करें ओर्बोट के साथ
\n\n१. स्थापित करें [ओर्बोट](https://play.google.com/store/apps/details?id=org.torproject.android)
\n२. ओर्बोट आरम्भ करें
\n३. ओर्बोट में, सोक्स॰ द्वार का जाँच करें। मूलविकल्पतः ९०५० का प्रयोग कर्ता है।
\n४. यदि आवश्यक हो तो ओर्बोट में द्वार परिवर्तित करें
\n५. सोक्स॰ द्वार की समाकृति स्थापित करें इस पटल पर
\n६. सक्रिय करें घुण्डी दबाएँ ओर्बोट को घटक के रूप में प्रयोग करने के लिए
</string>
<string name="orbot_socks_port">ओर्बोट सोक्स॰ द्वार</string>
<string name="invalid_port_number">द्वार अंक अमान्य</string>
<string name="use_orbot">ओर्बोट का प्रयोग करें</string>
<string name="disconnect_from_your_orbot_setup">टोर / ओर्बोट संयोजन काट दें</string>
<string name="app_notification_dms_channel_name">निजी संदेश</string>
<string name="app_notification_dms_channel_description">आपको सूचित करेगा जब एक निजी संदेश आता है</string>
<string name="app_notification_zaps_channel_name">ज्साप प्राप्त</string>
<string name="app_notification_zaps_channel_description">सूचित करेगा जब किसी ने आपको ज्साप किया</string>
<string name="app_notification_zaps_channel_message">%1$s साट्स</string>
<string name="app_notification_zaps_channel_message_from">%1$s से</string>
<string name="app_notification_zaps_channel_message_for">%1$s के लिए</string>
<string name="reply_notify">सूचित करें : </string>
<string name="channel_list_join_conversation">संवाद में जुड जाएँ</string>
<string name="channel_list_user_or_group_id">उपयोगकर्ता अथवा समूह विभेदक</string>
<string name="channel_list_user_or_group_id_demo">npub, nevent अथवा षोडशांकरूप</string>
<string name="channel_list_create_channel">बनाएँ</string>
<string name="channel_list_join_channel">जुडें</string>
<string name="today">आज</string>
<string name="content_warning">विषयवस्तु चेतावनी</string>
<string name="content_warning_explanation">इस पत्र में संवेदनशील विषयवस्तु समावेशित है जो कुछ लोगों के लिए आपत्तिजनक अथवा व्याकुल करनेवाला लग सकता है</string>
<string name="content_warning_hide_all_sensitive_content">संवेदनशील विषयवस्तु सर्वदा छिपाएँ</string>
<string name="content_warning_show_all_sensitive_content">संवेदनशील विषयवस्तु सर्वदा दिखाएँ</string>
<string name="content_warning_see_warnings">विषयवस्तु चेतावनीयाँ सर्वदा दिखाएँ</string>
<string name="recommended_apps">प्रशंसित : </string>
<string name="filter_spam_from_strangers">अपरिचित जन के भेजे गये कचरा संदेश छलनी द्वारा हटाएँ</string>
<string name="warn_when_posts_have_reports_from_your_follows">चेतावनी दें जब पत्र सूचित किये गये हों आपके अनुचरों द्वारा</string>
<string name="new_reaction_symbol">नया प्रतिक्रिया चिह्न</string>
<string name="no_reaction_type_setup_long_press_to_change">इस उपयोगकर्ता के लिए कोई प्रतिक्रिया प्रकार पूर्व चयनित नहीं। हृदयचिह्न घुण्डी पर दीर्घतः दबाएँ परिवर्तन करने के लिए</string>
<string name="zapraiser">ज्सापोपार्जन योजना</string>
<string name="zapraiser_explainer">इस प्रसारण के साथ साट्स मात्रा का उपार्जन लक्ष्य जोडता है। सक्षम ग्राहक दान का प्रोत्साहन हेतु एक प्रगतिमान डण्डा के रूप में इसे दिखा सकते हैं</string>
<string name="zapraiser_target_amount_in_sats">लक्ष्य मात्रा साट्स में</string>
<string name="sats_to_complete">ज्सापोपार्जन योजना %1$s पर। %2$s साट्स का लक्ष्य</string>
<string name="read_from_relay">पुनःप्रसारक से पढें</string>
<string name="write_to_relay">पुनःप्रसारक को लिखकर भेजें</string>
<string name="an_error_occurred_trying_to_get_relay_information">%1$s से पुनःप्रसारक जानकारी प्राप्त करने के प्रयास में अपक्रम हुआ</string>
<string name="owner">अधिपति</string>
<string name="version">संस्करण</string>
<string name="software">क्रमक</string>
<string name="contact">सम्पर्क</string>
<string name="supports">सक्षम NIPs</string>
<string name="admission_fees">प्रवेश शुल्क</string>
<string name="payments_url">भुगतान जालपता</string>
<string name="limitations">परिसीमाएँ</string>
<string name="countries">देश</string>
<string name="languages">भाषाएँ</string>
<string name="tags">विषयसूचक</string>
<string name="posting_policy">पत्र प्रकाशन नीति</string>
<string name="message_length">संदेश लम्बाई</string>
<string name="subscriptions">ग्राहकताएँ</string>
<string name="filters">छलनियाँ</string>
<string name="subscription_id_length">ग्राहकता विभेदक की लम्बाई</string>
<string name="minimum_prefix">न्यूनतम उपसर्ग</string>
<string name="maximum_event_tags">अधिकतम घटना विषयसूचक</string>
<string name="content_length">विषयवस्तु लम्बाई</string>
<string name="minimum_pow">न्यूनतम PoW</string>
<string name="auth">प्रमाणीकरण</string>
<string name="payment">भुगतान</string>
<string name="cashu">काश्यु लिपिखण्ड</string>
<string name="cashu_redeem">चुकाएँ</string>
<string name="cashu_redeem_to_zap">ज्साप धनकोष को भेजें</string>
<string name="cashu_redeem_to_cashu">काश्यु धनकोष में खोलें</string>
<string name="cashu_copy_token">लिपिखण्ड का अनुकरण करें</string>
<string name="no_lightning_address_set">लैटनिंग पता स्थापित नहीं</string>
<string name="copied_token_to_clipboard">लिपिखण्ड का अनुकरण किया गया टाँकाफलक में</string>
<string name="live_stream_live_tag">तत्क्षणप्रसार</string>
<string name="live_stream_offline_tag">जालरहित</string>
<string name="live_stream_ended_tag">समाप्त</string>
<string name="live_stream_planned_tag">समय निर्धारित</string>
<string name="live_stream_is_offline">तत्क्षणप्रसार कट गया</string>
<string name="live_stream_has_ended">तत्क्षणप्रसार समाप्त</string>
<string name="are_you_sure_you_want_to_log_out">निर्गमनांकन करने पर आपकी सारी स्थानीय जानकारी मिट जाएगी। सुनिश्चित करें कि आपके निजी कुंचिकाएँ सुरक्षित रखें हैं अपनी लेखा नहीं खोना चाहते हैं तो। क्या आप आगे बढना चाहते हैं?</string>
<string name="followed_tags">अनुचरण किये हुए विषयसूचक</string>
<string name="relay_setup">पुनःप्रसारक</string>
<string name="discover_marketplace">पण्यक्षेत्र</string>
<string name="discover_live">तत्क्षणप्रसार</string>
<string name="discover_community">समुदाय</string>
<string name="discover_chat">चर्चाएँ</string>
<string name="community_approved_posts">अनुमति प्राप्त पत्र</string>
<string name="groups_no_descriptor">इस झुण्ड का कोई विवरण नहीं नियम नहीं। इसके अधिपति से बात करें इनहे जोडने के लिए</string>
<string name="community_no_descriptor">इस समुदाय का कोई विवरण नहीं। इसके अधिपति से बात करें इसे जोडने के लिए</string>
<string name="add_sensitive_content_label">संवेदनशील विषयवस्तु</string>
<string name="add_sensitive_content_description">इसे दिखाने से पूर्व संवेदनशील विषयवस्तु चेतावनी जोडता है</string>
<string name="settings">स्थापना विकल्प</string>
<string name="connectivity_type_always">सर्वदा</string>
<string name="connectivity_type_wifi_only">केवल वैफै</string>
<string name="connectivity_type_never">कभी नहीं</string>
<string name="ui_feature_set_type_complete">सम्पन्न</string>
<string name="ui_feature_set_type_simplified">सरलीकृत</string>
<string name="system">यन्त्रव्यवस्था</string>
<string name="light">प्रकाशवान</string>
<string name="dark">अन्धकारमय</string>
<string name="application_preferences">क्रमक आद्यताएँ</string>
<string name="language">भाषा</string>
<string name="theme">प्रदर्शनशैली</string>
<string name="automatically_load_images_gifs">चित्र पूर्वीक्षण</string>
<string name="automatically_play_videos">चलचित्र का चालन</string>
<string name="automatically_show_url_preview">जालपता पूर्वीक्षण</string>
<string name="automatically_hide_nav_bars">निमग्न पृष्ठघुमाव</string>
<string name="automatically_hide_nav_bars_description">मार्गदर्शनपट्टों को छिपाएँ पृष्ठघुमाव करने पर</string>
<string name="ui_style">प्रयोगमाध्यम शैली</string>
<string name="ui_style_description">पत्र प्रकाशन शैली का चयन करें</string>
<string name="load_image">चित्र प्राप्त करें</string>
<string name="spamming_users">कचराकार</string>
<string name="muted_button">मौन किया गया। सुनने के लिए टाँकें</string>
<string name="mute_button">ध्वनि सक्रिय। मौन करने के लिए टाँकें</string>
<string name="search_button">स्थानीय तथा दूरस्थ अभिलेखों को खोजें</string>
<string name="nip05_verified">नोस्ट्र पता का सत्यापन सफल</string>
<string name="nip05_failed">नोस्ट्र पता का सत्यातन असफल</string>
<string name="nip05_checking">नोस्ट्र पता का जाँच चल रहा है</string>
<string name="select_deselect_all">सब का चयन / अचयन करें</string>
<string name="default_relays">मूलविकल्प</string>
<string name="select_a_relay_to_continue">पुनःप्रसारक चुनें आगे बढने के लिए</string>
<string name="zap_forward_title">ज्साप आगे भेजें इनको :</string>
<string name="zap_forward_explainer">सक्षम ग्राहक ज्सापों को आगे भेजेंगे इस लै॰जाल पता को अथवा उपयोगकर्ता परिचय जो नीचे है तथा आपके पते को नहीं</string>
<string name="geohash_title">स्थान अनावृत करें इस प्रकार </string>
<string name="geohash_explainer">आपका भूगोलिक स्थान विभेदक जोडता है प्रसारण में। जनता जान जाएँगे आप वर्तमान स्थान से ५ कि॰मे॰ (३ मी॰) की दूरी के अन्दर हैं</string>
<string name="add_sensitive_content_explainer">आपके विषयवस्तु दिखाने से पूर्व संवेदनशील विषयवस्तु चेतावनी जोडता है। यह आदर्श है किसी कार्यालय अनुचित विषयवस्तु के लिए अथवा जिससे कुछ लोगों को आपत्तिजनक अथवा व्याकुल करनेवाला लग सकता है</string>
<string name="new_feature_nip24_might_not_be_available_title">नयी सुविधा</string>
<string name="new_feature_nip24_might_not_be_available_description">इस कार्यशैली सक्षम करने के लिए अमेथिस्ट के द्वारा NIP-24 संदेश (उपहारकोषयुक्त, आच्छादित सीधा तथा झुण्ड संदेश) भेजना पडेगा। यह NIP-24 नया है तथा अनेक ग्राहक इसे कार्यान्वित किया नहीं अब तक। सुनिश्चित करें कि प्राप्तकर्ता एक अनुकूल ग्राहक का प्रयोग कर रहे हैं।</string>
<string name="new_feature_nip24_activate">सक्रिय करें</string>
<string name="messages_create_public_chat">सार्वजनिक</string>
<string name="messages_create_public_private_chat_desription">नया निजी अथवा सार्वजनिक झुण्ड</string>
<string name="messages_new_message">निजी</string>
<string name="messages_new_message_to">के लिए</string>
<string name="messages_new_message_subject">विषय</string>
<string name="messages_new_message_subject_caption">संवाद का विषय</string>
<string name="messages_new_message_to_caption">"\@User1, @User2, @User3"</string>
<string name="messages_group_descriptor">इस झुण्ड के सदस्य</string>
<string name="messages_new_subject_message">सदस्यों के लिए व्याख्यान</string>
<string name="messages_new_subject_message_placeholder">नये लक्ष्य के लिए नाम का परिवर्तन</string>
<string name="paste_from_clipboard">टाँकाफलक से चिपकाएँ</string>
<string name="language_description">क्रमक के प्रयोगमाध्यम के लिए</string>
<string name="theme_description">अन्धकारमय, प्रकाशवान अथवा यन्त्रव्यवस्थित प्रदर्शनशैली</string>
<string name="automatically_load_images_gifs_description">स्वचालित रूप से चित्र तथा GIFs का अवरोहण करें</string>
<string name="automatically_play_videos_description">स्वचालित रूप से चलचित्र तथा GIFs चलाता है</string>
<string name="automatically_show_url_preview_description">जालपता के पूर्विक्षण दिखाएँ</string>
<string name="load_image_description">चित्रों का अवरोहण कब करें</string>
<string name="copy_to_clipboard">टाँकाफलक में अनुकरण करें</string>
<string name="copy_npub_to_clipboard">टाँकाफलक में npub का अनुकरण करें</string>
<string name="copy_url_to_clipboard">टाँकाफलक में जालपता का अनुकरण करें</string>
<string name="copy_the_note_id_to_the_clipboard">टाँकाफलक में टीका विभेदक का अनुकरण करें</string>
<string name="created_at">पर बनाया गया</string>
<string name="rules">नियमावली</string>
<string name="login_with_external_signer">आम्बेर के साथ प्रवेशांकन करें</string>
<string name="status_update">आपकी स्थिति का नवीकरण करें</string>
<string name="lightning_wallets_not_found">अपक्रम संदेश परखने में अपक्रम</string>
<string name="poll_zap_value_min_max_explainer">निर्वाचन का भार ज्साप मात्रा के अनुसार माना जाता है। आप एक न्यूनतम मात्रा स्थापित कर सकते हैं कचरालेखकर्ताओं से बचने के लिए तथा एक अधिकतम मात्रा बडे ज्सापकर्ताओं के द्वारा मतदान का अधिग्रहण होने से बचने के लिए। दोनों स्थानों में एक ही मात्रा का प्रयोग करें प्रत्येक निर्वाचन का मूल्य समान मानने को सुनिश्चित करने के लिए। रिक्त रख दें कुछ भी मात्रा स्वीकार करने के लिए।</string>
<string name="error_dialog_zap_error">ज्साप भेजने में असफल</string>
<string name="error_dialog_talk_to_user">उपयोगकर्ता को संदेश भेजें</string>
<string name="error_dialog_button_ok">ठीक है</string>
<string name="relay_information_document_error_assemble_url">%1$s तक जा नहीं पाए : %2$s</string>
<string name="relay_information_document_error_reach_server">%1$s तक जा नहीं पाए : %2$s</string>
<string name="relay_information_document_error_parse_result">%1$s से परिणाम परख नहीं पाए : %2$s</string>
<string name="relay_information_document_error_http_status">%1$s असफल हुआ इस संकेतक के साथ : %2$s</string>
<string name="active_for">के लिए सक्रिय : </string>
<string name="active_for_home">मुखपृष्ठ</string>
<string name="active_for_msg">सीधे संदेश</string>
<string name="active_for_chats">चर्चाएँ</string>
<string name="active_for_global">वैश्विक</string>
<string name="active_for_search">खोज</string>
<string name="zap_split_title">ज्साप विभाजन करें तथा आगे भेजें</string>
<string name="zap_split_explainer">सक्षम ग्राहक ज्सापों का विभाजन करेंगे तथा यहाँ जोडे गये उपयोगकर्ताओं को आगे भेजेंगे आपके स्थान पर</string>
<string name="zap_split_search_and_add_user">खोजें तथा उपयोगकर्ता जोडें</string>
<string name="zap_split_search_and_add_user_placeholder">उपयोगकर्ता नाम अथवा प्रदर्शन नाम</string>
<string name="missing_lud16">लैटनिंग स्थापना अनुपलब्ध</string>
<string name="user_x_does_not_have_a_lightning_address_setup_to_receive_sats">उपयोगकर्ता %1$s का कोई लैटनिंग पता स्थापित नही साट्स प्राप्त करने के लिए</string>
<string name="zap_split_weight">प्रतिशत</string>
<string name="zap_split_weight_placeholder">२५</string>
<string name="splitting_zaps_with">ज्साप का विभाजन इसके साथ</string>
<string name="forwarding_zaps_to">ज्साप आगे भेजा जा रहा है इनको</string>
<string name="lightning_wallets_not_found2">लैटनिंग धनकोष ढूँढने में असफल</string>
<string name="paid">भुगतान किया गया</string>
<string name="wallet_number">धनकोष %1$s</string>
<string name="error_opening_external_signer">हस्ताक्षर क्रमक खोलने में अपक्रम</string>
<string name="error_opening_external_signer_description">हस्ताक्षर क्रमक ढूँढने में असफल। जाँच करें यदि क्रमक को अस्थापित नहीं किया गया हो</string>
<string name="sign_request_rejected">हस्ताक्षर याचना अस्वीकृत</string>
<string name="sign_request_rejected_description">सुनिश्चित करें हस्ताक्षर क्रमक ने इस व्यापार को अनुमति दिया</string>
<string name="no_wallet_found_with_error">कोई धनकोष प्राप्त नहीं लैटनिंग चालान चुकाने के लिए (अपक्रम : %1$s)। कृपया एक लैटनिंग धनकोष की स्थापना करें ज्सापों का प्रयोग करने के लिए</string>
<string name="no_wallet_found">कोई धनकोष प्राप्त नहीं लैटनिंग चालान चुकाने के लिए। कृपया एक लैटनिंग धनकोष की स्थापना करें ज्सापों का प्रयोग करने के लिए</string>
<string name="hidden_words">छिपाए गये शब्द</string>
<string name="hide_new_word_label">नया शब्द अथवा वाक्य छिपाएँ</string>
<string name="automatically_show_profile_picture">परिचय चित्र</string>
<string name="automatically_show_profile_picture_description">परिचय चित्र दिखाएँ</string>
<string name="select_an_option">विकल्प का चयन करें</string>
<string name="error_dialog_pay_invoice_error">चालान का भुगतान नहीं कर पाए</string>
<string name="error_dialog_pay_withdraw_error">निकाल नहीं पाए</string>
<string name="error_parsing_nip47_title">धनकोष संयोजन स्थापित नहीं कर पाए</string>
<string name="error_parsing_nip47">NIP-47 संयोजन सूत्र परखने में अपक्रम। जाँच करें यदि यह सम्यक है अपने धनकोष सेवा प्रदाता के साथ : %1$s। अपक्रम : %2$s</string>
<string name="error_parsing_nip47_no_error">NIP-47 संयोजन सूत्र परखने में अपक्रम। जाँच करें यदि यह सम्यक है अपने धनकोष सेवा प्रदाता के साथ : %1$s।</string>
<string name="cashu_failed_redemption">काश्यु नहीं चुका पाए</string>
<string name="cashu_failed_redemption_explainer_error_msg">टकसाल ने यह अपक्रम संदेश उपलब्ध किया : %1$s</string>
<string name="cashu_failed_redemption_explainer_already_spent">काश्यु लिपिखण्ड का व्यय हो चुका।</string>
<string name="cashu_successful_redemption">काश्यु प्राप्त</string>
<string name="cashu_successful_redemption_explainer">%1$s साट्स भेजे गये आपके धनकोष में। (शुल्क : %2$s साट्स)</string>
<string name="cashu_no_wallet_found">कोई अनुकूल काश्यु धनकोष उपलब्ध नहीं यन्त्र में</string>
<string name="error_unable_to_fetch_invoice">प्राप्तकर्ता के सेवा संगणक से चालान नहीं लाया जा सका</string>
<string name="wallet_connect_pay_invoice_error_error">आपका धनकोष संयोजन प्रदाता ने यह अपक्रम लौटाया : %1$s</string>
<string name="could_not_connect_to_tor">टोर से जुड नहीं पाए</string>
<string name="unable_to_download_relay_document">पुनःप्रसारक पत्र का अवरोहण अनुपलब्ध</string>
<string name="could_not_assemble_lnurl_from_lightning_address_check_the_user_s_setup">लै॰जालपता नहीं बना पाए लै॰पता \"%1$s\" से। उपयोगकर्ता की स्थापना की जाँच करें</string>
<string name="the_receiver_s_lightning_service_at_is_not_available_it_was_calculated_from_the_lightning_address_error_check_if_the_server_is_up_and_if_the_lightning_address_is_correct">ग्राहक की लैटनिंग सेवा %1$s पर उपलब्ध नहीं। इसका संकलन किया गया \"%2$s\" लैटनिंग पता से। अपक्रम : %3$s। जाँच करें यदि सेवा संगणक चल रहा है तथा यदि लैटनिंग पता सम्यक है</string>
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct">%1$s का सुलझाव नहीं कर पाए। जाँच करें यदि आप संयोजित हैं, यदि सेवा संगणक चल रहा है तथा यदि लैटनिंग पता %2$s सम्यक है</string>
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">%1$s का सुलझाव नहीं कर पाए। जाँच करें यदि आप संयोजित हैं, यदि सेवा संगणक चल रहा है तथा यदि लैटनिंग पता %2$s सम्यक है।\n\nअपवर्ग था : %3$s</string>
<string name="could_not_fetch_invoice_from">%1$s से चालान नहीं लाया जा सका</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">लैटनिंग पता से JSON परखनें में अपक्रम। उपयोगकर्ता की लैटनिंग स्थापना की जाँच करें</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">%1$s से JSON परखनें में अपक्रम। उपयोगकर्ता की लैटनिंग स्थापना की जाँच करें</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">प्रत्याह्वान जालपता उपलब्ध नहीं उपयोगकर्ता के लैटनिंग पता सेवासंगणक की समाकृति में</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">प्रत्याह्वान जालपता उपलब्ध नहीं %1$s के उत्तर से</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">लैटनिंग पता के चालान लाने के JSON परखनें में अपक्रम। उपयोगकर्ता की लैटनिंग स्थापना की जाँच करें</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">%1$s के चालान लाने के JSON परखनें में अपक्रम। उपयोगकर्ता की लैटनिंग स्थापना की जाँच करें</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">%2$s से चालान की मात्रा (%1$s साट्स) में दोष है। %3$s होना चाहिए था।</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">ज्साप भेजने से पहले लैटनिंग चालान नहीं बना पाए। ग्राहक के लैटनिंग धनकोष ने यह अपक्रम की सूचना दी : %1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">लैटनिंग चालान नहीं बना पाए। %1$s से संदेश : %2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">ज्साप भेजने से पहले लैटनिंग चालान नहीं बना पाए। परिणाम JSON में pr अम्श उपलब्ध नहीं।</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">%1$s से लैटनिंग चालान नहीं बना पाए। परिणाम JSON में pr अम्श उपलब्ध नहीं।</string>
<string name="read_only_user">केवल पढनेवाला उपयोगकर्ता</string>
<string name="no_reactions_setup">कोई प्रतिक्रियाएँ स्थापित नहीं</string>
<string name="select_push_server">संयुक्तप्रेषण क्रमक का चयन करें</string>
<string name="push_server_title">प्रेषित सूचना</string>
<string name="push_server_explainer">स्थापित संयुक्तप्रेषण क्रमकों से</string>
<string name="push_server_none">कुछ भी नहीं</string>
<string name="push_server_none_explainer">प्रेषित सूचनाएँ अक्षम करता है</string>
<string name="push_server_uses_app_explainer">%1$s क्रमक का प्रयोग करता है</string>
<string name="push_server_install_app">प्रेषित सूचना स्थापन</string>
<string name="push_server_install_app_description"> प्रेषित सूचनाएँ प्राप्त करने के लिए, किसी भी क्रमक की स्थापना करें जो [संयुक्त प्रेषण](https://unifiedpush.org/) का अवलम्बन करता है, जैसे [Nfty](https://ntfy.sh/)।
स्थापना पश्चात, जिस क्रमक का उपयोग करना चाहते हैं उसका चयन करें स्थापना विकल्पों में।
</string>
<string name="payment_required_title">%1$s से संदेश</string>
<string name="thread_title">सूत्र</string>
<string name="send_the_seller_a_message">विक्रेता को संदेश भेजें</string>
<string name="hi_seller_is_this_still_available">नमस्ते %1$s, क्या यह अब भी उपलब्ध है?</string>
<string name="hi_there_is_this_still_available">नमस्ते, क्या यह अब भी उपलब्ध है?</string>
<string name="classifieds">वस्तु की बिक्री करें</string>
<string name="classifieds_title">शीर्षक</string>
<string name="classifieds_title_placeholder">आईफोन १३</string>
<string name="classifieds_condition">स्थिति</string>
<string name="classifieds_category">वर्ग</string>
<string name="classifieds_price">मूल्य (साट्स में)</string>
<string name="classifieds_price_placeholder">१०००</string>
<string name="classifieds_location">स्थान</string>
<string name="classifieds_location_placeholder">नगर, प्रदेश, देश</string>
<string name="classifieds_condition_new">नव्य</string>
<string name="classifieds_condition_new_explainer">यह एक पूर्णतः नयी इकाई है, मूल पेटिका में</string>
<string name="classifieds_condition_like_new">नये के समान</string>
<string name="classifieds_condition_like_new_explainer">इसका उपयोग हुआ है, पर उपयुक्त होने का कोई लक्षण नहीं</string>
<string name="classifieds_condition_good">अच्छा</string>
<string name="classifieds_condition_good_explainer">इसपर उपयुक्त होने का कुछ उपरी लक्षण हैं</string>
<string name="classifieds_condition_fair">ठीक</string>
<string name="classifieds_condition_fair_explainer">यह अभी भी स्वीकार्य तथा सक्षम स्थिति में है</string>
<string name="classifieds_category_clothing">वस्त्र</string>
<string name="classifieds_category_accessories">आभूषण</string>
<string name="classifieds_category_electronics">विद्युत्कणयन्त्र</string>
<string name="classifieds_category_furniture">पीठशय्यादि</string>
<string name="classifieds_category_collectibles">संग्रहार्थ</string>
<string name="classifieds_category_books">पुस्तकें</string>
<string name="classifieds_category_pets">पालतू</string>
<string name="classifieds_category_sports">खेल</string>
<string name="classifieds_category_fitness">स्वास्थ्य</string>
<string name="classifieds_category_art">कला</string>
<string name="classifieds_category_crafts">क्रिया</string>
<string name="classifieds_category_home">घर</string>
<string name="classifieds_category_office">कार्यालय</string>
<string name="classifieds_category_food">आहार</string>
<string name="classifieds_category_misc">विभिन्न</string>
<string name="classifieds_category_other">अन्य</string>
<string name="failed_to_upload_media_no_details">चित्र चलचित्र आरोहण असफल</string>
<string name="could_not_open_the_compressed_file">संकीर्णकृत अभिलेख को खोल नहीं पाए</string>
<string name="error_when_compressing_media">चित्र चलचित्र संकीर्णकरण में अपक्रम : %1$s</string>
<string name="failed_to_upload_media">आरोहण अपक्रम : %1$s</string>
<string name="server_did_not_provide_a_url_after_uploading">सेवासंगणक ने आरोहण पश्चात जालपता नहीं दिया</string>
<string name="could_not_download_from_the_server">सेवासंगणक से आरोहणकृत चित्र चलचित्र का अवरोहण नहीं कर पाए</string>
<string name="could_not_prepare_local_file_to_upload">स्थानीय अभिलेख अनुकूल नहीं बना सके आरोहण के लिए : %1$s</string>
<string name="edit_draft">पाण्डुलिपि का सम्पादन करें</string>
<string name="login_with_qr_code">क्यूआर क्रमचित्र के साथ प्रवेशांकन करें</string>
<string name="route">मार्ग</string>
<string name="route_home">घर</string>
<string name="route_search">खोज</string>
<string name="route_discover">आविष्करण</string>
<string name="route_messages">संदेशें</string>
<string name="route_notifications">सूचनाएँ</string>
<string name="route_global">वैश्विक</string>
<string name="route_video">छोटे</string>
<string name="route_security_filters">सुरक्षार्थ छलनियाँ</string>
<string name="new_post">नया पत्र प्रकाशन</string>
<string name="new_short">नये छोटे : चित्र अथवा चलचित्र</string>
<string name="new_community_note">नया सामुदायिक टीका</string>
<string name="open_all_reactions_to_this_post">इस पत्र प्रकाशन के सभी प्रतिक्रियाओं को खोलें</string>
<string name="close_all_reactions_to_this_post">इस पत्र प्रकाशन के सभी प्रतिक्रियाओं को अवरोधित करें</string>
<string name="reply_description">उत्तर</string>
<string name="boost_or_quote_description">उद्धृत करें अथवा टीका लिखें</string>
<string name="like_description">इष्ट</string>
<string name="zap_description">ज्साप</string>
<string name="profile_image_of_user">%1$s का परिचय चित्र</string>
<string name="relay_info">पुनःप्रसारक %1$s</string>
<string name="expand_relay_list">पुनःप्रसारक सूची का विस्तारण करें</string>
<string name="note_options">टीका विकल्प</string>
<string name="relay_list_selector">पुनःप्रसारक सूची चयनकर्ता</string>
<string name="poll">मतदान</string>
<string name="disable_poll">मतदान अक्षम करें</string>
<string name="add_bitcoin_invoice">बिटकोयिन चालान</string>
<string name="cancel_bitcoin_invoice">बिटकोयिन चालान निरस्त करें</string>
<string name="cancel_classifieds">वस्तु बिक्री निरस्त करें</string>
<string name="add_zapraiser">ज्सापोपार्जन योजना</string>
<string name="cancel_zapraiser">ज्सापोपार्जन योजना निरस्त करें</string>
<string name="add_location">स्थान</string>
<string name="remove_location">स्थान हताएँ</string>
<string name="add_zap_split">ज्साप विभाजन</string>
<string name="cancel_zap_split">ज्साप विभाजन निरस्त करें</string>
<string name="add_content_warning">विषयवस्तु चेतावनी जोडें</string>
<string name="remove_content_warning">विषयवस्तु चेतावनी हटाएँ</string>
<string name="show_npub_as_a_qr_code">क्यूआर क्रमचित्र के रूप में npub को दिखाएँ</string>
<string name="invalid_nip19_uri">अमान्य पता</string>
<string name="invalid_nip19_uri_description">अमेथिस्ट को एक वैश्विक वस्तु विभेदक प्राप्त हुआ खोलने के लिए परन्तु वह विभेदक अमान्य था : %1$s</string>
<string name="zap_the_devs_title">क्रमलखकों को ज्साप करें!</string>
<string name="zap_the_devs_description">आपका दान हमारा सहायक है परिवर्तन लाने में। प्रत्येक साट गणनीय है!</string>
<string name="donate_now">दान करें अभी</string>
<string name="brought_to_you_by">आप तक लाया गया इनके द्वारा :</string>
<string name="this_version_brought_to_you_by">यह संस्करण आप तक लाया गया इनके द्वारा :</string>
<string name="version_name">संस्करण %1$s</string>
<string name="thank_you">धन्यवाद!</string>
<string name="max_limit">अधिकतम सीमा</string>
<string name="restricted_writes">सीमित लेखन</string>
<string name="forked_from">इससे पथभेद किया गया</string>
<string name="forked_tag">पथभेद</string>
<string name="git_repository">गिट क्रमलेखकोश : %1$s</string>
<string name="git_web_address">जाल :</string>
<string name="git_clone_address">अनुकरण :</string>
<string name="existed_since">ओ॰टी॰एस : %1$s</string>
<string name="ots_info_title">समयांकन प्रमाण</string>
<string name="ots_info_description">प्रमाण उपलब्ध है कि इस पत्र प्रकाशन पर हस्ताक्षर किया गया %1$s के पहले। प्रमाण अंकित किया गया बिटकोयिन खण्डश्रृंखला में उस समय उस दिन पर।</string>
<string name="edit_post">पत्र का सम्पादन करें</string>
<string name="proposal_to_edit">पत्र शोधन के लिए प्रस्ताव</string>
<string name="message_to_author">परिवर्तनों का साराम्श</string>
<string name="message_to_author_placeholder">शीघ्र सुधार…</string>
<string name="accept_the_suggestion">सुझाव को स्वीकारें</string>
<string name="accessibility_download_for_offline">अवरोहण</string>
<string name="accessibility_lyrics_on">संगीत पद्य दिखाएँ</string>
<string name="accessibility_lyrics_off">संगीत पद्य ना दिखाएँ</string>
<string name="accessibility_turn_on_sealed_message">आवृत संदेश निष्क्रिय। आवृत संदेश सक्रिय करने के लिए टाँकें</string>
<string name="accessibility_turn_off_sealed_message">आवृत संदेश सक्रिय। आवृत संदेश निष्क्रिय करने के लिए टाँकें</string>
<string name="accessibility_send">भेजें</string>
<string name="accessibility_play_username">उपयोगकर्ता नाम को ध्वनि के रूप में चलाएँ</string>
<string name="accessibility_scan_qr_code">क्यूआर क्रमचित्र परखें</string>
<string name="accessibility_navigate_to_alby">तृतीय पक्ष धनकोष प्रदाता आल्बी तक जाएँ</string>
<string name="it_s_not_possible_to_reply_to_a_draft_note">एक पाण्डुलिपि टीका को उत्तर नहीं दे सकते</string>
<string name="it_s_not_possible_to_quote_to_a_draft_note">एक पाण्डुलिपि टीका पर टीका नहीं लिख सकते</string>
<string name="it_s_not_possible_to_react_to_a_draft_note">एक पाण्डुलिपि टीका पर प्रतिक्रिया नहीं कर सकते</string>
<string name="it_s_not_possible_to_zap_to_a_draft_note">एक पाण्डुलिपि टीका को ज्साप नहीं कर सकते</string>
<string name="draft_note">पाण्डुलिपि टीका</string>
<string name="load_from_text">संदेश से</string>
</resources>

Wyświetl plik

@ -559,11 +559,16 @@
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">Não foi possível resolver %1$s. Verifique se você está conectado, se o servidor está funcionando e se o endereço Lightning %2$s está correto.\n\nExceção foi: %3$s</string>
<string name="could_not_fetch_invoice_from">Não foi possível obter a fatura de %1$s</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">Erro ao analisar JSON do Endereço Lightning. Verifique a configuração de Lightning do usuário</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">Erro ao analisar JSON do %1$s. Verifique a configuração lightning do usuário</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">URL de retorno não encontrada na configuração do servidor de endereço Lightning do usuário</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">URL de retorno de chamada não encontrado da resposta %1$s</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">Erro ao analisar o pedido de fatura do endereço Lightning. Verifique a configuração de Lightning do usuário</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">Erro ao analisar JSON da busca de fatura %1$s. Verifique a configuração de iluminação do usuário</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">Quantidade incorreta na fatura (%1$s sats) de %2$s. Deveria ser %3$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">Não foi possível criar uma fatura Lightning antes de enviar o zap. A carteira Lightning do destinatário enviou o seguinte erro: %1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">Não foi possível criar uma fatura com raios. Mensagem do %1$s: %2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">Não foi possível criar uma fatura Lightning antes de enviar o zap. O elemento pr não foi encontrado no JSON resultante.</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">Não foi possível criar uma fatura lightning a partir de %1$s: Elemento pr não encontrado no JSON resultante.</string>
<string name="read_only_user">Usuário somente leitura</string>
<string name="no_reactions_setup">Nenhuma configuração de reações</string>
<string name="select_push_server">Selecione um Distribuidor de Notificações Push</string>

Wyświetl plik

@ -558,11 +558,16 @@
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">Kunde inte lösa %1$s. Kontrollera om du är ansluten, om servern är uppe och om Lightning Addressen %2$s är korrekt.\n\nUndantag var: %3$s</string>
<string name="could_not_fetch_invoice_from">Kunde inte hämta fakturan från %1$s</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">Fel vid tolkning av JSON från Lightning Address. Kontrollera användarens Lightning-konfiguration</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">Fel vid tolkning av JSON från %1$s. Kontrollera användarens blixtkonfiguration</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">Återuppringnings-URL hittades inte i användarens konfiguration för Lightning Address-servern</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">Callback URL hittades inte från %1$s\'s svar</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">Fel vid tolkning av JSON från Lightning Address fakturahämtning. Kontrollera användarens Lightning-konfiguration</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">Fel vid tolkning av JSON från %1$ss fakturahämtning. Kontrollera användarens blixtkonfiguration</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">Felaktig fakturabelopp (%1$s sats) från %2$s. Det borde ha varit %3$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">Kunde inte skapa en Lightning-faktura innan Zap skickades. Mottagarens Lightning-plånbok skickade följande fel: %1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">Det gick inte att skapa en blixt faktura. Meddelande från %1$s: %2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">Kunde inte skapa en Lightning-faktura innan Zap skickades. Elementet pr hittades inte i den resulterande JSON.</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">Det gick inte att skapa en blixtfaktura från %1$s: Elementet pr hittades inte i den resulterande JSON.</string>
<string name="read_only_user">Skrivskyddad användare</string>
<string name="no_reactions_setup">Inga reaktioner konfigurerade</string>
<string name="select_push_server">Välj en Push-meddelandetjänst</string>

Wyświetl plik

@ -275,6 +275,7 @@
<string name="report_dialog_title">阻止与举报</string>
<string name="block_only">仅阻止</string>
<string name="bookmarks">书签</string>
<string name="drafts">草稿</string>
<string name="private_bookmarks">私人书签</string>
<string name="public_bookmarks">公开书签</string>
<string name="add_to_private_bookmarks">添加到私人书签</string>
@ -559,11 +560,16 @@
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">无法解析 %1$s。请检查你是否已连接服务器是否启动以及闪电地址 %2$s 是否正确。\n\n异常为%3$s</string>
<string name="could_not_fetch_invoice_from">无法从 %1$s 获取发票</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">从闪电地址解析JSON出错。请检查用户的打闪设置</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">从 %1$s 解析 JSON 发生错误。请检查用户的闪电设置</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">在用户闪电地址服务器配置中找不到回调URL</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">从 %1$s 的响应中找不到回调 URL</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">从闪电地址的发票获取解析JSON 发生错误。请检查用户的闪电设置</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">从 %1$s 的闪电发票获取解析JSON 发生错误。请检查用户的闪电设置</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">来自 %2$s 的错误的发票金额(%1$s 聪)。它本应该是 %3$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">无法在发送打闪前创建闪电发票。接收者闪电钱包发送了以下错误: %1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">无法创建闪电发票。来自 %1$s 的消息:%2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">无法在发送打闪前创建闪电发票。在生成的 JSON 中找不到 Element pr。</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">无法从 %1$s 创建闪电发票:在生成的 JSON 中找不到付款要求元素。</string>
<string name="read_only_user">仅读用户</string>
<string name="no_reactions_setup">没有设置回应</string>
<string name="select_push_server">选择一个统一推送应用</string>
@ -621,6 +627,7 @@
<string name="server_did_not_provide_a_url_after_uploading">上传后服务器没有提供 URL</string>
<string name="could_not_download_from_the_server">无法从服务器下载上传的媒体</string>
<string name="could_not_prepare_local_file_to_upload">无法准备要上传的本地文件:%1$s</string>
<string name="edit_draft">编辑草稿</string>
<string name="login_with_qr_code">使用二维码登录</string>
<string name="route">路径</string>
<string name="route_home">主页</string>
@ -664,6 +671,8 @@
<string name="zap_the_devs_title">打闪开发人员!</string>
<string name="zap_the_devs_description">你的捐赠帮助我们做出不同的贡献。每个聪都很重要!</string>
<string name="donate_now">立即捐款</string>
<string name="brought_to_you_by">赞助方:</string>
<string name="this_version_brought_to_you_by">此版本赞助商:</string>
<string name="version_name">版本 %1$s</string>
<string name="thank_you">谢谢!</string>
<string name="max_limit">最大上限</string>
@ -686,4 +695,10 @@
<string name="accessibility_play_username">作为音频播放用户名</string>
<string name="accessibility_scan_qr_code">扫描二维码</string>
<string name="accessibility_navigate_to_alby">导航到第三方钱包提供商 Alby</string>
<string name="it_s_not_possible_to_reply_to_a_draft_note">无法回复笔记草稿</string>
<string name="it_s_not_possible_to_quote_to_a_draft_note">无法引用笔记草稿</string>
<string name="it_s_not_possible_to_react_to_a_draft_note">无法回应笔记草稿</string>
<string name="it_s_not_possible_to_zap_to_a_draft_note">无法打闪笔记草稿</string>
<string name="draft_note">笔记草稿</string>
<string name="load_from_text">来自消息</string>
</resources>

Wyświetl plik

@ -275,6 +275,7 @@
<string name="report_dialog_title">屏蔽並舉報</string>
<string name="block_only">屏蔽</string>
<string name="bookmarks">書籤</string>
<string name="drafts">草稿</string>
<string name="private_bookmarks">私人書籤</string>
<string name="public_bookmarks">公開書籤</string>
<string name="add_to_private_bookmarks">添加到私人書籤</string>
@ -559,11 +560,16 @@
<string name="could_not_resolve_check_if_you_are_connected_if_the_server_is_up_and_if_the_lightning_address_is_correct_exception">無法解析 %1$s。請檢查你是否已連接服務器是否啓動以及閃電地址 %2$s 是否正確。\n\n異常爲%3$s</string>
<string name="could_not_fetch_invoice_from">無法從 %1$s 獲取發票</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup">從閃電地址解析 JSON 發生錯誤。請檢查用戶的閃電設置</string>
<string name="error_parsing_json_from_lightning_address_check_the_user_s_lightning_setup_with_user">從 %1$s 解析 JSON 發生錯誤。請檢查用戶的閃電設置</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration">在用戶閃電地址伺服器配置中找不到回調 URL</string>
<string name="callback_url_not_found_in_the_user_s_lightning_address_server_configuration_with_user">從 %1$s 的響應中找不到回調 URL</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup">從閃電地址的發票獲取解析 JSON 發生錯誤。請檢查用戶的閃電設置</string>
<string name="error_parsing_json_from_lightning_address_s_invoice_fetch_check_the_user_s_lightning_setup_with_user">從 %1$s 的閃電發票獲取解析 JSON 發生錯誤。請檢查用戶的閃電設置</string>
<string name="incorrect_invoice_amount_sats_from_it_should_have_been">來自 %2$s 的錯誤的發票金額(%1$s 聰)。應該是 %3$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error">無法在發送打閃前創建閃電發票。接收者閃電錢包發送了以下錯誤:%1$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_the_receiver_s_lightning_wallet_sent_the_following_error_with_user">無法創建閃電發票。來自 %1$s 的消息:%2$s</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json">無法在發送打閃前創建閃電發票。在生成的 JSON 中找不到 Element pr。</string>
<string name="unable_to_create_a_lightning_invoice_before_sending_the_zap_element_pr_not_found_in_the_resulting_json_with_user">無法從 %1$s 創建閃電發票:在生成的 JSON 中找不到付款要求元素。</string>
<string name="read_only_user">只讀用戶</string>
<string name="no_reactions_setup">沒有設置回應</string>
<string name="select_push_server">選擇一個統一推送應用</string>
@ -621,6 +627,7 @@
<string name="server_did_not_provide_a_url_after_uploading">上傳後伺服器沒有提供 URL</string>
<string name="could_not_download_from_the_server">無法從伺服器下載上傳的媒體</string>
<string name="could_not_prepare_local_file_to_upload">無法準備要上傳的本地文件:%1$s</string>
<string name="edit_draft">編輯草稿</string>
<string name="login_with_qr_code">使用二維碼登錄</string>
<string name="route">路徑</string>
<string name="route_home">主頁</string>
@ -664,6 +671,8 @@
<string name="zap_the_devs_title">打閃開發人員</string>
<string name="zap_the_devs_description">你的捐贈幫助我們做出不同的貢獻。 每個聰都很重要!</string>
<string name="donate_now">立即捐款</string>
<string name="brought_to_you_by">贊助方:</string>
<string name="this_version_brought_to_you_by">此版本贊助方:</string>
<string name="version_name">版本 %1$s</string>
<string name="thank_you">謝謝!</string>
<string name="max_limit">最大上限</string>
@ -685,4 +694,10 @@
<string name="accessibility_play_username">作爲音頻播放用戶名</string>
<string name="accessibility_scan_qr_code">掃描二維碼</string>
<string name="accessibility_navigate_to_alby">導航到第三方錢包提供商 Alby</string>
<string name="it_s_not_possible_to_reply_to_a_draft_note">無法回覆筆記草稿</string>
<string name="it_s_not_possible_to_quote_to_a_draft_note">無法引用筆記草稿</string>
<string name="it_s_not_possible_to_react_to_a_draft_note">無法回應筆記草稿</string>
<string name="it_s_not_possible_to_zap_to_a_draft_note">無法打閃筆記草稿</string>
<string name="draft_note">筆記草稿</string>
<string name="load_from_text">來自消息</string>
</resources>

Wyświetl plik

@ -15,7 +15,7 @@ coil = "2.6.0"
composeBom = "2024.04.00"
coreKtx = "1.12.0"
espressoCore = "3.5.1"
firebaseBom = "32.8.0"
firebaseBom = "32.8.1"
fragmentKtx = "1.6.2"
gms = "4.4.1"
jacksonModuleKotlin = "2.17.0"
@ -27,7 +27,7 @@ languageId = "17.0.5"
lazysodiumAndroid = "5.1.0"
lightcompressor = "1.3.2"
markdown = "077a2cde64"
media3 = "1.3.0"
media3 = "1.3.1"
mockk = "1.13.10"
navigationCompose = "2.7.7"
okhttp = "5.0.0-alpha.12"