* 'main' of https://github.com/vitorpamplona/amethyst:
  fix: preserve search screen scroll position across navigation
  feat: add audio and PDF file upload support to ShortNotePostScreen
  New Crowdin translations by GitHub Action
This commit is contained in:
Vitor Pamplona
2026-03-10 13:50:13 -04:00
12 changed files with 296 additions and 50 deletions
@@ -0,0 +1,129 @@
/*
* Copyright (c) 2025 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.actions.uploads
import android.net.Uri
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.height
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AttachFile
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.components.LoadingAnimation
import com.vitorpamplona.amethyst.ui.stringRes
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import java.util.concurrent.atomic.AtomicBoolean
@Composable
fun SelectFromFiles(
isUploading: Boolean,
tint: Color,
modifier: Modifier,
onFilesChosen: (ImmutableList<SelectedMedia>) -> Unit,
) {
var showFileSelect by remember { mutableStateOf(false) }
if (showFileSelect) {
FileSelect(
onFilesSelected = { files ->
showFileSelect = false
if (files.isNotEmpty()) {
onFilesChosen(files)
}
},
)
}
FileSelectButton(isUploading, tint, modifier) { showFileSelect = true }
}
@Composable
private fun FileSelectButton(
isUploading: Boolean,
tint: Color,
modifier: Modifier,
onClick: () -> Unit,
) {
IconButton(
modifier = modifier,
enabled = !isUploading,
onClick = { onClick() },
) {
if (!isUploading) {
Icon(
imageVector = Icons.Default.AttachFile,
contentDescription = stringRes(id = R.string.upload_file),
modifier = Modifier.height(25.dp),
tint = tint,
)
} else {
LoadingAnimation()
}
}
}
@Composable
fun FileSelect(onFilesSelected: (ImmutableList<SelectedMedia>) -> Unit = {}) {
val hasLaunched by remember { mutableStateOf(AtomicBoolean(false)) }
val resolver = LocalContext.current.contentResolver
val launcher =
rememberLauncherForActivityResult(
contract = ActivityResultContracts.OpenMultipleDocuments(),
onResult = { uris: List<Uri> ->
onFilesSelected(
uris
.map {
SelectedMedia(it, resolver.getType(it))
}.toImmutableList(),
)
hasLaunched.set(false)
},
)
@Composable
fun LaunchFilePicker() {
SideEffect {
if (!hasLaunched.getAndSet(true)) {
launcher.launch(
arrayOf(
"audio/*",
"application/pdf",
),
)
}
}
}
LaunchFilePicker()
}
@@ -55,6 +55,10 @@ class SelectedMedia(
fun isImage() = mimeType?.startsWith("image")
fun isVideo() = mimeType?.startsWith("video")
fun isAudio() = mimeType?.startsWith("audio")
fun isDocument() = mimeType == "application/pdf"
}
@Composable
@@ -28,14 +28,21 @@ import android.os.Build
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AudioFile
import androidx.compose.material.icons.filled.PictureAsPdf
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ProgressIndicatorDefaults
@@ -117,6 +124,16 @@ fun ShowImageGallery(
.fillMaxWidth()
.windowInsetsPadding(WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)),
)
} else if (media.isAudio() == true) {
FilePreviewPlaceholder(
icon = Icons.Default.AudioFile,
label = media.mimeType ?: "audio/*",
)
} else if (media.isDocument() == true) {
FilePreviewPlaceholder(
icon = Icons.Default.PictureAsPdf,
label = media.mimeType ?: "application/pdf",
)
} else if (media.isVideo() == true && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
var bitmap by remember { mutableStateOf<Bitmap?>(null) }
val context = LocalContext.current
@@ -254,3 +271,36 @@ fun UploadingState(
)
}
}
@Composable
fun FilePreviewPlaceholder(
icon: androidx.compose.ui.graphics.vector.ImageVector,
label: String,
) {
Box(
modifier =
Modifier
.fillMaxWidth()
.background(MaterialTheme.colorScheme.surfaceVariant),
contentAlignment = Alignment.Center,
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = Modifier.padding(8.dp),
) {
Icon(
imageVector = icon,
contentDescription = label,
modifier = Modifier.size(40.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
Text(
text = label,
color = MaterialTheme.colorScheme.onSurfaceVariant,
fontSize = 10.sp,
textAlign = TextAlign.Center,
)
}
}
}
@@ -54,6 +54,8 @@ object ScrollStateKeys {
const val DISCOVER_LIVE = "DiscoverLiveFeed"
const val DISCOVER_COMMUNITY = "DiscoverCommunitiesFeed"
const val DISCOVER_CHATS = "DiscoverChatsFeed"
const val SEARCH_SCREEN = "SearchFeed"
}
object PagerStateKeys {
@@ -63,6 +63,7 @@ import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.ui.actions.mediaServers.FileServerSelectionRow
import com.vitorpamplona.amethyst.ui.actions.uploads.MAX_VOICE_RECORD_SECONDS
import com.vitorpamplona.amethyst.ui.actions.uploads.RecordVoiceButton
import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromFiles
import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery
import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia
import com.vitorpamplona.amethyst.ui.actions.uploads.TakePictureButton
@@ -504,6 +505,14 @@ private fun BottomRowActions(postViewModel: ShortNotePostViewModel) {
maxDurationSeconds = MAX_VOICE_RECORD_SECONDS,
)
SelectFromFiles(
isUploading = postViewModel.isUploadingImage,
tint = MaterialTheme.colorScheme.onBackground,
modifier = Modifier,
) {
postViewModel.selectImage(it)
}
if (postViewModel.canUsePoll) {
// These should be hashtag recommendations the user selects in the future.
// val hashtag = stringRes(R.string.poll_hashtag)
@@ -33,7 +33,6 @@ import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.HorizontalDivider
@@ -59,7 +58,9 @@ import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.nip11RelayInfo.loadRelayInfo
import com.vitorpamplona.amethyst.service.relayClient.searchCommand.TextSearchDataSourceSubscription
import com.vitorpamplona.amethyst.ui.feeds.ScrollStateKeys
import com.vitorpamplona.amethyst.ui.feeds.WatchLifecycleAndUpdateModel
import com.vitorpamplona.amethyst.ui.feeds.rememberForeverLazyListState
import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold
import com.vitorpamplona.amethyst.ui.navigation.bottombars.AppBottomBar
import com.vitorpamplona.amethyst.ui.navigation.navs.INav
@@ -107,7 +108,7 @@ fun SearchScreen(
) {
WatchLifecycleAndUpdateModel(searchBarViewModel)
val listState = rememberLazyListState()
val listState = rememberForeverLazyListState(ScrollStateKeys.SEARCH_SCREEN)
LaunchedEffect(searchBarViewModel.focusRequester) {
searchBarViewModel.focusRequester.requestFocus()
+12 -12
View File
@@ -419,6 +419,15 @@
<string name="wallet_connect_service_secret">Tajemství Wallet Connect</string>
<string name="wallet_connect_service_show_secret">Zobrazit tajný klíč</string>
<string name="wallet_connect_service_secret_placeholder">nsec / hex soukromý klíč</string>
<string name="wallet_connect_status_connected">Připojeno</string>
<string name="wallet_connect_status_not_connected">Nepřipojeno</string>
<string name="wallet_connect_manual_config">Pokročilé: zadejte podrobnosti připojení ručně</string>
<string name="quick_zap_amounts">Rychlé částky Zap</string>
<string name="quick_zap_amounts_explainer">Zobrazí se při stisknutí tlačítka zap. Klepnutím na částku ji odeberete. Pokud ponecháte prázdné, otevře se pokaždé dialog pro zadání částky.</string>
<string name="zap_privacy_section">Soukromí Zap</string>
<string name="zap_type_section_explainer">Určuje, jak je zobrazena vaše identita při odesílání zapsu.</string>
<string name="wallet_connect_connect_app">Připojit peněženku</string>
<string name="see_relay_feed">Zobrazit kanál relé</string>
<string name="pledge_amount_in_sats">Částka záruky v sats</string>
<string name="post_poll">Zveřejnit hlasování</string>
<string name="poll_heading_required">Povinná pole:</string>
@@ -658,6 +667,7 @@
<string name="read_from_relay_description">Množství bajtů, které bylo přijato z tohoto relé, včetně filtrů a událostí</string>
<string name="an_error_occurred_trying_to_get_relay_information">Při pokusu o získání informací z Relay se vyskytla chyba z %1$s</string>
<string name="owner">Vlastník</string>
<string name="used_by">Používáno</string>
<string name="self">Servisní klíč</string>
<string name="running_software">Spuštěno %1$s</string>
<string name="running_software_version">Spuštěno %1$s (%2$s)</string>
@@ -853,6 +863,7 @@
<string name="load_image_description">Kdy načíst obrázek</string>
<string name="copy_stack_to_clipboard">Kopírovat zásobník</string>
<string name="copy_to_clipboard">Kopírovat do schránky</string>
<string name="copy_nprofile_to_clipboard">Zkopírovat nprofile do schránky</string>
<string name="copy_npub_to_clipboard">Kopírovat npub do schránky</string>
<string name="share_or_save">Sdílet nebo Uložit</string>
<string name="copy_url_to_clipboard">Kopírovat URL do schránky</string>
@@ -1076,6 +1087,7 @@
<string name="add_content_warning">Přidat upozornění na obsah</string>
<string name="remove_content_warning">Odstranit upozornění na obsah</string>
<string name="show_npub_as_a_qr_code">Zobrazit npub jako QR kód</string>
<string name="show_nprofile_as_a_qr_code">Zobrazit nprofile jako QR kód</string>
<string name="invalid_nip19_uri">Neplatná adresa</string>
<string name="invalid_nip19_uri_description">Amethyst obdržel URI k otevření, ale tento URI byl neplatný: %1$s</string>
<string name="dm_relays_title">Relé DM Schránky</string>
@@ -1458,16 +1470,4 @@
<string name="kind_voice_msg">Hlasová zpráva</string>
<string name="kind_voice_reply">Hlasová odpověď</string>
<string name="kind_wiki">Wiki</string>
<string name="see_relay_feed">Zobrazit kanál relé</string>
<string name="used_by">Používáno</string>
<string name="copy_nprofile_to_clipboard">Zkopírovat nprofile do schránky</string>
<string name="show_nprofile_as_a_qr_code">Zobrazit nprofile jako QR kód</string>
<string name="quick_zap_amounts_explainer">Zobrazí se při stisknutí tlačítka zap. Klepnutím na částku ji odeberete. Pokud ponecháte prázdné, otevře se pokaždé dialog pro zadání částky.</string>
<string name="wallet_connect_status_connected">Připojeno</string>
<string name="wallet_connect_status_not_connected">Nepřipojeno</string>
<string name="wallet_connect_manual_config">Pokročilé: zadejte podrobnosti připojení ručně</string>
<string name="quick_zap_amounts">Rychlé částky Zap</string>
<string name="zap_privacy_section">Soukromí Zap</string>
<string name="zap_type_section_explainer">Určuje, jak je zobrazena vaše identita při odesílání zapsu.</string>
<string name="wallet_connect_connect_app">Připojit peněženku</string>
</resources>
+12 -12
View File
@@ -425,6 +425,15 @@ anz der Bedingungen ist erforderlich</string>
<string name="wallet_connect_service_secret">Wallet-Verbindungs-Geheimnis</string>
<string name="wallet_connect_service_show_secret">Geheimen Schlüssel anzeigen</string>
<string name="wallet_connect_service_secret_placeholder">nsec / hexadezimaler privater Schlüssel</string>
<string name="wallet_connect_status_connected">Verbunden</string>
<string name="wallet_connect_status_not_connected">Nicht verbunden</string>
<string name="wallet_connect_manual_config">Erweitert: Verbindungsdetails manuell eingeben</string>
<string name="quick_zap_amounts">Schnelle Zap-Beträge</string>
<string name="quick_zap_amounts_explainer">Wird beim Drücken der Zap-Schaltfläche angezeigt. Tippe auf einen Betrag, um ihn zu entfernen. Wenn du es leer lässt, wird jedes Mal ein Dialog zur Eingabe eines Betrags geöffnet.</string>
<string name="zap_privacy_section">Zap-Datenschutz</string>
<string name="zap_type_section_explainer">Legt fest, wie deine Identität beim Senden eines Zaps angezeigt wird.</string>
<string name="wallet_connect_connect_app">Wallet verbinden</string>
<string name="see_relay_feed">Relay-Feed anzeigen</string>
<string name="pledge_amount_in_sats">Spendenbetrag in Sats</string>
<string name="post_poll">Umfrage veröffentlichen</string>
<string name="poll_heading_required">Erforderliche Felder:</string>
@@ -663,6 +672,7 @@ anz der Bedingungen ist erforderlich</string>
<string name="read_from_relay_description">Die Menge in Bytes, die von diesem Relais empfangen wurde, einschließlich Filter und Ereignisse</string>
<string name="an_error_occurred_trying_to_get_relay_information">Ein Fehler ist beim Abrufen von Relay-Informationen von %1$s aufgetreten</string>
<string name="owner">Inhaber</string>
<string name="used_by">Verwendet von</string>
<string name="self">Service-Schlüssel</string>
<string name="running_software">%1$s wird ausgeführt</string>
<string name="running_software_version">%1$s wird ausgeführt (%2$s)</string>
@@ -858,6 +868,7 @@ anz der Bedingungen ist erforderlich</string>
<string name="load_image_description">Wann Bilder geladen werden sollen</string>
<string name="copy_stack_to_clipboard">Stapel kopieren</string>
<string name="copy_to_clipboard">In Zwischenablage kopieren</string>
<string name="copy_nprofile_to_clipboard">nprofile in die Zwischenablage kopieren</string>
<string name="copy_npub_to_clipboard">Npub in Zwischenablage kopieren</string>
<string name="share_or_save">Teilen oder Speichern</string>
<string name="copy_url_to_clipboard">URL in die Zwischenablage kopieren</string>
@@ -1081,6 +1092,7 @@ anz der Bedingungen ist erforderlich</string>
<string name="add_content_warning">Inhaltswarnung hinzufügen</string>
<string name="remove_content_warning">Inhaltswarnung entfernen</string>
<string name="show_npub_as_a_qr_code">Npub als QR-Code anzeigen</string>
<string name="show_nprofile_as_a_qr_code">nprofile als QR-Code anzeigen</string>
<string name="invalid_nip19_uri">Ungültige Adresse</string>
<string name="invalid_nip19_uri_description">Amethyst hat eine URI zum Öffnen erhalten, aber diese URI war ungültig: %1$s</string>
<string name="dm_relays_title">DM Posteingangs-Relais</string>
@@ -1463,16 +1475,4 @@ anz der Bedingungen ist erforderlich</string>
<string name="kind_voice_msg">Sprachnachricht</string>
<string name="kind_voice_reply">Sprachantwort</string>
<string name="kind_wiki">Wiki</string>
<string name="see_relay_feed">Relay-Feed anzeigen</string>
<string name="used_by">Verwendet von</string>
<string name="copy_nprofile_to_clipboard">nprofile in die Zwischenablage kopieren</string>
<string name="show_nprofile_as_a_qr_code">nprofile als QR-Code anzeigen</string>
<string name="quick_zap_amounts_explainer">Wird beim Drücken der Zap-Schaltfläche angezeigt. Tippe auf einen Betrag, um ihn zu entfernen. Wenn du es leer lässt, wird jedes Mal ein Dialog zur Eingabe eines Betrags geöffnet.</string>
<string name="wallet_connect_status_connected">Verbunden</string>
<string name="wallet_connect_status_not_connected">Nicht verbunden</string>
<string name="wallet_connect_manual_config">Erweitert: Verbindungsdetails manuell eingeben</string>
<string name="quick_zap_amounts">Schnelle Zap-Beträge</string>
<string name="zap_privacy_section">Zap-Datenschutz</string>
<string name="zap_type_section_explainer">Legt fest, wie deine Identität beim Senden eines Zaps angezeigt wird.</string>
<string name="wallet_connect_connect_app">Wallet verbinden</string>
</resources>
@@ -867,6 +867,7 @@
<string name="load_image_description">Mikor töltse be a képeket</string>
<string name="copy_stack_to_clipboard">Köteg másolása</string>
<string name="copy_to_clipboard">Másolás a vágólapra</string>
<string name="copy_nprofile_to_clipboard">nprofile-kulcs vágólapra másolása</string>
<string name="copy_npub_to_clipboard">Npub másolása a vágólapra</string>
<string name="share_or_save">Megosztás vagy mentés</string>
<string name="copy_url_to_clipboard">Webcím másolása a vágólapra</string>
@@ -1056,6 +1057,19 @@
<string name="like_description">Tetszik</string>
<string name="zap_description">Zap</string>
<string name="change_reaction">Gyors reakciók megváltoztatása</string>
<string name="reactions_settings">Reakciósor</string>
<string name="reactions_settings_description">Állítsa be, hogy mely reakciógombok jelenjenek meg, azok sorrendjét, valamint a számlálók megjelenítését.</string>
<string name="reactions_settings_enabled">Engedélyezve</string>
<string name="reactions_settings_show_counter">Számláló megjelenítése</string>
<string name="reactions_settings_reorder">Újrarendezés</string>
<string name="reactions_settings_reply">Válasz</string>
<string name="reactions_settings_reply_description">Válasz erre a bejegyzésre</string>
<string name="reactions_settings_boost">Megtolás</string>
<string name="reactions_settings_like_description">Reagálás erre a bejegyzésre egy hangulatjellel</string>
<string name="reactions_settings_zap">Zap</string>
<string name="reactions_settings_zap_description">Lightning fizetés küldése a szerzőnek</string>
<string name="reactions_settings_share">Megosztás</string>
<string name="reactions_settings_share_description">Ennek a bejegyzésnek a megosztása külső alkalmazásban</string>
<string name="profile_image_of_user">%1$s profilképe</string>
<string name="relay_info">%1$s átjátszó</string>
<string name="expand_relay_list">Átjátszólista kibontása</string>
@@ -1075,6 +1089,7 @@
<string name="add_content_warning">Tartalmi figyelmeztetés hozzáadása</string>
<string name="remove_content_warning">Tartalmi figyelmeztetés eltávolítása</string>
<string name="show_npub_as_a_qr_code">Az npub-kulcs megjelenítése QR-kódként</string>
<string name="show_nprofile_as_a_qr_code">nprofile-kulcs megjelenítése QR-kódként</string>
<string name="invalid_nip19_uri">Érvénytelen cím</string>
<string name="invalid_nip19_uri_description">Az Amethyst kapott egy URI-t a megnyitáshoz, de az érvénytelen volt: %1$s</string>
<string name="dm_relays_title">Bejövő átjátszók a privát üzenetekhez</string>
@@ -1127,6 +1142,9 @@
<string name="trusted_relays_title">Megbízható átjátszók</string>
<string name="trusted_section">Megbízható átjátszók</string>
<string name="trusted_section_explainer">Az átjátszóknak, amelyekben megbízik, nincs szükségük Tor kapcsolatra a következőhöz:</string>
<string name="favorite_relays_title">Kedvenc átjátszó-hírforrások</string>
<string name="favorite_section">Kedvenc átjátszó-hírforrások</string>
<string name="favorite_section_explainer">Átjátszók, amelyeket gyakran felkeres a globális hírfolyamuk megtekintéséhez</string>
<string name="proxy_relays_title">Proxyzott átjátszók</string>
<string name="proxy_section">Proxyzott átjátszók</string>
<string name="proxy_section_explainer">Összesítő átjátszók, amelyeket az alkalmazásnak használnia kell a hírfolyamok letöltéséhez, például filter.nostr.wine. Ez helyettesíti a kimeneti modellt, és az alkalmazás csak a listákban szereplő átjátszókhoz fog csatlakozni.</string>
@@ -1172,6 +1190,7 @@
<string name="accessibility_pushpin">Kapcsolatrögzítő (Pushpin)</string>
<string name="accessibility_scan_qr_code">QR-kód beolvasása</string>
<string name="accessibility_navigate_to_alby">Harmadik féltől származó pénztárca-szolgáltató felkeresése: Alby</string>
<string name="accessibility_select_date">Dátum kiválasztása</string>
<string name="it_s_not_possible_to_reply_to_a_draft_note">A piszkozatokra nem lehet válaszolni</string>
<string name="it_s_not_possible_to_quote_to_a_draft_note">A piszkozatokat nem lehet idézni</string>
<string name="it_s_not_possible_to_react_to_a_draft_note">A piszkozatokra nem lehet reagálni</string>
@@ -1308,5 +1327,36 @@
<string name="confirm">Megerősítés</string>
<string name="next">Következő</string>
<string name="add_poll_option_button">Szavazati lehetőség hozzáadása</string>
<string name="go_back">Vissza</string>
<string name="approve">Elfogadás</string>
<string name="connected">Kapcsolódva</string>
<string name="social_proof">Közösségi megerősítés</string>
<string name="poll_submit">Beküldés</string>
<string name="restart">Újraindítás</string>
<string name="chess_accept">Elfogadás</string>
<string name="chess_decline">Elutasítás</string>
<string name="chess_new_game">Új játék</string>
<string name="new_chess_game">Új sakkjáték</string>
<string name="chess_loading_game">Játék betöltése\u2026</string>
<string name="chess_game_not_found">Nem található játék</string>
<string name="chess_game_waiting">Ez a játék már véget ért, vagy ellenfelet vár.</string>
<string name="chess_game_id">Játékazonosító: %1$s\u2026</string>
<string name="badge_and_n_others"> és %1$d további</string>
<string name="remove_language">%1$s eltávolítása</string>
<!-- Kind display names for relay subscription filter chips -->
<string name="kind_outbox_relays">Kimenő átjátszók</string>
<string name="kind_apps">Alkalmazások</string>
<string name="kind_app_recommendations">Ajánlott alkalmazások </string>
<string name="kind_user_settings">Felhasználói beállítások</string>
<string name="kind_audio_header">Audio-fejléc</string>
<string name="kind_audio_track">Hangsáv</string>
<string name="kind_badge_awards">Jelvénydíjak</string>
<string name="kind_badge_definitions">Jelvények meghatározása</string>
<string name="kind_profile_badges">Profiljelvények</string>
<string name="kind_blocked_relays">Letiltott átjátszók</string>
<string name="kind_blossom_servers">Blossom kiszolgálók</string>
<string name="kind_blossom_auth">Blossom-hitelesítés</string>
<string name="kind_broadcast_relays">Közvetítési átjátszók</string>
<string name="kind_bookmark_list">Könyvjelzőlista</string>
<string name="kind_day_appointment">Napi bejegyzés</string>
</resources>
+12 -12
View File
@@ -419,6 +419,15 @@
<string name="wallet_connect_service_secret">Segredo do Wallet Connect</string>
<string name="wallet_connect_service_show_secret">Mostrar chave secreta</string>
<string name="wallet_connect_service_secret_placeholder">chave privada nsec / hex</string>
<string name="wallet_connect_status_connected">Conectado</string>
<string name="wallet_connect_status_not_connected">Não conectado</string>
<string name="wallet_connect_manual_config">Avançado: inserir detalhes de conexão manualmente</string>
<string name="quick_zap_amounts">Valores Rápidos de Zap</string>
<string name="quick_zap_amounts_explainer">Exibido ao pressionar o botão de zap. Toque em um valor para removê-lo. Se deixar vazio, abrirá o diálogo para inserir um valor todas as vezes.</string>
<string name="zap_privacy_section">Privacidade do Zap</string>
<string name="zap_type_section_explainer">Controla como sua identidade é exibida ao enviar um Zap.</string>
<string name="wallet_connect_connect_app">Conectar Carteira</string>
<string name="see_relay_feed">Ver feed do Relay</string>
<string name="pledge_amount_in_sats">Valor em Sats</string>
<string name="post_poll">Postar enquete</string>
<string name="poll_heading_required">Campos obrigatórios:</string>
@@ -658,6 +667,7 @@
<string name="read_from_relay_description">A quantidade em bytes que foi recebida deste relé, incluindo filtros e eventos</string>
<string name="an_error_occurred_trying_to_get_relay_information">Ocorreu um erro ao tentar obter informações do relay de %1$s</string>
<string name="owner">Proprietário</string>
<string name="used_by">Usado por</string>
<string name="self">Chave de serviço</string>
<string name="running_software">Executando %1$s</string>
<string name="running_software_version">Executando %1$s (%2$s)</string>
@@ -853,6 +863,7 @@
<string name="load_image_description">Quando carregar imagens</string>
<string name="copy_stack_to_clipboard">Copiar a Pilha</string>
<string name="copy_to_clipboard">Copiar para a Área de Transferência</string>
<string name="copy_nprofile_to_clipboard">Copiar nprofile para a área de transferência</string>
<string name="copy_npub_to_clipboard">Copiar npub para a área de transferência</string>
<string name="share_or_save">Compartilhar ou Salvar</string>
<string name="copy_url_to_clipboard">Copiar URL para a área de transferência</string>
@@ -1076,6 +1087,7 @@
<string name="add_content_warning">Adicionar aviso de conteúdo</string>
<string name="remove_content_warning">Remover aviso de conteúdo</string>
<string name="show_npub_as_a_qr_code">Mostrar npub como um código QR</string>
<string name="show_nprofile_as_a_qr_code">Mostrar nprofile como QR code</string>
<string name="invalid_nip19_uri">Endereço inválido</string>
<string name="invalid_nip19_uri_description">O Amethyst recebeu um URI para abrir, mas esse URI era inválido: %1$s</string>
<string name="dm_relays_title">Relés da Caixa de Entrada de DM</string>
@@ -1458,16 +1470,4 @@
<string name="kind_voice_msg">Mensagem de voz</string>
<string name="kind_voice_reply">Resposta de voz</string>
<string name="kind_wiki">Wiki</string>
<string name="see_relay_feed">Ver feed do Relay</string>
<string name="used_by">Usado por</string>
<string name="copy_nprofile_to_clipboard">Copiar nprofile para a área de transferência</string>
<string name="show_nprofile_as_a_qr_code">Mostrar nprofile como QR code</string>
<string name="quick_zap_amounts_explainer">Exibido ao pressionar o botão de zap. Toque em um valor para removê-lo. Se deixar vazio, abrirá o diálogo para inserir um valor todas as vezes.</string>
<string name="wallet_connect_status_connected">Conectado</string>
<string name="wallet_connect_status_not_connected">Não conectado</string>
<string name="wallet_connect_manual_config">Avançado: inserir detalhes de conexão manualmente</string>
<string name="quick_zap_amounts">Valores Rápidos de Zap</string>
<string name="zap_privacy_section">Privacidade do Zap</string>
<string name="zap_type_section_explainer">Controla como sua identidade é exibida ao enviar um Zap.</string>
<string name="wallet_connect_connect_app">Conectar Carteira</string>
</resources>
+12 -12
View File
@@ -419,6 +419,15 @@
<string name="wallet_connect_service_secret">Wallet Connect hemlighet</string>
<string name="wallet_connect_service_show_secret">Visa secret key</string>
<string name="wallet_connect_service_secret_placeholder">nsec / hex privat nyckel</string>
<string name="wallet_connect_status_connected">Ansluten</string>
<string name="wallet_connect_status_not_connected">Inte ansluten</string>
<string name="wallet_connect_manual_config">Avancerat: ange anslutningsinformation manuellt</string>
<string name="quick_zap_amounts">Snabba Zap-belopp</string>
<string name="quick_zap_amounts_explainer">Visas när du trycker på Zap-knappen. Tryck på ett belopp för att ta bort det. Om du lämnar det tomt öppnas en dialog för att ange ett belopp varje gång.</string>
<string name="zap_privacy_section">Zap-sekretess</string>
<string name="zap_type_section_explainer">Styr hur din identitet visas när du skickar ett Zap.</string>
<string name="wallet_connect_connect_app">Anslut plånbok</string>
<string name="see_relay_feed">Visa relä-flöde</string>
<string name="pledge_amount_in_sats">Pantbelopp i Sats</string>
<string name="post_poll">Dela Poll</string>
<string name="poll_heading_required">Obligatoriska fält:</string>
@@ -657,6 +666,7 @@
<string name="read_from_relay_description">Mängden data i byte som mottogs från detta relä, inklusive filter och händelser</string>
<string name="an_error_occurred_trying_to_get_relay_information">Ett fel inträffade vid försök att hämta information från Relay %1$s</string>
<string name="owner">Ägare</string>
<string name="used_by">Används av</string>
<string name="self">Service-nyckel</string>
<string name="running_software">Kör %1$s</string>
<string name="running_software_version">Kör %1$s (%2$s)</string>
@@ -852,6 +862,7 @@
<string name="load_image_description">När bilder ska laddas</string>
<string name="copy_stack_to_clipboard">Kopiera stacken</string>
<string name="copy_to_clipboard">Kopiera till Urklipp</string>
<string name="copy_nprofile_to_clipboard">Kopiera nprofile till urklipp</string>
<string name="copy_npub_to_clipboard">Kopiera npub till urklipp</string>
<string name="share_or_save">Dela eller Spara</string>
<string name="copy_url_to_clipboard">Kopiera URL till urklipp</string>
@@ -1075,6 +1086,7 @@
<string name="add_content_warning">Lägg till varning för innehåll</string>
<string name="remove_content_warning">Ta bort varning för innehåll</string>
<string name="show_npub_as_a_qr_code">Visa npub som en QR-kod</string>
<string name="show_nprofile_as_a_qr_code">Visa nprofile som QR-kod</string>
<string name="invalid_nip19_uri">Ogiltig adress</string>
<string name="invalid_nip19_uri_description">Amethyst fick en URI att öppna men den URI var ogiltig: %1$s</string>
<string name="dm_relays_title">DM Inkorg Reläer</string>
@@ -1457,16 +1469,4 @@
<string name="kind_voice_msg">Röstmeddelande</string>
<string name="kind_voice_reply">Röstsvar</string>
<string name="kind_wiki">Wiki</string>
<string name="see_relay_feed">Visa relä-flöde</string>
<string name="used_by">Används av</string>
<string name="copy_nprofile_to_clipboard">Kopiera nprofile till urklipp</string>
<string name="show_nprofile_as_a_qr_code">Visa nprofile som QR-kod</string>
<string name="quick_zap_amounts_explainer">Visas när du trycker på Zap-knappen. Tryck på ett belopp för att ta bort det. Om du lämnar det tomt öppnas en dialog för att ange ett belopp varje gång.</string>
<string name="wallet_connect_status_connected">Ansluten</string>
<string name="wallet_connect_status_not_connected">Inte ansluten</string>
<string name="wallet_connect_manual_config">Avancerat: ange anslutningsinformation manuellt</string>
<string name="quick_zap_amounts">Snabba Zap-belopp</string>
<string name="zap_privacy_section">Zap-sekretess</string>
<string name="zap_type_section_explainer">Styr hur din identitet visas när du skickar ett Zap.</string>
<string name="wallet_connect_connect_app">Anslut plånbok</string>
</resources>
+1
View File
@@ -170,6 +170,7 @@
<string name="video_saved_to_the_gallery">Video saved to the phone\'s video gallery</string>
<string name="failed_to_save_the_video">Failed to save the video</string>
<string name="upload_image">Upload Image</string>
<string name="upload_file">Upload File</string>
<string name="take_a_picture">Take a picture</string>
<string name="record_a_video">Record a video</string>
<string name="record_a_message">Record a message</string>