Merge branch 'main' into amber

This commit is contained in:
greenart7c3 2023-09-04 18:09:29 -03:00 committed by GitHub
commit bd836a9580
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 562 additions and 43 deletions

View File

@ -13,8 +13,8 @@ android {
applicationId "com.vitorpamplona.amethyst"
minSdk 26
targetSdk 34
versionCode 291
versionName "0.75.12"
versionCode 293
versionName "0.75.14"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {

View File

@ -1,8 +1,10 @@
package com.vitorpamplona.amethyst
import com.fasterxml.jackson.module.kotlin.readValue
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.ui.dal.ThreadFeedFilter
import com.vitorpamplona.quartz.crypto.KeyPair
import com.vitorpamplona.quartz.encoders.ATag
import com.vitorpamplona.quartz.events.Event
import junit.framework.TestCase
@ -95,7 +97,7 @@ class ThreadAssemblerTest {
val naddr = ATag(30023, "6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93", "1680612926599", null)
val filter = ThreadFeedFilter(naddr.toTag())
val filter = ThreadFeedFilter(Account(KeyPair()), naddr.toTag())
val calculatedFeed = filter.feed()
val expecteedOrder = listOf(
@ -126,14 +128,14 @@ class ThreadAssemblerTest {
"6a58f8315af5badb1bdaeb5489417b94621a4d8e192ae2fedcca0c5dcf0c9cd4",
"6e9bb03c7c40d67fec0d0bb872548ec207ba0ac4533efa137d7bcaca9fb4b191",
"e2ae784b239cac4bad38136e4bd758b87dd261b659ef460450064bf9073edcb3",
"45d4fc726f2cc5b524be862c14fdadc1a24b25b8c6c011eedf2d2909589263e7",
"7a4a2419824669f07081abe2132f8cc0027efbce066ccdf187c897bb7ffa5dc3",
"674c62f84afdc045bc3623ea132d90afdfe4b64249807f65302231115af5406d",
"d54761f672669ea4f4b7592f3b0a30ee28de340b0a7e46b91af94e66905171c9",
"00813a18ac9084cd0948c27027a980e34039a3011f30279a8b52ad87da5a3031",
"87a5bd25aa084cefb3357fc9c2a5b327254fab35fdd7b2d4bd0acddc63d0abe8",
"512962dbada5fd5015fc727a107d5c3f569662de67eab8e5da5a8065012cf11e",
"ce6e32e3e17b6901d2cc70b60f3743e24f885bb6e9da6d88cff516079eac1883",
"7a4a2419824669f07081abe2132f8cc0027efbce066ccdf187c897bb7ffa5dc3",
"45d4fc726f2cc5b524be862c14fdadc1a24b25b8c6c011eedf2d2909589263e7",
"d4a0b4f08d98d82a04292654ec132723cc2cf3fa24ffb6c0833426cb9372f4d5",
"8cdc4676aca93bbafcfbe6784f9b2df54e8ca20fbe69ba55fda487736bfdb7f6",
"7a18dda355525d468b31bba4fa947cba98cc19048d4a3099d5e9ba045d878c26"

View File

@ -142,7 +142,7 @@ open class Note(val idHex: String) {
* This method caches signatures during each execution to avoid recalculation in longer threads
*/
fun replyLevelSignature(
eventsToConsider: Set<Note>,
eventsToConsider: Set<HexKey>,
cachedSignatures: MutableMap<Note, LevelSignature>,
account: User,
accountFollowingSet: Set<String>,
@ -151,7 +151,7 @@ open class Note(val idHex: String) {
val replyTo = replyTo
if (event is RepostEvent || event is GenericRepostEvent || replyTo == null || replyTo.isEmpty()) {
return LevelSignature(
signature = "/" + formattedDateTime(createdAt() ?: 0) + ";",
signature = "/" + formattedDateTime(createdAt() ?: 0) + idHex.substring(0, 8) + ";",
createdAt = createdAt(),
author = author
)
@ -159,7 +159,7 @@ open class Note(val idHex: String) {
val parent = (
replyTo
.filter { it in eventsToConsider } // This forces the signature to be based on a branch, avoiding two roots
.filter { it.idHex in eventsToConsider } // This forces the signature to be based on a branch, avoiding two roots
.map {
cachedSignatures[it] ?: it.replyLevelSignature(
eventsToConsider,
@ -176,13 +176,13 @@ open class Note(val idHex: String) {
val threadOrder = if (parent?.author == author && createdAt() != null) {
// author of the thread first, in **ascending** order
"9" + formattedDateTime((parent?.createdAt ?: 0) + (now - (createdAt() ?: 0)))
"9" + formattedDateTime((parent?.createdAt ?: 0) + (now - (createdAt() ?: 0))) + idHex.substring(0, 8)
} else if (author?.pubkeyHex == account.pubkeyHex) {
"8" + formattedDateTime(createdAt() ?: 0) // my replies
"8" + formattedDateTime(createdAt() ?: 0) + idHex.substring(0, 8) // my replies
} else if (author?.pubkeyHex in accountFollowingSet) {
"7" + formattedDateTime(createdAt() ?: 0) // my follows replies.
"7" + formattedDateTime(createdAt() ?: 0) + idHex.substring(0, 8) // my follows replies.
} else {
"0" + formattedDateTime(createdAt() ?: 0) // everyone else.
"0" + formattedDateTime(createdAt() ?: 0) + idHex.substring(0, 8) // everyone else.
}
val mySignature = LevelSignature(

View File

@ -164,9 +164,16 @@ class LightningAddressResolver() {
onProgress(0.7f)
onSuccess(pr)
} else {
onProgress(0.0f)
onError("Incorrect invoice amount (${invoiceAmount.toLong()} sats) from server")
}
} ?: onError("Invoice Not Created (element pr not found in the resulting JSON)")
} ?: lnInvoice?.get("reason")?.asText()?.ifBlank { null }?.let { reason ->
onProgress(0.0f)
onError("Unable to create a lightning invoice before sending the zap. The receiver's lightning wallet sent the following error: $reason")
} ?: run {
onProgress(0.0f)
onError("nable to create a lightning invoice before sending the zap. Element pr not found in the resulting JSON.")
}
},
onError = onError
)

View File

@ -19,6 +19,7 @@ import com.vitorpamplona.quartz.events.LnZapEvent
import com.vitorpamplona.quartz.events.LnZapRequestEvent
import com.vitorpamplona.quartz.events.PrivateDmEvent
import com.vitorpamplona.quartz.events.SealedGossipEvent
import com.vitorpamplona.quartz.utils.TimeUtils
import kotlinx.collections.immutable.persistentSetOf
import java.math.BigDecimal
@ -75,7 +76,11 @@ class EventNotificationConsumer(private val applicationContext: Context) {
if (acc != null && acc.userProfile().pubkeyHex == giftWrap.recipientPubKey()) {
val chatEvent = unwrapAndConsume(giftWrap, account = acc)
if (chatEvent is ChatMessageEvent && acc.keyPair.privKey != null) {
if (chatEvent is ChatMessageEvent && // must be messages, not any other event
acc.keyPair.privKey != null && // can't decrypt
chatEvent.createdAt > TimeUtils.fiveMinutesAgo() && // old event being re-broadcasted
chatEvent.pubKey != acc.userProfile().pubkeyHex // from the user
) {
val chatNote = LocalCache.notes[chatEvent.id] ?: return
val chatRoom = chatEvent.chatroomKey(acc.keyPair.pubKey.toHexKey())
@ -101,6 +106,9 @@ class EventNotificationConsumer(private val applicationContext: Context) {
private fun notify(event: PrivateDmEvent) {
val note = LocalCache.notes[event.id] ?: return
// old event being re-broadcast
if (event.createdAt < TimeUtils.fiveMinutesAgo()) return
LocalPreferences.allSavedAccounts().forEach {
val acc = LocalPreferences.loadFromEncryptedStorage(it.npub)
@ -130,6 +138,9 @@ class EventNotificationConsumer(private val applicationContext: Context) {
private fun notify(event: LnZapEvent) {
val noteZapEvent = LocalCache.notes[event.id] ?: return
// old event being re-broadcast
if (event.createdAt < TimeUtils.fiveMinutesAgo()) return
val noteZapRequest = event.zapRequest?.id?.let { LocalCache.checkGetOrCreateNote(it) } ?: return
val noteZapped = event.zappedPost().firstOrNull()?.let { LocalCache.checkGetOrCreateNote(it) }

View File

@ -47,6 +47,7 @@ class Relay(
private var listeners = setOf<Listener>()
private var socket: WebSocket? = null
private var isReady: Boolean = false
private var usingCompression: Boolean = false
var eventDownloadCounterInBytes = 0
var eventUploadCounterInBytes = 0
@ -85,6 +86,9 @@ class Relay(
private var connectingBlock = AtomicBoolean()
fun connectAndRun(onConnected: (Relay) -> Unit) {
// BRB is crashing OkHttp Deflater object :(
if (url.contains("brb.io")) return
// If there is a connection, don't wait.
if (connectingBlock.getAndSet(true)) {
return
@ -115,7 +119,10 @@ class Relay(
override fun onOpen(webSocket: WebSocket, response: Response) {
checkNotInMainThread()
markConnectionAsReady(response.receivedResponseAtMillis - response.sentRequestAtMillis)
markConnectionAsReady(
pingInMs = response.receivedResponseAtMillis - response.sentRequestAtMillis,
usingCompression = response.headers.get("Sec-WebSocket-Extensions")?.contains("permessage-deflate") ?: false
)
// Log.w("Relay", "Relay OnOpen, Loading All subscriptions $url")
onConnected(this@Relay)
@ -175,15 +182,17 @@ class Relay(
}
}
fun markConnectionAsReady(pingInMs: Long) {
fun markConnectionAsReady(pingInMs: Long, usingCompression: Boolean) {
this.afterEOSE = false
this.isReady = true
this.pingInMs = pingInMs
this.usingCompression = usingCompression
}
fun markConnectionAsClosed() {
this.socket = null
this.isReady = false
this.usingCompression = false
this.afterEOSE = false
this.closingTimeInSeconds = TimeUtils.now()
}
@ -239,6 +248,7 @@ class Relay(
socket?.close(1000, "Normal close")
socket = null
isReady = false
usingCompression = false
afterEOSE = false
}

View File

@ -18,11 +18,12 @@ class ThreadFeedFilter(val account: Account, val noteId: String) : FeedFilter<No
val cachedSignatures: MutableMap<Note, Note.LevelSignature> = mutableMapOf()
val followingSet = account.selectedUsersFollowList(KIND3_FOLLOWS) ?: emptySet()
val eventsToWatch = ThreadAssembler().findThreadFor(noteId)
val eventsInHex = eventsToWatch.map { it.idHex }.toSet()
val now = TimeUtils.now()
// Currently orders by date of each event, descending, at each level of the reply stack
val order = compareByDescending<Note> {
it.replyLevelSignature(eventsToWatch, cachedSignatures, account.userProfile(), followingSet, now).signature
it.replyLevelSignature(eventsInHex, cachedSignatures, account.userProfile(), followingSet, now).signature
}
return eventsToWatch.sortedWith(order)

View File

@ -2700,14 +2700,14 @@ private fun BadgeBox(
accountViewModel: AccountViewModel,
nav: (String) -> Unit
) {
val isRepost by remember {
val isRepost by remember(baseNote) {
derivedStateOf {
baseNote.event is RepostEvent || baseNote.event is GenericRepostEvent
}
}
if (isRepost) {
val baseReply by remember {
val baseReply by remember(baseNote) {
derivedStateOf {
baseNote.replyTo?.lastOrNull()
}

View File

@ -1025,11 +1025,29 @@ fun ZapReaction(
}
if (wantsToChangeZapAmount) {
UpdateZapAmountDialog({ wantsToChangeZapAmount = false }, accountViewModel = accountViewModel)
UpdateZapAmountDialog(
onClose = { wantsToChangeZapAmount = false },
accountViewModel = accountViewModel
)
}
if (wantsToSetCustomZap) {
ZapCustomDialog({ wantsToSetCustomZap = false }, accountViewModel, baseNote)
ZapCustomDialog(
onClose = { wantsToSetCustomZap = false },
onError = {
scope.launch {
zappingProgress = 0f
showErrorMessageDialog = it
}
},
onProgress = {
scope.launch(Dispatchers.Main) {
zappingProgress = it
}
},
accountViewModel = accountViewModel,
baseNote = baseNote
)
}
if (zappingProgress > 0.00001 && zappingProgress < 0.99999) {

View File

@ -197,7 +197,11 @@ class UpdateZapAmountViewModel(val account: Account) : ViewModel() {
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun UpdateZapAmountDialog(onClose: () -> Unit, nip47uri: String? = null, accountViewModel: AccountViewModel) {
fun UpdateZapAmountDialog(
onClose: () -> Unit,
nip47uri: String? = null,
accountViewModel: AccountViewModel
) {
val context = LocalContext.current
val scope = rememberCoroutineScope()

View File

@ -1,6 +1,5 @@
package com.vitorpamplona.amethyst.ui.note
import android.widget.Toast
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.*
@ -31,8 +30,6 @@ import com.vitorpamplona.amethyst.ui.theme.ButtonBorder
import com.vitorpamplona.amethyst.ui.theme.placeholderText
import com.vitorpamplona.quartz.events.LnZapEvent
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class ZapOptionstViewModel : ViewModel() {
private var account: Account? = null
@ -61,17 +58,20 @@ class ZapOptionstViewModel : ViewModel() {
}
@Composable
fun ZapCustomDialog(onClose: () -> Unit, accountViewModel: AccountViewModel, baseNote: Note) {
fun ZapCustomDialog(
onClose: () -> Unit,
onError: (text: String) -> Unit,
onProgress: (percent: Float) -> Unit,
accountViewModel: AccountViewModel,
baseNote: Note
) {
val context = LocalContext.current
val scope = rememberCoroutineScope()
val postViewModel: ZapOptionstViewModel = viewModel()
LaunchedEffect(accountViewModel) {
postViewModel.load(accountViewModel.account)
}
var zappingProgress by remember { mutableStateOf(0f) }
val zapTypes = listOf(
Triple(LnZapEvent.ZapType.PUBLIC, stringResource(id = R.string.zap_type_public), stringResource(id = R.string.zap_type_public_explainer)),
Triple(LnZapEvent.ZapType.PRIVATE, stringResource(id = R.string.zap_type_private), stringResource(id = R.string.zap_type_private_explainer)),
@ -111,17 +111,8 @@ fun ZapCustomDialog(onClose: () -> Unit, accountViewModel: AccountViewModel, bas
null,
postViewModel.customMessage.text,
context,
onError = {
zappingProgress = 0f
scope.launch {
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
}
},
onProgress = {
scope.launch(Dispatchers.Main) {
zappingProgress = it
}
},
onError = onError,
onProgress = onProgress,
zapType = selectedZapType
)
onClose()

View File

@ -113,7 +113,7 @@
<string name="conversations">Konversacioj</string>
<string name="notes">Notoj</string>
<string name="replies">Respondoj</string>
<string name="follows">"Sekvoj"</string>
<string name="follows">"Sekvitaj"</string>
<string name="reports">"Raportoj"</string>
<string name="more_options">Pli da Opcioj</string>
<string name="relays">" Plusendiloj"</string>

View File

@ -1,2 +1,477 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"></resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="point_to_the_qr_code">Osoita QR-koodiin</string>
<string name="show_qr">Näytä QR</string>
<string name="profile_image">Profiilikuva</string>
<string name="scan_qr">Skannaa QR</string>
<string name="show_anyway">Näytä silti</string>
<string name="post_was_flagged_as_inappropriate_by">Viesti raportoitiin käyttäjän toimesta</string>
<string name="post_not_found">Tapahtumaa ladataan tai sitä ei löydy relelistalta</string>
<string name="channel_image">Kanavan kuva</string>
<string name="referenced_event_not_found">Viitattua tapahtumaa ei löytynyt</string>
<string name="could_not_decrypt_the_message">Viestin purku epäonnistui</string>
<string name="group_picture">Ryhmäkuva</string>
<string name="explicit_content">Julkeaa sisältöä</string>
<string name="spam">Roskaposti</string>
<string name="impersonation">Väärennös</string>
<string name="illegal_behavior">Laiton toiminta</string>
<string name="unknown">Tuntematon</string>
<string name="relay_icon">Relekuvake</string>
<string name="unknown_author">Tuntematon tekijä</string>
<string name="copy_text">Kopioi teksti</string>
<string name="copy_user_pubkey">Kopioi tekijän tunniste</string>
<string name="copy_note_id">Kopioi viestin tunniste</string>
<string name="broadcast">Lähetä</string>
<string name="request_deletion">Pyydä poistoa</string>
<string name="block_report">Estä / Ilmoita</string>
<string name="block_hide_user"><![CDATA[Estä & Piilota käyttäjä]]></string>
<string name="report_spam_scam">Ilmoita roskapostista / huijauksesta</string>
<string name="report_impersonation">Ilmoita väärennöksestä</string>
<string name="report_explicit_content">Ilmoita julkeasta sisällöstä</string>
<string name="report_illegal_behaviour">Ilmoita laittomasta toiminnasta</string>
<string name="login_with_a_private_key_to_be_able_to_reply">Kirjaudu sisään yksityisellä avaimella viestehin vastaamiseksi</string>
<string name="login_with_a_private_key_to_be_able_to_boost_posts">Kirjaudu sisään yksityisellä avaimella tehostaaksesi viestejä</string>
<string name="login_with_a_private_key_to_like_posts">Kirjaudu sisään yksityisellä avaimella tykätäksesi viesteistä</string>
<string name="no_zap_amount_setup_long_press_to_change">Zap-määrää ei ole asetettu. Pidä painiketta pohjassa vaihtaaksesi sitä</string>
<string name="login_with_a_private_key_to_be_able_to_send_zaps">Kirjaudu sisään yksityisellä avaimella Zapien lähettämiseksi</string>
<string name="login_with_a_private_key_to_be_able_to_follow">Kirjaudu sisään yksityisellä avaimella voidaksesi seurata</string>
<string name="login_with_a_private_key_to_be_able_to_unfollow">Kirjaudu sisään yksityisellä avaimella seuraamisen lopettamiseksi</string>
<string name="zaps">Zapit</string>
<string name="view_count">Katselukerrat</string>
<string name="boost">Tehosta</string>
<string name="boosted">tehostettu</string>
<string name="quote">Lainaa</string>
<string name="new_amount_in_sats">Uusi määrä satseissa</string>
<string name="add">Lisää</string>
<string name="replying_to">"vastaus kohteeseen "</string>
<string name="and">" ja "</string>
<string name="in_channel">"kanavassa "</string>
<string name="profile_banner">Profiilin banneri</string>
<string name="payment_successful">Maksu onnistui</string>
<string name="error_parsing_error_message">Virhe virhesanomaa tulkittaessa</string>
<string name="following">" Seuratut"</string>
<string name="followers">" Seuraajat"</string>
<string name="profile">Profiili</string>
<string name="security_filters">Turvallisuussuodattimet</string>
<string name="log_out">Kirjaudu ulos</string>
<string name="show_more">Näytä lisää</string>
<string name="lightning_invoice">Lightning lasku</string>
<string name="pay">Maksa</string>
<string name="lightning_tips">Lightning tipit</string>
<string name="note_to_receiver">Viesti vastaanottajalle</string>
<string name="thank_you_so_much">Kiitos paljon!</string>
<string name="amount_in_sats">Määrä satseissa</string>
<string name="send_sats">Lähetä satseja</string>
<string name="error_parsing_preview_for">"Virhe tulkittaessa esikatselua kohteelle %1$s : %2$s"</string>
<string name="preview_card_image_for">"Esikatsele kortin kuvaa kohteelle %1$s"</string>
<string name="new_channel">Uusi kanava</string>
<string name="channel_name">Kanavan nimi</string>
<string name="my_awesome_group">Oma upea ryhmäni</string>
<string name="picture_url">Kuvan URL</string>
<string name="description">Kuvaus</string>
<string name="about_us">"Tietoa meistä.. "</string>
<string name="what_s_on_your_mind">Mitä mielessä?</string>
<string name="post">Lähetä</string>
<string name="save">Tallenna</string>
<string name="create">Luo</string>
<string name="cancel">Peruuta</string>
<string name="failed_to_upload_the_image">Kuvan lataus epäonnistui</string>
<string name="relay_address">Releosoite</string>
<string name="posts">Viestit</string>
<string name="bytes">Tavua</string>
<string name="errors">Virheet</string>
<string name="home_feed">Kotisyöte</string>
<string name="private_message_feed">Yksityinen viestisyöte</string>
<string name="public_chat_feed">Julkinen chat-syöte</string>
<string name="global_feed">Maailmanlaajuinen syöte</string>
<string name="search_feed">Hae syötettä</string>
<string name="add_a_relay">Lisää rele</string>
<string name="display_name">Näyttönimi</string>
<string name="my_display_name">Oma näyttönimeni</string>
<string name="username">Käyttäjänimi</string>
<string name="my_username">Oma käyttäjänimeni</string>
<string name="about_me">Tietoja minusta</string>
<string name="avatar_url">Avatarin URL</string>
<string name="banner_url">Bannerin URL</string>
<string name="website_url">Verkkosivuston URL</string>
<string name="ln_address">LN-osoite</string>
<string name="ln_url_outdated">LN-URL (vanhentunut)</string>
<string name="image_saved_to_the_gallery">Kuva tallennettu galleriaan</string>
<string name="failed_to_save_the_image">Kuvan tallennus epäonnistui</string>
<string name="upload_image">Lataa kuva</string>
<string name="uploading">Ladataan…</string>
<string name="user_does_not_have_a_lightning_address_setup_to_receive_sats">Käyttäjällä ei ole asetettuna Lightning-osoitetta satsien vastaanottamiseksi</string>
<string name="reply_here">"vastaa tähän.. "</string>
<string name="copies_the_note_id_to_the_clipboard_for_sharing">Kopioi viestin tunniste leikepöydälle Nostressa jakamista varten</string>
<string name="copy_channel_id_note_to_the_clipboard">Kopioi kanavan tunniste (viesti) leikepöydälle</string>
<string name="edits_the_channel_metadata">Muokkaa kanavan metatietoja</string>
<string name="join">Liity</string>
<string name="known">Tunnetut</string>
<string name="new_requests">Uudet pyynnöt</string>
<string name="blocked_users">Estetyt käyttäjät</string>
<string name="new_threads">Uudet keskustelut</string>
<string name="conversations">Keskustelut</string>
<string name="notes">Viestit</string>
<string name="replies">Vastaukset</string>
<string name="follows">"Seuratut"</string>
<string name="reports">"Ilmiannetut"</string>
<string name="more_options">Lisää vaihtoehtoja</string>
<string name="relays">" Releet"</string>
<string name="website">Verkkosivusto</string>
<string name="lightning_address">Lightning-osoite</string>
<string name="copies_the_nsec_id_your_password_to_the_clipboard_for_backup">Kopioi Nsec-tunniste (salasanasi) leikepöydälle varmuuskopiointia varten</string>
<string name="copy_private_key_to_the_clipboard">Kopioi yksityinen avain leikepöydälle</string>
<string name="copies_the_public_key_to_the_clipboard_for_sharing">Kopioi julkinen avain leikepöydälle jakamista varten</string>
<string name="copy_public_key_npub_to_the_clipboard">Kopioi julkinen avain (NPub) leikepöydälle</string>
<string name="send_a_direct_message">Lähetä suora viesti</string>
<string name="edits_the_user_s_metadata">Muokkaa käyttäjän metatietoja</string>
<string name="follow">Seuraa</string>
<string name="follow_back">Seuraa takaisin</string>
<string name="unblock">Poista esto</string>
<string name="copy_user_id">Kopioi käyttäjän tunniste</string>
<string name="unblock_user">Poista käyttäjän esto</string>
<string name="npub_hex_username">"npub, käyttäjänimi, teksti"</string>
<string name="clear">Tyhjennä</string>
<string name="app_logo">Sovelluksen logo</string>
<string name="nsec_npub_hex_private_key">nsec.. tai npub..</string>
<string name="show_password">Näytä salasana</string>
<string name="hide_password">Piilota salasana</string>
<string name="invalid_key">Virheellinen avain</string>
<string name="i_accept_the">"Hyväksyn "</string>
<string name="terms_of_use">käyttöehdot</string>
<string name="acceptance_of_terms_is_required">Käyttöehtojen hyväksyminen on pakollista</string>
<string name="key_is_required">Avain on pakollinen</string>
<string name="login">Kirjaudu sisään</string>
<string name="generate_a_new_key">Luo uusi avain</string>
<string name="loading_feed">Ladataan syöte</string>
<string name="error_loading_replies">"Virhe ladattaessa vastauksia: "</string>
<string name="try_again">Yritä uudelleen</string>
<string name="feed_is_empty">Syöte on tyhjä.</string>
<string name="refresh">Päivitä</string>
<string name="created">luotu</string>
<string name="with_description_of">kuvaus</string>
<string name="and_picture">ja kuva</string>
<string name="changed_chat_name_to">muutti keskustelun nimen kohteeksi</string>
<string name="description_to">kuvaus kohteeksi</string>
<string name="and_picture_to">ja kuva kohteeksi</string>
<string name="leave">Poistu</string>
<string name="unfollow">Lopeta seuraaminen</string>
<string name="channel_created">Kanava luotu</string>
<string name="channel_information_changed_to">"Kanavan tiedot muutettu kohteeksi"</string>
<string name="public_chat">Julkinen keskustelu</string>
<string name="posts_received">vastaanotetut viestit</string>
<string name="remove">Poista</string>
<string name="translations_auto">Automaattinen</string>
<string name="translations_translated_from">käännös kohteesta</string>
<string name="translations_to">kohteeseen</string>
<string name="translations_show_in_lang_first">Näytä ensin kielellä %1$s</string>
<string name="translations_always_translate_to_lang">Aina käännä kielelle %1$s</string>
<string name="translations_never_translate_from_lang">Älä koskaan käännä kielestä %1$s</string>
<string name="nip_05">Nostr-osoite</string>
<string name="never">ei koskaan</string>
<string name="now">nyt</string>
<string name="h">t</string>
<string name="m">m</string>
<string name="d">pv</string>
<string name="nudity">Alastomuus</string>
<string name="profanity_hateful_speech">Loukkaava kielenkäyttö / vihapuhe</string>
<string name="report_hateful_speech">Ilmoita vihapuheesta</string>
<string name="report_nudity_porn">Ilmoita alastomuudesta / pornosta</string>
<string name="others">muut</string>
<string name="mark_all_known_as_read">Merkitse kaikki Tunnetut luetuiksi</string>
<string name="mark_all_new_as_read">Merkitse kaikki Uudet luetuiksi</string>
<string name="mark_all_as_read">Merkitse kaikki luetuiksi</string>
<string name="backup_keys">Varmuuskopioi Avaimet</string>
<string name="account_backup_tips_md" tools:ignore="Typos"> ## Avaimen varmuuskopiointi ja turvallisuusvinkit
\n\nTiliäsi suojaa salainen avain. Avain on pitkä satunnainen merkkijono, joka alkaa **nsec1**. Kaikki, joilla on pääsy salaiseen avaimeesi, voivat julkaista sisältöä käyttäen identiteettiäsi.
\n\n- Älä **koskaan** laita salaista avaintasi mihinkään verkkosivustoon tai ohjelmistoon, johon et luota.
\n- Amethyst-kehittäjät eivät **koskaan** kysy sinulta salaista avaintasi.
\n- **Säilytä** salaisen avaimen varmuuskopio turvallisesti tilin palauttamista varten. Suosittelemme salasanahallintaohjelman käyttämistä.
</string>
<string name="secret_key_copied_to_clipboard">Salainen avain (nsec) kopioitu leikepöydälle</string>
<string name="copy_my_secret_key">Kopioi salainen avain</string>
<string name="biometric_authentication_failed">Tunnistautuminen epäonnistui</string>
<string name="biometric_error">Virhe</string>
<string name="badge_created_by">"Luonut %1$s"</string>
<string name="badge_award_image_for">"Merkki kohteelle %1$s"</string>
<string name="new_badge_award_notif">Olet saanut uuden merkin</string>
<string name="award_granted_to">Merkki myönnetty kohteelle</string>
<string name="copied_note_text_to_clipboard">Viestin teksti kopioitu leikepöydälle</string>
<string name="copied_user_id_to_clipboard" tools:ignore="Typos">Käyttäjän @npub kopioitu leikepöydälle</string>
<string name="copied_note_id_to_clipboard" tools:ignore="Typos">Viestin tunniste (@note1) kopioitu leikepöydälle</string>
<string name="select_text_dialog_top">Valitse teksti</string>
<string name="private_conversation_notification">"&lt;Ei voitu purkaa yksityisviestiä&gt;\n\nSinut mainittiin yksityisessä/salatussa keskustelussa kohteiden %1$s ja %2$s välillä."</string>
<string name="account_switch_add_account_dialog_title">Lisää uusi tili</string>
<string name="drawer_accounts">Tilit</string>
<string name="account_switch_select_account">Valitse tili</string>
<string name="account_switch_add_account_btn">Lisää uusi tili</string>
<string name="account_switch_active_account">Aktiivinen tili</string>
<string name="account_switch_has_private_key">Sisältää salaisen avaimen</string>
<string name="account_switch_pubkey_only">Vain julkisavain, ei salaista avainta</string>
<string name="back">Takaisin</string>
<string name="quick_action_select">Valitse</string>
<string name="quick_action_share_browser_link">Jaa selaimen linkki</string>
<string name="quick_action_share">Jaa</string>
<string name="quick_action_copy_user_id">Kirjoittajan tunniste</string>
<string name="quick_action_copy_note_id">Viestin tunniste</string>
<string name="quick_action_copy_text">Kopioi teksti</string>
<string name="quick_action_delete">Poista</string>
<string name="quick_action_unfollow">Lopeta seuraaminen</string>
<string name="quick_action_follow">Seuraa</string>
<string name="quick_action_request_deletion_alert_title">Pyydä poistoa</string>
<string name="quick_action_request_deletion_alert_body">Amethyst pyytää, että viestisi poistetaan releistä, joihin olet tällä hetkellä yhteydessä. Emme voi taata, että viestisi poistetaan pysyvästi niistä releistä tai muista releistä, joissa se voi olla tallennettuna.</string>
<string name="quick_action_block_dialog_btn">Estä</string>
<string name="quick_action_delete_dialog_btn">Poista</string>
<string name="quick_action_block">Estä</string>
<string name="quick_action_report">Ilmoita</string>
<string name="quick_action_delete_button">Poista</string>
<string name="quick_action_dont_show_again_button">Älä näytä uudelleen</string>
<string name="report_dialog_spam">Roskaposti tai huijaus</string>
<string name="report_dialog_profanity">Loukkaava kielenkäyttö tai vihamielinen käytös</string>
<string name="report_dialog_impersonation">Haitallinen henkilöllisyyden omiminen</string>
<string name="report_dialog_nudity">Alastomuus tai graafinen sisältö</string>
<string name="report_dialog_illegal">Laiton käytös</string>
<string name="report_dialog_blocking_a_user">Käyttäjän estäminen piilottaa hänen sisältönsä sovelluksessasi. Merkintäsi ovat silti julkisesti nähtävillä, myös niille, jotka estät. Estetyt käyttäjät on lueteltu turvallisuussuodattimien näytössä.</string>
<string name="report_dialog_block_hide_user_btn"><![CDATA[Estä ja piilota käyttäjä]]></string>
<string name="report_dialog_report_btn">Ilmoita väärinkäytöstä</string>
<string name="report_dialog_reminder_public">Kaikki ilmoitukset ovat julkisesti nähtävillä.</string>
<string name="report_dialog_additional_reason_placeholder">Voit antaa lisäkontekstia ilmoituksellesi valinnaisesti...</string>
<string name="report_dialog_additional_reason_label">Lisäkonteksti</string>
<string name="report_dialog_select_reason_label">Syy</string>
<string name="report_dialog_select_reason_placeholder">Valitse syy...</string>
<string name="report_dialog_post_report_btn">Lähetä ilmoitus</string>
<string name="report_dialog_title">Estä ja ilmoita</string>
<string name="block_only">Estä</string>
<string name="bookmarks">Kirjanmerkit</string>
<string name="private_bookmarks">Yksityiset kirjanmerkit</string>
<string name="public_bookmarks">Julkiset kirjanmerkit</string>
<string name="add_to_private_bookmarks">Lisää yksityisiin kirjanmerkkeihin</string>
<string name="add_to_public_bookmarks">Lisää julkisiin kirjanmerkkeihin</string>
<string name="remove_from_private_bookmarks">Poista yksityisistä kirjanmerkeistä</string>
<string name="remove_from_public_bookmarks">Poista julkisista kirjanmerkeistä</string>
<string name="wallet_connect_service">Lompakkoyhteyspalvelu</string>
<string name="wallet_connect_service_explainer">Valtuuttaa Nostr-salaisuuden maksamaan zapeja ilman sovelluksesta poistumista. Pidä salaisuutesi turvassa ja käytä yksityistä relettä, jos mahdollista.</string>
<string name="wallet_connect_service_pubkey">Lompakkoyhteyden julkinen avain</string>
<string name="wallet_connect_service_relay">Lompakkoyhteyden rele</string>
<string name="wallet_connect_service_secret">Lompakkoyhteyden salainen avain</string>
<string name="wallet_connect_service_show_secret">Näytä salainen avain</string>
<string name="wallet_connect_service_secret_placeholder">nsec / heksadesimaalinen salainen avain</string>
<string name="pledge_amount_in_sats">Luvattu määrä satseissa</string>
<string name="post_poll">Luo äänestys</string>
<string name="poll_heading_required">Vaaditut kohdat:</string>
<string name="poll_zap_recipients">Zap-vastaanottajat</string>
<string name="poll_primary_description">Pääasiallinen äänestyksen kuvaus...</string>
<string name="poll_option_index">Vaihtoehto %s</string>
<string name="poll_option_description">Vaihtoehdon kuvaus</string>
<string name="poll_heading_optional">Valinnaiset kohdat:</string>
<string name="poll_zap_value_min">Vähimmäiszap</string>
<string name="poll_zap_value_max">Enimmäiszap</string>
<string name="poll_consensus_threshold">Konsensus</string>
<string name="poll_consensus_threshold_percent">(0100)%</string>
<string name="poll_closing_time">Sulje äänestys</string>
<string name="poll_closing_time_days">päivän kuluttua</string>
<string name="poll_is_closed">Äänestys on suljettu uusilta ääniltä</string>
<string name="poll_zap_amount">Zap-määrä</string>
<string name="one_vote_per_user_on_atomic_votes">Vain yksi ääni käyttäjää kohti tällä äänestystyypillä</string>
<string name="looking_for_event">"Etsitään tapahtumaa %1$s"</string>
<string name="custom_zaps_add_a_message">Lisää julkinen viesti</string>
<string name="custom_zaps_add_a_message_private">Lisää yksityinen viesti</string>
<string name="custom_zaps_add_a_message_nonzap">Lisää laskuviesti</string>
<string name="custom_zaps_add_a_message_example">Kiitos tehdystä työstä!</string>
<string name="lightning_create_and_add_invoice">Luo ja lisää</string>
<string name="poll_author_no_vote">Äänestyksen luojat eivät voi äänestää omissa äänestyksissään.</string>
<string name="hash_verification_passed">Tämä sisältö on sama kuin viestin julkaisuhetkellä</string>
<string name="hash_verification_failed">Tämä sisältö on muuttunut. Kirjoittaja ei ehkä ole nähnyt tai hyväksynyt muutosta</string>
<string name="content_description_add_image">Lisää kuva</string>
<string name="content_description_add_video">Lisää video</string>
<string name="content_description_add_document">Lisää dokumentti</string>
<string name="add_content">Lisää viestiin</string>
<string name="content_description">Sisällön kuvaus</string>
<string name="content_description_example">Sininen vene valkoisella hiekkarannalla auringonlaskussa</string>
<string name="zap_type">Zap-tyyppi</string>
<string name="zap_type_explainer">Zap-tyyppi kaikille vaihtoehdoille</string>
<string name="zap_type_public">Julkinen</string>
<string name="zap_type_public_explainer">Kaikki voivat nähdä tapahtuman ja viestin</string>
<string name="zap_type_private">Yksityinen</string>
<string name="zap_type_private_explainer">Lähettäjä ja vastaanottaja voivat nähdä toisensa ja lukea viestin</string>
<string name="zap_type_anonymous">Anonyymi</string>
<string name="zap_type_anonymous_explainer">Vastaanottaja ja yleisö eivät tiedä, kuka lähetti maksun</string>
<string name="zap_type_nonzap">Ei-Zap</string>
<string name="zap_type_nonzap_explainer">Ei jälkiä Nostrissa, vain Lightningissa</string>
<string name="file_server">Tiedostopalvelin</string>
<string name="zap_forward_lnAddress">LnAddress tai @Käyttäjä</string>
<string name="upload_server_imgur">imgur.com - luotettava</string>
<string name="upload_server_imgur_explainer">Imgur voi muokata tiedostoa</string>
<string name="upload_server_nostrimg">nostrimg.com - luotettava</string>
<string name="upload_server_nostrimg_explainer">NostrImg voi muokata tiedostoa</string>
<string name="upload_server_nostrbuild">nostr.build - luotettava</string>
<string name="upload_server_nostrbuild_explainer">Nostr.build voi muokata tiedostoa</string>
<string name="upload_server_nostrfilesdev">nostrfiles.dev - luotettava</string>
<string name="upload_server_nostrfilesdev_explainer">Nostrfiles.dev voi muokata tiedostoa</string>
<string name="upload_server_nostrcheckme">nostrcheck.me - luotettava</string>
<string name="upload_server_nostrcheckme_explainer">Nostrcheck.me voi muokata tiedostoa</string>
<string name="upload_server_imgur_nip94">Todennettava Imgur (NIP-94)</string>
<string name="upload_server_imgur_nip94_explainer">Tarkistaa, onko Imgur muokannut tiedostoa. Uusi NIP: muut asiakkaat eivät ehkä näe sitä</string>
<string name="upload_server_nostrimg_nip94">Todennettava NostrImg (NIP-94)</string>
<string name="upload_server_nostrimg_nip94_explainer">Tarkistaa, onko NostrImg muokannut tiedostoa. Uusi NIP: muut asiakkaat eivät ehkä näe sitä</string>
<string name="upload_server_nostrbuild_nip94">Todennettava Nostr.build (NIP-94)</string>
<string name="upload_server_nostrbuild_nip94_explainer">Tarkistaa, onko Nostr.build muokannut tiedostoa. Uusi NIP: muut asiakkaat eivät ehkä näe sitä</string>
<string name="upload_server_nostrfilesdev_nip94">Todennettava Nostrfiles.dev (NIP-94)</string>
<string name="upload_server_nostrfilesdev_nip94_explainer">Tarkistaa, onko Nostrfiles.dev muokannut tiedostoa. Uusi NIP: muut asiakkaat eivät ehkä näe sitä</string>
<string name="upload_server_nostrcheckme_nip94">Todennettava Nostrcheck.me (NIP-94)</string>
<string name="upload_server_nostrcheckme_nip94_explainer">Tarkistaa, onko Nostrcheck.me muokannut tiedostoa. Uusi NIP: muut asiakkaat eivät ehkä näe sitä</string>
<string name="upload_server_relays_nip95">Omat releet (NIP-95)</string>
<string name="upload_server_relays_nip95_explainer">Tiedostot ovat isännöityinä omilla releilläsi. Uusi NIP: tarkista, tukevatko ne sitä</string>
<string name="connect_via_tor_short">Tor/Orbot-asetus</string>
<string name="connect_via_tor">Yhdistä Orbot-asetuksesi kautta</string>
<string name="do_you_really_want_to_disable_tor_title">Haluatko todella katkaista Orbot/Tor-yhteytesi?</string>
<string name="do_you_really_want_to_disable_tor_text">Tietosi siirtyvät välittömästi tavalliseen verkkoon</string>
<string name="yes">Kyllä</string>
<string name="no">Ei</string>
<string name="follow_list_selection">Seuraa-lista</string>
<string name="follow_list_kind3follows">Kaikki seuraajat</string>
<string name="follow_list_global">Maailmanlaajuinen</string>
<string name="connect_through_your_orbot_setup_markdown"> ## Yhdistä Torin kautta Orbotin avulla
\n\n1. Asenna [Orbot](https://play.google.com/store/apps/details?id=org.torproject.android)
\n2. Käynnistä Orbot
\n3. Orbotissa tarkista Socks-portti. Oletusarvo on 9050
\n4. Tarvittaessa vaihda porttia Orbotissa
\n5. Aseta Socks-portti tällä näytöllä
\n6. Paina Aktivoi-painiketta käyttääksesi Orbotia välityspalvelimena
</string>
<string name="orbot_socks_port">Orbot Socks-portti</string>
<string name="invalid_port_number">Virheellinen porttinumero</string>
<string name="use_orbot">Käytä Orbotia</string>
<string name="disconnect_from_your_orbot_setup">Katkaise Tor/Orbot-yhteys</string>
<string name="app_notification_dms_channel_name">Yksityisviestit</string>
<string name="app_notification_dms_channel_description">Ilmoittaa sinulle, kun yksityinen viesti saapuu</string>
<string name="app_notification_zaps_channel_name">Saapuneet Zapit</string>
<string name="app_notification_zaps_channel_description">Ilmoittaa sinulle, kun joku zappaa sinua</string>
<string name="app_notification_zaps_channel_message">%1$s sats</string>
<string name="app_notification_zaps_channel_message_from">Lähettäjä: %1$s</string>
<string name="app_notification_zaps_channel_message_for">saaja: %1$s</string>
<string name="reply_notify">Ilmoitus: </string>
<string name="channel_list_join_conversation">Liity keskusteluun</string>
<string name="channel_list_user_or_group_id">Käyttäjän tai ryhmän tunniste</string>
<string name="channel_list_user_or_group_id_demo">npub, nevent tai heksadesimaali</string>
<string name="channel_list_create_channel">Luo</string>
<string name="channel_list_join_channel">Liity</string>
<string name="today">Tänään</string>
<string name="content_warning">Sisältövaroitus</string>
<string name="content_warning_explanation">Tämä viesti sisältää herkkää sisältöä, joka voi olla loukkaavaa tai häiritsevää joillekin ihmisille</string>
<string name="content_warning_hide_all_sensitive_content">Piilota aina herkkä sisältö</string>
<string name="content_warning_show_all_sensitive_content">Näytä aina herkkä sisältö</string>
<string name="content_warning_see_warnings">Näytä aina sisältövaroitukset</string>
<string name="recommended_apps">Suosittelee: </string>
<string name="filter_spam_from_strangers">Suodata roskapostia tuntemattomilta</string>
<string name="warn_when_posts_have_reports_from_your_follows">Varoita, kun seurattavasi ovat raportoineet viestejä</string>
<string name="new_reaction_symbol">Uusi reaktiosymboli</string>
<string name="no_reaction_type_setup_long_press_to_change">Ei valittu reaktiotyyppejä. Pidä pitkään painettuna vaihtaaksesi.</string>
<string name="zapraiser">Zapkerääjä</string>
<string name="zapraiser_explainer">Lisää tavoitesumma satseina tämän viestin tukemiseksi. Tuettavat asiakkaat voivat näyttää tämän edistymispalkkina tuen kannustamiseksi</string>
<string name="zapraiser_target_amount_in_sats">Tavoitesumma satseina</string>
<string name="sats_to_complete">Zapraiser %1$s. %2$s satsiin tavoitteesta</string>
<string name="read_from_relay">Lue releestä</string>
<string name="write_to_relay">Kirjoita releeseen</string>
<string name="an_error_occurred_trying_to_get_relay_information">Virhe yritettäessä hakea rele-tietoja %1$s:stä</string>
<string name="owner">Omistaja</string>
<string name="version">Versio</string>
<string name="software">Ohjelmisto</string>
<string name="contact">Yhteystiedot</string>
<string name="supports">Tuetut NIPit</string>
<string name="admission_fees">Pääsymaksut</string>
<string name="payments_url">Maksut URL</string>
<string name="limitations">Rajoitukset</string>
<string name="countries">Maat</string>
<string name="languages">Kielet</string>
<string name="tags">Tagit</string>
<string name="posting_policy">Julkaisupolitiikka</string>
<string name="message_length">Viestin pituus</string>
<string name="subscriptions">Tilaukset</string>
<string name="filters">Suodattimet</string>
<string name="subscription_id_length">Tilaustunnuksen pituus</string>
<string name="minimum_prefix">Vähimmäisliite</string>
<string name="maximum_event_tags">Maksimi tapahtumien tagit</string>
<string name="content_length">Sisällön pituus</string>
<string name="minimum_pow">Vähimmäis PoW</string>
<string name="auth">Autentikointi</string>
<string name="payment">Maksu</string>
<string name="cashu">Cashu-tunniste</string>
<string name="cashu_redeem">Lunasta</string>
<string name="no_lightning_address_set">Ei Lightning-osoitetta asetettuna</string>
<string name="copied_token_to_clipboard">Kopioitu tunniste leikepöydälle</string>
<string name="live_stream_live_tag">LIVE</string>
<string name="live_stream_offline_tag">POISSA</string>
<string name="live_stream_ended_tag">PÄÄTTYNYT</string>
<string name="live_stream_planned_tag">AJOITETTU</string>
<string name="live_stream_is_offline">Livestream on offline-tilassa</string>
<string name="live_stream_has_ended">Livestream on päättynyt</string>
<string name="are_you_sure_you_want_to_log_out">Uloskirjautuminen poistaa kaikki paikalliset tiedot. Varmista, että sinulla on varmuuskopio yksityisavaimistasi välttääksesi tilisi menetyksen. Haluatko jatkaa?</string>
<string name="followed_tags">Seuratut tagit</string>
<string name="relay_setup">Releet</string>
<string name="discover_live">Live</string>
<string name="discover_community">Yhteisö</string>
<string name="discover_chat">Keskustelut</string>
<string name="community_approved_posts">Hyväksytyt viestit</string>
<string name="groups_no_descriptor">Tällä ryhmällä ei ole kuvausta tai sääntöjä. Keskustele omistajan kanssa sen lisäämiseksi</string>
<string name="community_no_descriptor">Tällä yhteisöllä ei ole kuvausta. Keskustele omistajan kanssa sen lisäämiseksi</string>
<string name="add_sensitive_content_label">Herkkä sisältö</string>
<string name="add_sensitive_content_description">Lisää herkän sisällön varoitus ennen tämän sisällön näyttämistä</string>
<string name="settings">Asetukset</string>
<string name="connectivity_type_always">Aina</string>
<string name="connectivity_type_wifi_only">Vain WiFi</string>
<string name="connectivity_type_never">Ei koskaan</string>
<string name="system">Järjestelmä</string>
<string name="light">Vaalea</string>
<string name="dark">Tumma</string>
<string name="application_preferences">Sovelluksen asetukset</string>
<string name="language">Kieli</string>
<string name="theme">Teema</string>
<string name="automatically_load_images_gifs">Kuvan esikatselu</string>
<string name="automatically_play_videos">Videon toisto</string>
<string name="automatically_show_url_preview">URL-esikatselu</string>
<string name="load_image">Lataa kuva</string>
<string name="spamming_users">Roskapostittajat</string>
<string name="muted_button">Ääni pois päältä. Napsauta palauttaaksesi äänet</string>
<string name="mute_button">Ääni päällä. Napsauta vaimentaaksesi</string>
<string name="search_button">Hae paikallisia ja etämerkintöjä</string>
<string name="nip05_verified">Nostr-osoite varmennettiin</string>
<string name="nip05_failed">Nostr-osoite ei läpäissyt varmennusta</string>
<string name="nip05_checking">Tarkistetaan Nostr-osoite</string>
<string name="select_deselect_all">Valitse/Poista valinta kaikista</string>
<string name="default_relays">Oletus</string>
<string name="select_a_relay_to_continue">Valitse rele jatkaaksesi</string>
<string name="zap_forward_title">Ohjaa zappit kohteeseen:</string>
<string name="zap_forward_explainer">Sovelluksien tukeminen ohjaa zappit alla olevaan LN-osoitteeseen tai käyttäjäprofiiliin sen sijaan, että ne menisivät sinulle</string>
<string name="geohash_title">Näytä sijaintina </string>
<string name="geohash_explainer">Lisää sijaintisi Geohashinä viestiin. On julkisesti nähtävänä, että olet 5 km (3 mailin) säteellä nykyisestä sijainnista</string>
<string name="add_sensitive_content_explainer">Lisää herkkä sisältö -varoitus ennen sisällön näyttämistä. Tämä on suositeltua kaikelle aikuissisällölle tai sisällölle, jota jotkut saattavat pitää loukkaavana tai häiritsevänä</string>
<string name="new_feature_nip24_might_not_be_available_title">Uusi ominaisuus</string>
<string name="new_feature_nip24_might_not_be_available_description">Tämän tilan aktivoiminen vaatii Amethystin lähettämään NIP-24-viestin (Lahjapakatut, Suljetut suorat ja ryhmäviestit). NIP-24 on uusi, ja useimmat asiakkaat eivät ole vielä toteuttaneet sitä. Varmista, että vastaanottaja käyttää yhteensopivaa asiakasta.</string>
<string name="new_feature_nip24_activate">Aktivoi</string>
<string name="messages_create_public_chat">Julkinen</string>
<string name="messages_new_message">Yksityinen</string>
<string name="messages_new_message_to">Vastaanottaja</string>
<string name="messages_new_message_subject">Aihe</string>
<string name="messages_new_message_subject_caption">Keskustelun aihe</string>
<string name="messages_new_message_to_caption">"\@Käyttäjä1, @Käyttäjä2, @Käyttäjä3"</string>
<string name="messages_group_descriptor">Tämän ryhmän jäsenet</string>
<string name="messages_new_subject_message">Selitys jäsenille</string>
<string name="messages_new_subject_message_placeholder">Muuta nimi uusille tavoitteille.</string>
<string name="language_description">Sovelluksen käyttöliittymälle</string>
<string name="theme_description">Tumma, vaalea tai järjestelmäteema</string>
<string name="automatically_load_images_gifs_description">Lataa kuvat ja GIF-animaatiot automaattisesti</string>
<string name="automatically_play_videos_description">Toista videot ja GIF-animaatiot automaattisesti</string>
<string name="automatically_show_url_preview_description">Näytä URL-esikatselut</string>
<string name="load_image_description">Koska kuvat ladataan</string>
<string name="copy_url_to_clipboard">Kopioi URL leikepöydälle</string>
<string name="copy_the_note_id_to_the_clipboard">Kopioi viestin tunniste leikepöydälle</string>
<string name="created_at">Luotu</string>
<string name="rules">Säännöt</string>
<string name="status_update">Päivitä tilaasi</string>
<string name="lightning_wallets_not_found">Virhe tulkittaessa virhesanomaa</string>
<string name="poll_zap_value_min_max_explainer">Äänet painotetaan zappin määrän perusteella. Voit asettaa minimimäärän roskapostin välttämiseksi ja maksimimäärän suurten zappereiden estämiseksi. Käytä samaa määrää molemmissa kentissä, jotta jokainen ääni arvostetaan samalla määrällä. Jätä se tyhjäksi hyväksyäksesi minkä tahansa määrän.</string>
<string name="error_dialog_zap_error">Zapin lähettäminen ei onnistunut</string>
<string name="error_dialog_talk_to_user">Viesti käyttäjälle</string>
<string name="error_dialog_button_ok">Ok</string>
</resources>

View File

@ -101,7 +101,7 @@
<string name="failed_to_save_the_image">Failed to save the image</string>
<string name="upload_image">Upload Image</string>
<string name="uploading">Uploading…</string>
<string name="user_does_not_have_a_lightning_address_setup_to_receive_sats">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">User does not have a lightning address set up to receive sats</string>
<string name="reply_here">"reply here.. "</string>
<string name="copies_the_note_id_to_the_clipboard_for_sharing">Copies the Note ID to the clipboard for sharing in Nostr</string>
<string name="copy_channel_id_note_to_the_clipboard">Copy Channel ID (Note) to the Clipboard</string>